Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];




Вниз

Создание множества 


Satirus   (2002-04-18 23:19) [0]

Вопрос такой:
У меня есть 13 чекбоксов, которые находятся в GroupBox"e
У каждого есть своё название, которое совпадает с одним из возможных значений определенного типа TdomWhatToShow, который определен как TdomWhatToShow = set of TdomNodeType;
то есть является множеством. На форме других чекбоксов нет, тоесть можно проверять тип компонента и если он TCheckBox, то добавлять к нему (если отмечен) или отнимать из опредаляемого множества если не отмечен. Предложите наиболее оптимальный алгоритм/решение.
Вот наброски
var nodeFilter:TdomWhatToShow = [];
procedure SomeCheckBoxOnClick(Sender:TObject);
begin
if Sender is TCheckBox then
if sender.checked then nodeFilter:=nodeFilter + TdomWhatToShow (sender.Caption)
else nodeFilter:=nodeFilter-TdomWhatToShow(sender.Caption);
end;

но это немного не работает...



kull   (2002-04-19 00:16) [1]

Нет! Строку привести к множеству это черезчур...
И потом sender.checked, мне кажется, сразу не работает.

Можно через таги попробовать типа

TdomWhatToShow(TCheckBox(sender).Tag), но это тоже некрасиво...



kull   (2002-04-19 00:19) [2]

Т.е. в каждый таг предварительно записать значение соответствующего элемента множества: Tag := Integer(элемент)



Satirus   (2002-04-19 13:35) [3]

kull-> Ну а как быть с обработчиком?... А элементы ты имеешь ввиду значения типа TdomWhatToShow?



Satirus   (2002-04-19 14:06) [4]

Вот работает таким макаром
if (Sender is TCheckBox) and
(TCheckBox(Sender).Checked) then edit3.Text:=TCheckBox(sender).Caption;
Теперь осталось лишь произвести приведение к другому типу, и вот с этим-то какраз и неувязочка...
То есть

var nodeFilter:TdomWhatToShow = [];
...
TdomWhatToShow = set of TdomNodeType;
TdomNodeType = = (ntUnknown,
ntElement_Node,
ntAttribute_Node,
ntText_Node,
ntCDATA_Section_Node,
ntEntity_Reference_Node,
ntEntity_Node,
ntProcessing_Instruction_Node,
ntComment_Node,
ntDocument_Node,
ntDocument_Type_Node,
ntDocument_Fragment_Node,
ntNotation_Node);

Каждый чекбокс называется как одно из значений типа.
Вопрос, к какому из типов производить приведение: к TdomWhatToShow или к TdomNodeType.
Но если переменная типа TdomWhatToShow, то при приведении к TdomNodeType получается Invalid typecast.



Бурундук   (2002-04-19 14:09) [5]

Установка тэгов в значения, соответствующие заголовкам:
(uses TypInfo)

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
dnt: Integer; //TdomNodeType;
begin
for i := 0 to ComponentCount-1 do
begin
if Components[i] is TCheckBox then
dnt := GetEnumValue(TypeInfo(TdomNodeType),
TCheckBox(Components[i]).Caption);
if dnt <> -1 then Components[i].Tag := dnt;
end;
end;

Обработчик:

var
GlobalSet: TdomWhatToShow; // или что у тебя там

procedure TForm1.CheckBox1Click(Sender: TObject);
var dnt: Integer;
begin
dnt := (Sender as TComponent).Tag;
if (Sender as TCheckBox).Checked then
Include(GlobalSet, TdomNodeType(dnt))
else
Exclude(GlobalSet, TdomNodeType(dnt)) ;
end;



Satirus   (2002-04-19 16:35) [6]

Бурундук-> Спасибо за код. Он мне оказался очень кстати




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.015 c
1-2600            Евгений-Зеленоград    2002-04-20 01:07  2002.05.02  
Размер кода?


1-2511            Anton+                2002-04-20 20:17  2002.05.02  
Как определить координаты курсора при движении и нажатии мышью?


3-2474            sashag                2002-04-10 13:35  2002.05.02  
Траблы со чтением конечных пробелов из строкового поля


4-2718            fddiynic              2002-02-28 15:24  2002.05.02  
спец папки


3-2478            Донской               2002-04-11 11:14  2002.05.02  
Лишнее?