Форум: "Основная";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
ВнизПереполнение стека из-за 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c