Главная страница
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.066 c
2-1348073809
123456789igor
2012-09-19 20:56
2013.03.22
цикл в цикле


2-1332763409
zvezda
2012-03-26 16:03
2013.03.22
Логин и пароль на БД В Делфи


15-1340712165
картман
2012-06-26 16:02
2013.03.22
кластеризация


2-1345804953
Wadimka
2012-08-24 14:42
2013.03.22
Подскажите можно ли с консольным приложением..


15-1351354654
Дмитрий С
2012-10-27 20:17
2013.03.22
Сортировка папок и файлов наравне. windows 7