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

Вниз

Error   Найти похожие ветки 

 
Gayrus ©   (2003-03-04 03:45) [0]

Мне нужно дождяться, пока отработает одна форма, а потом продолжить выполнение программы, я делаю так:

Procedure ShowForm;
begin
MenuForm.Tag:=0;
MenuForm.InitGL;
MenuForm.Show;
while MenuForm.Visible do Application.ProccesMessages;
end;

Но программа упорно выдаёт ошибку "Stack overflow" после того как форма скрывается. Может подскажите с чем это связано или хоть в каком направлении искать?


 
Anatoly Podgoretsky ©   (2003-03-04 09:32) [1]

Наверно у тебя MenuForm.Show вызывает ShowForm; или ошибка в MenuForm.InitGL;


 
Gayrus ©   (2003-03-05 03:20) [2]

Нет, там всё нормально, ошибка возникает после скрытия формы.


 
Юрий Зотов ©   (2003-03-05 03:28) [3]

Здесь ошибок нет, нужно видеть больше кода.
А вообще, используйте ShowModal, выкиньте ненужный цикл и не мучайтесь.


 
Gayrus ©   (2003-03-05 03:40) [4]

ShowModal-попробую,просто я раньше с таким не сталкивался, возможно это из-за Form.Hide?
procedure TMenuForm.FormHide(Sender: TObject);
var I:Integer;
begin
try
If Length(FontArr)>0 then begin
for I:=0 to High(FontArr)do glDeleteLists(FontArr[i],256);
end;
If Length(aTextur)>0 then begin
for I:=0 to High(aTextur)do glDeleteTextures(1,@aTextur[i]);
end;
If Length(MenuArr)>0 then begin
for I:=0 to High(MenuArr)do glDeleteLists(MenuArr[i],1);
end;
{ wglMakeCurrent(0,0); // Освобождение OpenGL
wglDeleteContext(MenuForm.h_rc);}
If Length(BitmapArr)>0 then begin
for I:=0 to High(BitmapArr)do BitmapArr[i].Free;
end;
finally
BitmapArr:=nil;
mFilesArr:=nil;
mComenArr:=nil;
mNamesArr:=nil;
FontArr:=nil;
MenuArr:=nil;
aTextur:=nil;
aFont:=nil;
aComp:=nil;
sData:=nil;
end;


 
Юрий Зотов ©   (2003-03-05 05:31) [5]

Почти наверняка причина в том, что ПРИ закрытии TMenuForm (или уже ПОСЛЕ ее закрытия) возникает бесконечная рекурсия. Но гадать, где и почему она возникает, можно очень долго. А главное, гадать и не нужно.

1. Поставьте BreakPoint на строке end в Procedure ShowForm (BP1).
2. Второй BreakPoint поставьте на входе в TMenuForm.FormHide (BP2).
3. Откройте окно Call Stack и запустите программу. Вы должны прийти на BP2. Жмите F9 ОДИН раз.
4. Если после этого Вы пришли снова на BP2, то рекурсия возникает ПРИ закрытии TMenuForm. Просмотрите стек вызовов и найдите в нем повторяющуюся цикличность вызовов. Внимательно просмотрите код участвующих в этом цикле процедур, начиная с ПОСЛЕДНЕЙ (скорее всего, ошибка именно в ней) и найдите причину рекурсии.
5. Если же Вы пришли на BP1, то рекурсия возникает уже ПОСЛЕ закрытия TMenuForm и с самой TMenuForm может быть совершенно никак не связана. Жмите много раз F8 и наблюдайте за окном стека. Как только в нем появится одна из процедур, которая уже есть ниже - рекурсия обнаружена. Виновата в ней, скорее всего, предыдущая процедура - начинайте смотреть код с нее.



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

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

Наверх




Память: 0.48 MB
Время: 0.019 c
14-54314
Leon crom
2003-02-27 20:00
2003.03.17
любовь к родине


4-54379
Raph
2003-01-23 21:28
2003.03.17
Получение списка дисков


14-54278
Pat
2003-02-27 17:57
2003.03.17
Схема для курсовика


14-54300
Nick-From
2003-02-26 19:47
2003.03.17
есть функция Log(x) и Exp(x), как выразить Ln(x) замучился вспоми


4-54375
Alex870
2003-01-25 16:29
2003.03.17
Как изменить шрифт