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

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

Флаги.


AlexanderMS ©   (2006-08-28 18:29:00) 

Скажите, пожалуйста, как создавать переменные типа флагов (как атрибут файла) и управлять ими? То есть дать на выбор переменные, складывая которые можно получить одну переменную-флаг (например, типа Word) и использовать её, к примеру, в качестве параметра процедуры. И как потом узнать, какие опции включены во флаг, а какие - нет.


Ega23   (2006-08-29 10:24:00) [1]


> begin...end ©   (28.08.06 19:51) [3]


О как... Не знал, что можно так приводить...


Ega23   (2006-08-29 10:22:00) [2]


> Разные люди писали? Как-то чуточку режет глаз.


Писал я. Но очень давно. Переписывать нет желания...  :о)


Virgo_Style   (2006-08-28 21:18:00) [3]

Ega23 ©   (28.08.06 18:31) [1]

Любопытно, кстати, с чем связан разный стиль представления степеней двойки - (1 shr N) - в Set и <константа> - в Get. Разные люди писали? Как-то чуточку режет глаз.


begin...end   (2006-08-28 19:51:00) [4]

> Ega23 ©   (28.08.06 18:31) [1]

Функции можно немного упростить:

function SetFontStyle(const Value: Byte): TFontStyles;
begin
 Result := TFontStyles(Value)
end

function GetFontStyle(const Value: TFontStyles): Byte;
begin
 Result := Byte(Value)
end


:о)))))

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


Ega23   (2006-08-28 18:32:00) [5]

Таким образом, вместо того, чтобы в БД описывать атрибуты фонта четырьмя полями, обходимся одним.


Ega23   (2006-08-28 18:31:00) [6]

Пример:


function SetFontStyle(const Value: integer): TFontStyles;
begin
Result:=[];
if ((Value shr 0) and 1)=1 then Result:=Result+[fsBold];
if ((Value shr 1) and 1)=1 then Result:=Result+[fsItalic];
if ((Value shr 2) and 1)=1 then Result:=Result+[fsUnderline];
if ((Value shr 3) and 1)=1 then Result:=Result+[fsStrikeout];
end;

//******************************************************************************** ***

function GetFontStyle(const Value: TFontStyles): Integer;
begin
Result:=0;
if (fsBold in Value) then Result:=Result or 1;
if (fsItalic in Value) then Result:=Result or 2;
if (fsUnderline in Value) then Result:=Result or 4;
if (fsStrikeout in Value) then Result:=Result or 8;
end;


Наверх

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