Главная страница
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.013 c
1-54041
AZ
2003-03-04 05:49
2003.03.17
Константы MK_CONTROL и MK_SHIFT


14-54166
ProtoSoft
2003-02-28 02:36
2003.03.17
Во блин, а правда Россияне, что у Вас собираются МАТЮКИ сделать..


1-54102
nester
2003-03-05 18:25
2003.03.17
Как сделать форму AlwaysOnTop?


1-54053
StarCon
2003-03-05 08:11
2003.03.17
DOA


1-54076
zergey
2003-03-05 11:28
2003.03.17
Как использовать COM объект