|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Оператор case в описании record'а
Нашел намедни на просторах сети такой вот код:
Код:
type TVarRec = record Data: record case Integer of 0: (L: LongInt); 1: (B: Boolean); 2: (C: Char); 3: (E: ^Extended); 4: (S: ^string); 5: (P: Pointer); 6: (X: PChar); 7: (O: TObject); end; Tag: Byte; Stuff: array[0..2] of Byte; end; function PtrToStr(P: Pointer): string; const HexChar: array[0..15] of Char = '0123456789ABCDEF'; function HexByte(B: Byte): string; begin Result := HexChar[B shr 4] + HexChar[B and 15]; end; function HexWord(W: Word): string; begin Result := HexByte(Hi(W)) + HexByte(Lo(W)); end; begin Result := HexWord(HiWord(LongInt(P))) + ':' + HexWord(LoWord(LongInt(P))); end; procedure Display(X: array of const); var I: Integer; begin for I := 0 to High(X) do with TVarRec(X[i]), Data do begin case Tag of 0: ShowMessage('Integer: ' + IntToStr(L)); 1: if B then ShowMessage('Boolean: True') else ShowMessage('Boolean: False'); 2: ShowMessage('Char: ' + C); 3: ShowMessage('Float: ' + FloatToStr(E^)); 4: ShowMessage('String: ' + S^); 5: ShowMessage('Pointer: ' + PtrToStr(P)); 6: ShowMessage('PChar: ' + StrPas(X)); 7: ShowMessage('Object: ' + O.ClassName); end; end; end; procedure TForm1.Button1Click(Sender: TObject); var P: array[0..5] of Char; begin P := 'Привет'; Display([-12345678, True, 'A', 1.2345, 'ABC', Ptr($1234, $5678), P, Form1]); end; И никак не могу понять, что заставляет код работать. Ну вопервых, что за оператор case в описании record'a Во вторых, почему Tag автоматически становится равен номеру типа данных в описании этого record'a И в третьих почему перед Extended и String ставится знак ^ Да и еще, никогда не сталкивался с таким вариантом with Код:
with TVarRec(X[i]), Data do Короче совсем у меня крыша едет, объясните плиз что к чему, или хотябы дайте ссылки по теме |
#2
|
||||
|
||||
Есть очень замечательно описание всего этого в справке по Delphi, см. Variant parts in records, With statements и сразу все поймешь.
|
#3
|
|||
|
|||
Tnx немного полегчало =)
|