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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.02.2007, 10:31
Ur@nium Ur@nium вне форума
Прохожий
 
Регистрация: 02.02.2007
Сообщения: 2
Репутация: 10
По умолчанию Оператор 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 
C запятой, да еще и получаем готовенький TVarRec из константы

Короче совсем у меня крыша едет, объясните плиз что к чему, или хотябы дайте ссылки по теме
Ответить с цитированием
  #2  
Старый 02.02.2007, 10:58
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия 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, время: 20:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter