Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.05;
Скачать: CL | DM;

Вниз

Переполнение стека из-за CheckBox а!   Найти похожие ветки 

 
GydruS ©   (2002-07-24 08:25) [0]

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


 
MBo ©   (2002-07-24 08:39) [1]

работает же
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;


 
GydruS ©   (2002-07-24 09:03) [2]

О ужас!!! Такого я ещё не видел! 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 09:18) [3]

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

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

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


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

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


 
Builder ©   (2002-07-24 09:41) [5]

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

:)


 
GydruS ©   (2002-07-24 09:51) [6]

Thanks a lot! It is working good! :)

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


 
GydruS ©   (2002-07-24 09:52) [7]

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


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

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


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

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;


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
3-13532
Tenger
2002-07-14 09:32
2002.08.05
РАЗДЕЛИТЕЛЬ ОПЕРАТОРОВ В SQL


3-13570
AlexSV
2002-07-15 16:20
2002.08.05
DB


1-13597
Kolya
2002-07-22 21:29
2002.08.05
Pause Process


4-13858
Nubie
2002-05-30 05:19
2002.08.05
Как загрузить ЕХЕ в память?


1-13696
ProfiUgl
2002-07-24 09:13
2002.08.05
Обращение из формы к компанентам расположенным на MDIChild форме