Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

как понять case в описании записи?   Найти похожие ветки 

 
toropoff   (2012-08-21 19:08) [0]

изучаю чужой код, вот встретил:

 TQuadColor = record
   constructor Create(Color : TColor);
   procedure Clear;
   function WrittenByGDI : Boolean;
   procedure SetAlpha(Transparency : Byte; PreMult : Single);
   function AsColorRef : COLORREF;
   procedure SetFromColorRef(Color : COLORREF);

   case Boolean of
     True : (Blue,
             Green,
             Red,
             Alpha : Byte);
     False : (Quad : Cardinal);
 end;

не могу понять что описывают через: "case Boolean of"

как к нему обращаться и в каком случаи это будут байты или DWord?


 
toropoff   (2012-08-21 19:18) [1]

в описании вариантных записей встречается пример:

TFigure = record
X, Y: Integer;
case Kind: Integer of
  0: (Width, Height: Integer); // прямоугольник
  1: (Radius: Integer); // окружность
end;

хоть он попроще для меня, так как понятно что есть какая-то переменная и в зависимости от неё будут соответствующие поля у записи.
но так же не могу понять что такое Kind, где он описан и как это вообще работает, на этапе компиляции или уже в реалтайме могут быть разные поля у записи (хотя бред)


 
bems ©   (2012-08-21 19:25) [2]

На самом деле ты можешь обращаться ко всем полям, но учти что поля из разных вариантов разделяют общую память, поэтому присваивание Blue изменить также Quad

Что касается Kind: Integer, то это само по себе уже описание поля. Автор записи зотел сказать что при поле Kind = 0 будет первый набор полей, а при Kind = 1 - второй. Но следить за этим нужно только вручную - ни компилятор ни рантайм ничего тут для тебя не проверяет

В первом примере case Boolean of поля от которого зависит набор полей нет, просто объявляется два набора полей, разделяющих одну память


 
bems ©   (2012-08-21 19:29) [3]

Кстати, если уж используются записи с методами, то почему бы не сделать вместо
  function AsColorRef : COLORREF;
  procedure SetFromColorRef(Color : COLORREF);
перегруженные операторы неявного приведения?


 
Германн ©   (2012-08-21 19:32) [4]


> в каком случаи это будут байты или DWord?

Они всегда будут и байтами и DWord одновременно.


 
toropoff   (2012-08-21 19:49) [5]

тоесть если рассматриваем TFigure
то выделится память под два Integer;
поле Width и Radius будут ссылаться на одну память как понимаю?
если так, то пока для себя не нашел задачи где было бы это удобно применить ))

>> перегруженные операторы неявного приведения?

почему - не знаю, я ичучаю чужой код :)
_http://code.google.com/p/transparent-canvas/


 
DVM ©   (2012-08-21 20:24) [6]

Память выделяется по максимальному варианту в case. Всегда. Возможно с учетом выравнивания.
Применяется обычно там где один и тот же набор байт удобно трактовать по-разному в зависимости от контекста использования.


 
icWasya ©   (2012-08-22 09:35) [7]

>пока для себя не нашел задачи где было бы это удобно применить
Ну в случае TQuadColor:

var QuadColor:TQuadColor;

QuadColor.Quad := 252716416;

QuadColor.Blue = 128
QuadColor.Green = 37
QuadColor.Red = 16
QuadColor.Alpha = 15



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.063 c
4-1251175537
mamedovvms
2009-08-25 08:45
2013.03.22
Не читает вывод из консоли


15-1337109798
palva
2012-05-15 23:23
2013.03.22
Мы все под колпаком


15-1341124080
Mihaker
2012-07-01 10:28
2013.03.22
Win7 ShellServiceObjectDelayLoad


15-1354259144
Mikishanya
2012-11-30 11:05
2013.03.22
элемент selec с javascript


2-1330496040
Cobalt
2012-02-29 10:14
2013.03.22
Char в D2010