Главная страница
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-54029
KpeHgeJIb
2003-03-04 20:49
2003.03.17
Как получить список всех дочерных окон относящихся к пределенном.


1-54027
multik
2003-03-03 22:32
2003.03.17
Привет всем!!! Как узнать какой символ соответствует координатам.


6-54141
Zevsus
2003-01-27 14:58
2003.03.17
из TWebBrowser получить html код


14-54237
Antik
2003-02-28 09:45
2003.03.17
На тебе, боже, что нам не гоже или просто недержание?


14-54248
Roman Go
2003-02-28 10:31
2003.03.17
Укажите ссылку на какой нибудь учебник по MS SQL Server