![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание объектов
flaxe © (2008-02-01 00:03:00)Создаю динамически форму..
procedure TForm1.Button12Click(Sender: TObject);
procedure CloseForm(Sender: TObject; var Action: TCloseAction);
begin
end;
var
AddForm: TForm;
ProjectDate,Meter:TDateTimePicker;
Address,Client,Phone,Price,Info:TEdit;
Designer:Tlistbox;
begin
AddForm:=Tform.Create(Application);
AddForm.Position:=poDesktopCenter;
with AddForm do
begin
ProjectDate:=TDateTimePicker.Create(AddForm);
end;
Form1.Enabled:=False;
AddForm.Visible:=True;
AddForm.OnClose:=CloseForm;
end;
И естественно AddForm.OnClose:=CloseForm; не работает. при компиляции выдает ошибку Incompatible type: method pointer and regulat procedure.
Как сделать правильно? Важно чтобы Присваиваемая процедура (CloseForm)находилась в самой процедуре (TForm1.Button12Click)
DiamondShark (2008-02-01 17:56:00) [1]Удалено модератором
Семеныч (2008-02-01 16:09:00) [2]> flaxe (01.02.08 04:10) [3]
> удобней былобы засунуть каждый диалог в свою процедуру.
И на здоровье, нет проблем. Но это же не значит, что процедура не может быть внешней? Может. И на удобство это никак не влияет.
KSergey (2008-02-01 15:45:00) [3]Автор, почитайте вот тут
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
Григорьев Антон (2008-02-01 08:38:00) [4]Это сделать невозможно. При вызове вложенной процедуры в стек кладутся не только параметры, но и адрес локльных переменных и параметров родительской процедуры, чтобы из вложенной процедуры можно было к ним обращаться. И этот адрес зависит от того, как и откуда вызвана процедура, причём для его определения требуется информация, которая доступна только на этапе компиляции, породить код, который правильно вызовет локальную процедуру из любого места, в общем случае невозможно (это можно сделать только в том случае, если локальная процедура не обращается к параметрам и локальным переменным внешней процедуры, но тогда её проще сделать не локальной). В Delphi даже ошибка такая предусмотрена - Local procedure/function '<element>' assigned to procedure variable - на тот случай, если попытаться обычной процедурной переменной присвоить локальную процедуру (правда, обходится это очень легко, но лучше не обходить).
flaxe (2008-02-01 04:10:00) [5]Так то понятно можно сделать..
Прост в програмке будет Много всяких диалогов около 30-40 штук, они все разные, и результат работы их тоже разный.. удобней былобы засунуть каждый диалог в свою процедуру.
Семеныч (2008-02-01 00:42:00) [6]> Важно чтобы Присваиваемая процедура (CloseForm)находилась в самой
> процедуре (TForm1.Button12Click)
Попробуйте обосновать, почему это важно - не получится. Не найдете Вы таких причин - потому что их нет. Значит, неважно.
Есть способ назначить обработчиком процедуру вместо метода класса, но если возникают такие вопросы, то лучше пока что делать как положено по науке, а от извратов воздержаться. Не совсем они тривиальны, поэтому при недостатке знаний/опыта легко огрести трудноотлавливаемые баги.
Семеныч (2008-02-01 00:35:00) [7]
type
TForm1 = class(TForm)
...
private
procedure CloseDynamicForm(Sender: TObject; var Action: TCloseAction);
end;
// ===========================
procedure TForm1.CloseDynamicForm(Sender: TObject; var Action: TCloseAction);
begin
...
end;
procedure TForm1.Button12Click(Sender: TObject);
...
begin
...
AddForm.OnClose := CloseDynamicForm;
...
end;