Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
1

переполнение стека!

30.08.2011, 21:07. Показов 2183. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
вот код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.CheckBox7Click(Sender: TObject);
begin
if checkbox7.Checked=false then
begin
checkbox1.Checked:=true;
checkbox2.Checked:=true;
checkbox3.Checked:=true;
checkbox4.Checked:=true;
checkbox5.Checked:=true;
checkbox6.Checked:=true;
checkbox7.Checked:=true;
exit;
end;
if checkbox7.Checked=true then
begin
checkbox1.Checked:=false;
checkbox2.Checked:=false;
checkbox3.Checked:=false;
checkbox4.Checked:=false;
checkbox5.Checked:=false;
checkbox6.Checked:=false;
checkbox7.Checked:=false;
end;
 
 
end;
если уберу первый if,то все окей,но если с ним,то ошибка:переполнение стека
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2011, 21:07
Ответы с готовыми решениями:

переполнение стека
Помогите довести программу до ума. Все, что я могла с ней сделать - я уже сотворила. В...

Переполнение стека
Вот пробую писать программку по поиску в реестре битых ссылок на файлы но столкнулся с такой...

Переполнение стека
Добрый вечер)пытаюсь написать программу, но возникла ошибка с переполнением стека в данной...

переполнение стека
Здравствуйте. Пишу пару программ, они постепенно развивались, вместе с моими познаниями. Много...

5
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
30.08.2011, 21:28 2
А что Вы хотите получить? Если Вы кликаете на CheckBox, то сразу checkbox7.Checked=true и никогда не будет false. Может это лучше на кнопку повесить?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.Button1Click(Sender: TObject);
begin
if checkbox7.Checked=false then
begin
checkbox1.Checked:=true;
checkbox2.Checked:=true;
checkbox3.Checked:=true;
checkbox4.Checked:=true;
checkbox5.Checked:=true;
checkbox6.Checked:=true;
checkbox7.Checked:=true;
exit;//это для чего?
end
else
begin
checkbox1.Checked:=false;
checkbox2.Checked:=false;
checkbox3.Checked:=false;
checkbox4.Checked:=false;
checkbox5.Checked:=false;
checkbox6.Checked:=false;
checkbox7.Checked:=false;
end;
end;
0
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
30.08.2011, 21:30 3
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.CheckBox7Click(Sender: TObject);
begin
checkbox1.Checked:=not checkbox7.Checked;
checkbox2.Checked:=not checkbox7.Checked;
checkbox3.Checked:=not checkbox7.Checked;
checkbox4.Checked:=not checkbox7.Checked;
checkbox5.Checked:=not checkbox7.Checked;
checkbox6.Checked:=not checkbox7.Checked;
end;
1
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
30.08.2011, 23:29 4
Цитата Сообщение от spydark91 Посмотреть сообщение
если уберу первый if,то все окей,но если с ним,то ошибка:переполнение стека
Это происходит из-за рекурсивного зацикливания. В обработчике события OnClick: CheckBox7Click() происходит присваивание:
Delphi
1
CheckBox7.Checked := True;
Это приводит к тому, что опять возникает событие OnClick и, соответственно, опять вызывается обработчик CheckBox7Click(). Этот обработчик опять выполняет строку:
Delphi
1
CheckBox7.Checked := True; //или CheckBox7.Checked := False;
и это опять приводит к возникновению события OnClick. Т. е. обработчик CheckBox7Click() вызывает сам себя и так продолжается до тех пор, пока не переполнится стек. - Это приводит к возникновению исключения.
Вот последовательность вызовов:
CheckBox7Click() -> CheckBox7.Checked := True; -> SetChecked():
Delphi
1
2
3
4
procedure TCustomCheckBox.SetChecked(Value: Boolean);
begin
  if Value then State := cbChecked else State := cbUnchecked;
end;
State := ... -> SetState():
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
  if FState <> Value then
  begin
    FState := Value;
    if HandleAllocated then
      SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
    
    //Внимание! Причина здесь.
    if not ClicksDisabled then Click;
 
  end;
end;
-> Click() -> OnClick -> и поять происходит вызов CheckBox7Click(). - Произошло рекурсивное зацикливание.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
30.08.2011, 23:37  [ТС] 5
проблему уже решил,но всеравно
у меня там стоял exit для выхода их процедыры\.дабы избежать рекурсии
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
30.08.2011, 23:42 6
Цитата Сообщение от spydark91 Посмотреть сообщение
у меня там стоял exit для выхода их процедыры\.дабы избежать рекурсии
Рекурсия возникает на строке: checkbox7.Checked:=true;, а Exit; расположен после этой строки. Поэтому Exit никаким образом не спасал от рекурсии:
Delphi
1
2
3
4
...
  checkbox7.Checked:=true; //Здесь возникает рекурсия.
  exit; //Эта строка не выполняется, т. к., программа зацикливается на предыдущей строке.
...
1
30.08.2011, 23:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2011, 23:42
Помогаю со студенческими работами здесь

Ошибка: Переполнение стека
Помогите разобраться непойму в чем дело! Выдает ошибку Переполнение стека! Вот прога моя! В...

Переполнение стека. Модуль
Требуется написать программу вывода таблицы функции, которую оформить в виде процедуры. Функций...

Задан указатель P1 на вершину непустого стека. Создать два новых стека
Добрый вечер, у меня возникла проблемка с такой программкой. Вывести в компонент Label. ...

Стек: Переместить все элементы из первого стека во второй и вывести адрес новой вершины стека
Даны указатели P1 и P2 на вершины двух непустых стеков. Переместить все элементы из первого стека...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru