Вопрос Чекбоксы с перехватом выбора друг друга

ZVSRus

Участник
@Shegorat, Извиняюсь, при всём уважении к вам и ко всем, кто в данной теме, прошу понять правильно, никого не хочу обидеть и оскорбить. Данный скрипт ничем не отличается от примера что привел Nemko, 1 чекбокс не работает в паре со 2 или 3 чекбоксом.
Выбираешь чекбокс №2 ставится компонент №2. Выбираешь чекбокс №3 ставится компонент №3.
Чекбокс №1 ни какой роли как главный группы не играет.

Изначально вопрос был следующим;
Чтобы понятнее было, их задача состоит в добавлении ключей реестра. Первый (основной) создает пункты в контекстном меню, второй добавляет возможность сделать пункты вложенными, третий добавляет иконки к пунктам меню. Собственно тут задача: если выбирается второй или третий чекбокс, то автоматически выбирается и первый; если снять отметку с первого, то снимаются отметки со второго и(или) третьего. Как такое реализуется в TasksList я уже разобрался, а вот как решить с отдельными чекбосами уже дня два вожусь. Прошу помощи.
Ничего общего с CheckListBox'сом не вижу.
 

AlexS

Новичок
Ничего общего с CheckListBox'сом не вижу
Прошу прощения, может не так выразился... Лично я считаю свои вопросы решенными; так как в теме было предостаточно примеров, среди которых достаточно разных решений(как тут написал Nemko: "можете настроить под себя "); за что большое спасибо ВСЕМ участникам темы.
 

Shegorat

Lord of Madness
Администратор
@Shegorat, Извиняюсь, при всём уважении к вам и ко всем, кто в данной теме, прошу понять правильно, никого не хочу обидеть и оскорбить. Данный скрипт ничем не отличается от примера что привел @Nemko, 1 чекбокс не работает в паре со 2 или 3 чекбоксом.
Я конечно тоже дико извиняюсь, но вы сами то пример запускали, который я скинул?
Там реализована вся эта логика по вложенным чекбоксам, частичному выделению чекбокса и т.д.
Я видел вопрос темы, и скинул пример для разбора, как это можно реализовать для нефиксированного числа элементов.
 

Shegorat

Lord of Madness
Администратор
И в чём визуальное отличие работы?
Вопрос в том, что вы сами неправильно проверяете состояние чекбокса, потому что:
Код:
(Checkbox.State = cbGrayed) <> Checkbox.Checked;
(Checkbox.State = cbGrayed) <> not Checkbox.Checked;
(Checkbox.State = cbChecked) = Checkbox.Checked;
(Checkbox.State = cbUnchecked) = not Checkbox.Checked;
И тогда проверку надо делать так:
Код:
function IsChecked_1: boolean;
begin
    Result:= Comps[0].Box.State <> cbUnchecked;
end;
А в CheckListBox это сделано автоматом.

P.S. Да и вопрос темы был про реализацию на отдельных чекбоксах
 

ZVSRus

Участник
@Shegorat,
И в чём визуальное отличие работы?
А визуальном отличие работы и речь не шла.
Вопрос в том, что вы сами неправильно проверяете состояние чекбокса, потому что:
С данной проверкой:
Код:
function IsChecked_1: boolean;
begin
    Result:= Comps[0].Box.State <> cbUnchecked;
end;
чекбокс заработал как нужно.
Да но и проверку Result:= Comps[0].Box.Checked; я брал не с потолка, а из вашего скрипта

for i:=0 to xComp do begin
WizardForm.ComponentsList.Checked:=Comps.Box.Checked;
end;
end;
Если бы в вашем скрипте где-то увидел Comps.Box.State <> cbUnchecked; то обязательно бы поэкспериментировал.

P.S. Да и вопрос темы был про реализацию на отдельных чекбоксах
Какой вопрос изначально стоял больше спорить не буду, устал.
С исправленной проверкой скрипт стал правильно работать.
Есть еще один вопрос, но это уже завтра. СПАСИБО!
 

Shegorat

Lord of Madness
Администратор
Да но и проверку Result:= Comps[0].Box.Checked; я брал не с потолка, а из вашего скрипта

for i:=0 to xComp do begin
WizardForm.ComponentsList.Checked:=Comps.Box.Checked;
end;
end;
Всё дело в том, что CheckListBox не отдает наружу State, поэтому пришлось указывать только выбранные компоненты, оставляя обработку cbGrayed самому компоненту.
Если бы я там делал привязку к State, как здесь, тогда компонент-лист выбирал бы все подпункты
 

ZVSRus

Участник
@Shegorat, OK! Всё работает правильно, кроме одного маленького нюанса.
Если можно было бы как-то заставить чекбокс №1 работать при снятых флажках на 2 и 3 чекбоксах (1 чекбокс остаётся отмечен), тогда было бы ОДИН В ОДИН как на чеклистбоксе, тогда было бы вообще СУПЕР. Бывают разные задачи применение чекбоксов.

Всё дело в том, что CheckListBox не отдает наружу State, поэтому пришлось указывать только выбранные компоненты, оставляя обработку cbGrayed самому компоненту.
То что State := cbChecked;, State := cbGrayed;, State := cbUnchecked; внутренние параметры, я вьехал в начале темы, может поэтому и пошли не понятные споры.

PS: Если прикрутить в примере от Nemko к 1 чекбоксу проверку:
Код:
function IsChecked_1: boolean;
begin
    Result:= GroupCheckBox[0].State <> cbUnchecked;
end;
тогда чекбоксы тоже работают правильно.
 

ZVSRus

Участник
@AlexS, Ваш последний скрипт с проверкой к 1 чекбоксу:
Код:
function IsChecked_1: boolean;
begin
    Result:= AddToMenu.State <> cbUnchecked;
end;
тоже работает как надо.
 
Сверху