Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.58 MB
Время: 0.02 c
3-13562
Radimir
2002-07-16 09:19
2002.08.05
не работает Insert


1-13657
Sub
2002-07-23 14:55
2002.08.05
Общие вопросы


6-13750
petyun
2002-05-20 11:24
2002.08.05
отправка писем из локалки через прокси


1-13679
Denisco
2002-07-22 17:16
2002.08.05
Мне нужно сохранить все изменения в программы в фаил.


14-13777
Александр
2002-07-09 14:09
2002.08.05
Флайт Симулятор от Майкрософт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский