Вниз
Скачать: CL | DM;

Мастера помогите советом!( AbstractError)   Найти похожие ветки 

 
Древолаз   (2006-02-15 10:18) [0]

Есть две формы мне нужно сделать переход с одной формы на другую, при этом чтоб формы выгружались с памяти.

Делаю так.
unit Unit1;
…………
procedure TForm1.Button2Click(Sender: TObject); // Переход на форму 2
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
Form1.Free;
end;

procedure TForm1.Button1Click(Sender: TObject); // Закрываем прогу
begin
Application.CreateForm(TForm2, Form2);
Form1.Close;
end;

end.

unit Unit2;
……
procedure TForm2.Button1Click(Sender: TObject); // Закрываем прогу
begin
Application.CreateForm(TForm1, Form1);
Form1.Close;
end;

procedure TForm2.Button2Click(Sender: TObject); // Переход на форму 1
begin
Application.CreateForm(TForm1, Form1);
Form1.Show;
Form2.Free;
end;

end.

Прога работает примерно раз 15 (переходим с первой формы на вторую) а потом вывешивает окно -
“Project Project1.exe raised exception class EAbstractError with message <Abstract Error>.Process stopped.Use Step or Run continue.”

Подскажите плиз где косяк?
С уважением Константин.


 
Гаврила ©   (2006-02-15 10:31) [1]


> Подскажите плиз где косяк?



> procedure TForm1.Button2Click(Sender: TObject); //
>Переход на форму 2
>begin
>Application.CreateForm(TForm2, Form2);
>Form2.Show;
>Form1.Free;
> end;


Не разрушай себя с своем же методе так.


 
Древолаз   (2006-02-15 10:39) [2]

А как коректно? (спасибо что откликнулся)


 
Dmitrij_K   (2006-02-15 10:42) [3]

Вместо Free напиши Release


 
Древолаз   (2006-02-15 10:45) [4]

Спасибо Dmitrij_K ! (сегодня проверю)


 
Жуков Олег   (2006-02-15 10:46) [5]

Ошибка в том, что из метода самого объекта нельзя вызвать его же деструктор, т.к. на момент окончания работы метода происходит обращение к объекту и объект ещё должен существовать. T.e. в методе TForm2.AnyProc() нельзя написать  Self.Free(). Обычно, если есть такая задача, посылают какому другому то окну пользовательское сообщение (PostMessage), и, обрабатывая его, то окно разрушает объект. Однако с формами проще, поменяй Form.Free() на Form.Close(), и в обработчике OnClose напиши Action := caFree; Если ты вызовешь Close для главной формы, то закроется всё приложение, поэтому это должны быть не главные формы. Я бы сделал для этой программы отдельную невидимую главную форму.

Ещё рекомендую в методах классов форм не использовать глобальных переменных соответветсвующих экземплярам этого класса, (т.е. вместо Form2.Close писать либо Self.Close(), либо просто Close()). - это исключит ряд ошибок в дальнейшем, когда будешь создавать несколько форм одного класса.


 
Древолаз   (2006-02-15 10:51) [6]

Спасибо всем! о более подробном ответе я и не мечтал (респект Жукову Олегу).



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.04 c
10-1114329246
w_h_i_t_e
2005-04-24 11:54
2006.03.05
Сервер и клиент, передача файла.


15-1139484455
Харько
2006-02-09 14:27
2006.03.05
Снятся ли вам цветные сны?


2-1140168238
maep
2006-02-17 12:23
2006.03.05
IP, Hostname


1-1138957761
t0mk4
2006-02-03 12:09
2006.03.05
Image1. как вывести только один кусок картинки?


2-1139816777
Werwolf
2006-02-13 10:46
2006.03.05
Как работать со счетчиками производительности (counters)




   Наверх