Главная страница
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.049 c
2-1333633351
Jimmy
2012-04-05 17:42
2013.03.22
Как правильно отобразить картинку с полупрозрачными пикселями?


15-1342183148
yorik_spb
2012-07-13 16:39
2013.03.22
Организации требуется - старший программист (Delphi+M SSQL)


2-1333910862
neverush
2012-04-08 22:47
2013.03.22
JvRichEdit unicode


15-1337160836
Инокентий
2012-05-16 13:33
2013.03.22
Как получить почту с гугла 3 людям?


15-1353484275
RWolf
2012-11-21 11:51
2013.03.22
TVirtualStringTree, баг отрисовки