Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переполнение стека из-за CheckBox а! [D6, Win95/98]


GydruS ©   (2002-07-24 08:25:00) 

Здравствуйте ещё раз. :) Давно интересует меня такая штука: Если сделать в программе CheckBox1.checked := not CheckBox1.Checked; то она вылетает с переполнением стека. При клике мышкой по компоненту - всё ок! Но как тогда синхронизовывать управление двумя элементами? Например экземплярами TCheckBox и TMuenuItem? При нажатии на чекбокс межно менять св-во Checked экземпляря TMuenuItem. А наобораот нельзя! Использование Action"а не спасает. :( Подскажите, пожалуйста, как быть!


Юрий Зотов   (2002-07-24 13:51:00) [1]

> Красивое решение

А что в нем уж такого красивого? Обычный и совершенно стандартный способ блокировки рекурсии. Кстати, для подобных вещей совсем не лишним бывает блок try-finally.


Alex4444444444   (2002-07-24 10:55:00) [2]

2 Gydrus: Krasivoe, no, pozhaluy, edinstvennoe. Izmenenie Checkbox.Checked vyzyvaet OnClick. Idiotizm, no fact. Tak chto,
recursia neizbezhna. Nuzhno sdelat" kakoj-nibud" flag. (Naprimer,
na vhode v OnClick proveryat" CheckBox.Tag; esli ne nol", to
vyhod, a esli nol", to postavit" 1, sdelat" vse, a potom opyat" nol".) Drugoj vopros, zachem chekat" menu?


procedure MenuItem.OnClick(Sender: TObject);
begin
CheckBox.Checked := not CheckBox.Checked;
end;

procedure PopupMenu.OnPopup(Sender: TObject);
// Esli eto v MainMenu, to mozhno povesit" na ParentItem.OnClick
begin
MenuItem.Checked := CheckBox.Checked;
end;


Opuhshii   (2002-07-24 10:35:00) [3]

>"Тогда задача ставится к определению на ком кликнули"
на то существует Sender


GydruS   (2002-07-24 09:52:00) [4]

2 Builder: Красивое решение! :))


GydruS   (2002-07-24 09:51:00) [5]

Thanks a lot! It is working good! :)

2 Юрий Зотов:
>>А если Action не используется, то тоже пишется ОДИН обработчик...
По началу я один обработчик и писал. И это закончилось нехорошо.
OnClick CheckBox"а сам автоматом меняет св-во Checked. А вот OnClick MenuItem"а этого не делает. Тогда задача ставится к определению на ком кликнули. Итак - меняем Checked MenuItem"у и, если кликнули не на CheckBox, тогда меняем Cheked и CheckBox"у.
но получаем... ГЛЮКИ. Эх-х-х. Вот почему так?
Ну да в общем то с ActionList.Checked всё пошло. :) Спасибо!


Builder   (2002-07-24 09:41:00) [6]

Var
store : TNotifyEvent;
Begin
store := ProxyCheckBox.OnClick;
ProxyCheckBox.OnClick := Nil;
ProxyCheckBox.Checked := not ProxyCheckBox.Checked;
ProxyCheckBox.OnClick := store;
end;

:)


Юрий Зотов   (2002-07-24 09:24:00) [7]

Дык... зачем же Вы вешаете ВСЕ обработчики разом? Они же влияют друг на друга, поэтому все и глючит. И запросто могут инициировать вызовы друг друга - отсюда и бесконечная рекурсия со Stack Overflow.

Если используется Action, то в Инспекторе Объектов надо прицепить один и тот же Action и к CheckBox, и к MenuItem, написать всего ОДИН обработчик и повесить его ТОЛЬКО на Action.Execute (на MenuItem.OnClick и CheckBox.OnClick уже НИЧЕГО вешать не нужно). В этом случае обработчик должен переключать ТОЛЬКО Action.Checked, но ни в коем случае не трогать MenuItem.Checked и CheckBox.Checked (они переключатся сами). Иначе может возникнуть рекурсия

А если Action не используется, то тоже пишется ОДИН обработчик, который сажается и на MenuItem.OnClick, и на CheckBox.OnClick.В этом случае обработчик должен одновременно переключать MenuItem.Checked и CheckBox.Checked.


MBo   (2002-07-24 09:18:00) [8]

ну хочешь с Action - связал пункт меню и checkbox с Action1 и
весь код здесь:

procedure TForm1.Action1Execute(Sender: TObject);
begin
action1.checked:=not action1.checked;
end;

больше ничего не надо!


GydruS   (2002-07-24 09:03:00) [9]

О ужас!!! Такого я ещё не видел! Action привязан к MenuItem! и при нажатии на менюитем"е... ну там значения меняются не с первого раза! Может я уже глючу?

procedure TForm1.IgnoreRepeatingValuesActoin1Execute(Sender: TObject);
begin
IgnoreRepeatingValues1.Checked := not IgnoreRepeatingValues1.Checked;
IgnoreRepeatingValuesCheckBox.Checked := IgnoreRepeatingValues1.Checked;
end;

procedure TForm1.IgnoreRepeatingValuesCheckBoxClick(Sender: TObject);
begin
IgnoreRepeatingValues1.Checked := not IgnoreRepeatingValues1.Checked;
end;


а при
procedure TForm1.IgnoreRepeatingValuesCheckBoxClick(Sender: TObject);
begin
IgnoreRepeatingValuesCheckBox.Checked := not IgnoreRepeatingValues1.Checked;
end;

тоже глюки нездоровые!! :(


MBo   (2002-07-24 08:39:00) [10]

работает же
procedure TForm1.N1111Click(Sender: TObject);
begin
n1111.Checked:=not n1111.Checked;
checkbox1.checked:=n1111.Checked;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
n1111.checked:=checkbox1.checked;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо