Форум: "Основная";
Текущий архив: 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]Бурундук-> Спасибо за код. Он мне оказался очень кстати
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c