Показать полную графическую версию : Как отключить все Checkbox'ы на форме?
У меня на форме стоит около 800 Chekbox'ов - вопрос,как можно отключить их по нажатию одной кнопки?
Сперва пошел обычным путем,каждый чекбокс писал отдельно и уже через 20 чекбоксов мне это начало надоедать.Подкините мне функцию для снятия и для включения этих чекбоксов ?! А то 800 строчек да и еще писать одно и тоже,это уже перебор
DillerInc
06-06-2009, 13:16
А то 800 строчек да и еще писать одно и тоже,это уже перебор »
...а 800 чекбоксов не перебор? :)
Мне на ум приходит только вариант,если идентификаторы ваших чекбоксов прописать таким образом,чтобы все их можно было перебрать простым инкрементом в цикле.Тогда в цикле можно вызывать GetDlgItem и SendMessage с параметрами BM_SETCHECK, BST_UNCHECKED,и после делать инкремент идентификатора,тем самым переходя на следующий контрол.
ADD.
Сейчас подумал,что можно поиграться с функцией FindWindowEx,и возможно это даст результат(неуверен,ибо сам не пробовал).
Второй параметр функции - hwndChildAfter: Handle to a child window. The search begins with the next child window in the Z order.
Это значит,что можно сперва вне цикла получить описатель первого чекбокса,сделать с ним всё,что нужно,а потом войти в цикл и начать вызывать ту же FindWindowEx,передавая ей в качестве второго параметра возращённый ею же результат.Каждый раз.
Однако повторю,что это не проверено мною на практике,поэтому может быть ошибочным.
если идентификаторы ваших чекбоксов прописать таким образом,чтобы все их можно было перебрать простым инкрементом в цикле.Тогда в цикле можно вызывать GetDlgItem и SendMessage с параметрами BM_SETCHECK, BST_UNCHECKED,и после делать инкремент идентификатора,тем самым переходя на следующий контрол. »
таким же успехом можно подумать и о тегах <TAG>. А как вы в цикле тогда обозначите типы идентификаторов?
Я думаю здесь все дело в массивах - просто тип массива выдает ошибку
я сегодня пробовал так
finctuion UncheckedAll (Unchecked:Tcheckbox):tcheckbox;
var
Unchecked:Array of Array [1..800] of TCheckbox;
дальше не мыслью как ...
DillerInc
06-06-2009, 22:26
R.M.L, Дельфя затуманила ваш разум.Бросайте её как можно скорее.Серьёзно.
Моя догадка насчёт функции FindWindowEx похоже оказалась верной.Прилагаю свой исходник на ассемблере и скомпилированный файл.Изучайте.
Дельфя затуманила ваш разум. »
Ну зачем так сразу критично... :)
Мне она нравится, но о вкусах не спорят... Я конечно понимаю, что асм как библия для программирования, но пока для меня это как высшая математика... :)
У меня на форме стоит около 800 Chekbox'ов - вопрос,как можно отключить их по нажатию одной кнопки? »
Очень просто...
unit Unit1;
interface
uses
Classes,
Controls,
Forms,
StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
chk1: TCheckBox;
chk2: TCheckBox;
chk3: TCheckBox;
chk4: TCheckBox;
chk5: TCheckBox;
chk6: TCheckBox;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
i: integer;
begin
// Перебираем чекбоксы на форме
for i:= 1 to ComponentCount - 1 do
if (Components[i] is TCheckBox) and (Components[i] as TCheckBox).Checked then
(Components[i] as TCheckBox).Checked:= False;
end;
end.
Дельфя затуманила ваш разум.Бросайте её как можно скорее.Серьёзно. »
Да ну )) вы думаете у Ассемблеристов никогда не возникает подобных головоломок?!
Я из вашего кода понял только вызов библиотек и переменные на чекбоксы.Остальное как ежик в тумане :))
Очень просто...
Пример снятия отметки с чекбоксов... »
СПАСИБО БОЛЬШОЕ +10
Я не программист и работаю совсем в иной сфере,вот и время от времени у меня возникают такие вопросы на которых у меня нет хоть 30 процентного ответа.Честно скажу,такой метод я бы никогда не узнал если не ваш исходник.Мой друган с первого звонка че та намикал про циклы While Repeat то я искал выход через массив обектов.Ок спасибо , отальное доделаю сам - на первом чекб. галочка осталась.
на первом чекб. галочка осталась. »
надо исправить с i:=1 на i:=0
DillerInc
07-06-2009, 11:58
Да ну )) вы думаете у Ассемблеристов никогда не возникает подобных головоломок?! »
...язык тут не при чём.Здесь главное понимать основные принципы.Хотя бы то,что есть только три основных типа данных: байт,слово и двойное слово.
Я из вашего кода понял только вызов библиотек и переменные на чекбоксы. »
...мой код построен на вызове WinAPI-функции FindWindowEx,которая перебирает дочерние окна родителя.И далее идёт обработка результатов этой функции.Всё очень просто.
Я не программист и работаю совсем в иной сфере »
...я тоже ;)
...я тоже »
это уже слишком :)))
надо исправить с i:=1 на i:=0 »
даа я так и сделал спасибо вам ( вы у меня уже в списке скорой помощи,если еще возникнут у меня вопросы то я от вас не отстану :))) учтите
если еще возникнут у меня вопросы то я от вас не отстану )) учтите »
не напугаете... ;)
Я не программист и работаю совсем в иной сфере »
...я тоже »
ну и я... по образованию инженер-механик и работаю в строительной конторе по профессии... :)
mozgabyte,
вы создайте, свою тему, больше шансов получить помощь... ;)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.