Форум: "Начинающим";
Текущий архив: 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.46 MB
Время: 0.067 c