Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

как понять 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.098 c
15-1342014916
Zilog
2012-07-11 17:55
2013.03.22
дааа, а раньше форум кпиел


15-1350918593
Artem
2012-10-22 19:09
2013.03.22
Как защититься? Не очень разбираюсь.


2-1333615730
Yl2011
2012-04-05 12:48
2013.03.22
Использование TCanvas для определения размера шрифта


4-1258539915
ТЧеловек
2009-11-18 13:25
2013.03.22
callback для регулировки громкости


15-1352901277
ЕщеОдинКакжеНадоели
2012-11-14 17:54
2013.03.22
Удалить кусок текста.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский