Войти

Показать полную графическую версию : Как отключить все Checkbox'ы на форме?


R.M.L
06-06-2009, 00:09
У меня на форме стоит около 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,передавая ей в качестве второго параметра возращённый ею же результат.Каждый раз.
Однако повторю,что это не проверено мною на практике,поэтому может быть ошибочным.

R.M.L
06-06-2009, 16:22
если идентификаторы ваших чекбоксов прописать таким образом,чтобы все их можно было перебрать простым инкрементом в цикле.Тогда в цикле можно вызывать 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 похоже оказалась верной.Прилагаю свой исходник на ассемблере и скомпилированный файл.Изучайте.

Serega
07-06-2009, 00:43
Дельфя затуманила ваш разум. »
Ну зачем так сразу критично... :)
Мне она нравится, но о вкусах не спорят... Я конечно понимаю, что асм как библия для программирования, но пока для меня это как высшая математика... :)
У меня на форме стоит около 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.

R.M.L
07-06-2009, 07:19
Дельфя затуманила ваш разум.Бросайте её как можно скорее.Серьёзно. »
Да ну )) вы думаете у Ассемблеристов никогда не возникает подобных головоломок?!
Я из вашего кода понял только вызов библиотек и переменные на чекбоксы.Остальное как ежик в тумане :))


Очень просто...
Пример снятия отметки с чекбоксов... »
СПАСИБО БОЛЬШОЕ +10
Я не программист и работаю совсем в иной сфере,вот и время от времени у меня возникают такие вопросы на которых у меня нет хоть 30 процентного ответа.Честно скажу,такой метод я бы никогда не узнал если не ваш исходник.Мой друган с первого звонка че та намикал про циклы While Repeat то я искал выход через массив обектов.Ок спасибо , отальное доделаю сам - на первом чекб. галочка осталась.

Serega
07-06-2009, 07:38
на первом чекб. галочка осталась. »
надо исправить с i:=1 на i:=0

DillerInc
07-06-2009, 11:58
Да ну )) вы думаете у Ассемблеристов никогда не возникает подобных головоломок?! »
...язык тут не при чём.Здесь главное понимать основные принципы.Хотя бы то,что есть только три основных типа данных: байт,слово и двойное слово.
Я из вашего кода понял только вызов библиотек и переменные на чекбоксы. »
...мой код построен на вызове WinAPI-функции FindWindowEx,которая перебирает дочерние окна родителя.И далее идёт обработка результатов этой функции.Всё очень просто.
Я не программист и работаю совсем в иной сфере »
...я тоже ;)

R.M.L
07-06-2009, 21:44
...я тоже »
это уже слишком :)))

надо исправить с i:=1 на i:=0 »
даа я так и сделал спасибо вам ( вы у меня уже в списке скорой помощи,если еще возникнут у меня вопросы то я от вас не отстану :))) учтите

Serega
08-06-2009, 00:59
если еще возникнут у меня вопросы то я от вас не отстану )) учтите »
не напугаете... ;)
Я не программист и работаю совсем в иной сфере »
...я тоже »
ну и я... по образованию инженер-механик и работаю в строительной конторе по профессии... :)

mozgabyte,
вы создайте, свою тему, больше шансов получить помощь... ;)




© OSzone.net 2001-2012