Текущий архив: 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.45 MB
Время: 0.007 c