Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как понять case в описании записи?


toropoff ©   (2012-08-21 19:08:00) 

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

 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?


icWasya   (2012-08-22 09:35:00) [1]

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

var QuadColor:TQuadColor;

QuadColor.Quad := 252716416;

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


DVM   (2012-08-21 20:24:00) [2]

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


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

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

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

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


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


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

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


bems   (2012-08-21 19:29:00) [5]

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


bems   (2012-08-21 19:25:00) [6]

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

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

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


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

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо