Форум: "Основная";
Поиск по всему сайту: 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.73 MB
Время: 0.017 c
14-2671           ProgMan               2002-03-27 15:08  2002.05.02  
D6 Warning:


6-2628            knyaz17               2002-02-15 16:53  2002.05.02  
КАК Загрузить в WebBrowser из потока файл *.MHT???


1-2536            55555                 2002-04-18 11:12  2002.05.02  
форма


3-2489            Николай Бондаренко    2002-04-11 12:15  2002.05.02  
ADO и Oracle (как ускорить установление соединения с БД)


1-2521            ah                    2002-04-21 13:55  2002.05.02  
каждый раз как переустанавливаю Винды забываю как