Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.02;
Скачать: CL | DM;

Вниз

Создание множества   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
1-2617
Афоня
2002-04-18 13:31
2002.05.02
Как создать калькулятор


4-2721
alexey1
2002-02-27 12:41
2002.05.02
WIN API


3-2458
vladimirb
2002-04-10 16:38
2002.05.02
Проблема с BDE!!! Дает ошибку в CGI. Help me, please!!!


6-2643
SerfX
2002-02-16 14:46
2002.05.02
Какими ф-ми в clx библиотеке можно обратиться к канальному уровню?


3-2465
Tolstomordik
2002-04-11 10:00
2002.05.02
Сохранение результатов SQL-запроса во внешний файл.