Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.02.2007, 10:31
Ur@nium Ur@nium вне форума
Прохожий
 
Регистрация: 02.02.2007
Сообщения: 2
Репутация: 10
По умолчанию Оператор case в описании record'а

Нашел намедни на просторах сети такой вот код:


Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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

Код:
1
with TVarRec(X[i]), Data do
C запятой, да еще и получаем готовенький TVarRec из константы

Короче совсем у меня крыша едет, объясните плиз что к чему, или хотябы дайте ссылки по теме
Ответить с цитированием
  #2  
Старый 02.02.2007, 10:58
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Есть очень замечательно описание всего этого в справке по Delphi, см. Variant parts in records, With statements и сразу все поймешь.
Ответить с цитированием
  #3  
Старый 02.02.2007, 11:29
Ur@nium Ur@nium вне форума
Прохожий
 
Регистрация: 02.02.2007
Сообщения: 2
Репутация: 10
Радость

Tnx немного полегчало =)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:34.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025