Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как отключить все Checkbox'ы на форме? (http://forum.oszone.net/showthread.php?t=141994)

R.M.L 06-06-2009 00:09 1136317

Как отключить все Checkbox'ы на форме?
 
У меня на форме стоит около 800 Chekbox'ов - вопрос,как можно отключить их по нажатию одной кнопки?
Сперва пошел обычным путем,каждый чекбокс писал отдельно и уже через 20 чекбоксов мне это начало надоедать.Подкините мне функцию для снятия и для включения этих чекбоксов ?! А то 800 строчек да и еще писать одно и тоже,это уже перебор

DillerInc 06-06-2009 13:16 1136597

Цитата:

Цитата R.M.L
А то 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 1136726

Цитата:

Цитата DillerInc
если идентификаторы ваших чекбоксов прописать таким образом,чтобы все их можно было перебрать простым инкрементом в цикле.Тогда в цикле можно вызывать 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 1136989

Вложений: 1
R.M.L, Дельфя затуманила ваш разум.Бросайте её как можно скорее.Серьёзно.

Моя догадка насчёт функции FindWindowEx похоже оказалась верной.Прилагаю свой исходник на ассемблере и скомпилированный файл.Изучайте.

Serega 07-06-2009 00:43 1137083

Цитата:

Цитата DillerInc
Дельфя затуманила ваш разум. »

Ну зачем так сразу критично... :)
Мне она нравится, но о вкусах не спорят... Я конечно понимаю, что асм как библия для программирования, но пока для меня это как высшая математика... :)
Цитата:

Цитата R.M.L
У меня на форме стоит около 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 1137184

Цитата:

Цитата DillerInc
Дельфя затуманила ваш разум.Бросайте её как можно скорее.Серьёзно. »

Да ну )) вы думаете у Ассемблеристов никогда не возникает подобных головоломок?!
Я из вашего кода понял только вызов библиотек и переменные на чекбоксы.Остальное как ежик в тумане :))


Цитата:

Цитата Serega
Очень просто...
Пример снятия отметки с чекбоксов... »

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

Serega 07-06-2009 07:38 1137189

Цитата:

Цитата R.M.L
на первом чекб. галочка осталась. »

надо исправить с i:=1 на i:=0

DillerInc 07-06-2009 11:58 1137277

Цитата:

Цитата R.M.L
Да ну )) вы думаете у Ассемблеристов никогда не возникает подобных головоломок?! »

...язык тут не при чём.Здесь главное понимать основные принципы.Хотя бы то,что есть только три основных типа данных: байт,слово и двойное слово.
Цитата:

Цитата R.M.L
Я из вашего кода понял только вызов библиотек и переменные на чекбоксы. »

...мой код построен на вызове WinAPI-функции FindWindowEx,которая перебирает дочерние окна родителя.И далее идёт обработка результатов этой функции.Всё очень просто.
Цитата:

Цитата R.M.L
Я не программист и работаю совсем в иной сфере »

...я тоже ;)

R.M.L 07-06-2009 21:44 1137712

Цитата:

Цитата DillerInc
...я тоже »

это уже слишком :)))

Цитата:

Цитата Serega
надо исправить с i:=1 на i:=0 »

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

Serega 08-06-2009 00:59 1137873

Цитата:

Цитата R.M.L
если еще возникнут у меня вопросы то я от вас не отстану )) учтите »

не напугаете... ;)
Цитата:

Цитата R.M.L
Я не программист и работаю совсем в иной сфере »

Цитата:

Цитата DillerInc
...я тоже »

ну и я... по образованию инженер-механик и работаю в строительной конторе по профессии... :)

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


Время: 10:06.

Время: 10:06.
© OSzone.net 2001-