Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Динамическое создание объектов   Найти похожие ветки 

 
flaxe   (2008-02-01 00:03) [0]

Создаю динамически форму..

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)


 
Семеныч   (2008-02-01 00:35) [1]


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;


 
Семеныч   (2008-02-01 00:42) [2]

> Важно чтобы Присваиваемая процедура (CloseForm)находилась в самой
> процедуре (TForm1.Button12Click)

Попробуйте обосновать, почему это важно - не получится. Не найдете Вы таких причин - потому что их нет. Значит, неважно.

Есть способ назначить обработчиком процедуру вместо метода класса, но если возникают такие вопросы, то лучше пока что делать как положено по науке, а от извратов воздержаться. Не совсем они тривиальны, поэтому при недостатке знаний/опыта легко огрести трудноотлавливаемые баги.


 
flaxe   (2008-02-01 04:10) [3]

Так то понятно можно сделать..
Прост в програмке будет Много всяких диалогов около 30-40 штук, они все разные, и результат работы их тоже разный.. удобней былобы засунуть каждый диалог в свою процедуру.


 
Григорьев Антон ©   (2008-02-01 08:38) [4]

Это сделать невозможно. При вызове вложенной процедуры в стек кладутся не только параметры, но и адрес локльных переменных и параметров родительской процедуры, чтобы из вложенной процедуры можно было к ним обращаться. И этот адрес зависит от того, как и откуда вызвана процедура, причём для его определения требуется информация, которая доступна только на этапе компиляции, породить код, который правильно вызовет локальную процедуру из любого места, в общем случае невозможно (это можно сделать только в том случае, если локальная процедура не обращается к параметрам и локальным переменным внешней процедуры, но тогда её проще сделать не локальной). В Delphi даже ошибка такая предусмотрена - Local procedure/function "<element>" assigned to procedure variable - на тот случай, если попытаться обычной процедурной переменной присвоить локальную процедуру (правда, обходится это очень легко, но лучше не обходить).


 
KSergey ©   (2008-02-01 15:45) [5]

Автор, почитайте вот тут
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342


 
Семеныч   (2008-02-01 16:09) [6]

> flaxe   (01.02.08 04:10) [3]
> удобней былобы засунуть каждый диалог в свою процедуру.

И на здоровье, нет проблем. Но это же не значит, что процедура не может быть внешней? Может. И на удобство это никак не влияет.


 
DiamondShark ©   (2008-02-01 17:56) [7]

Удалено модератором



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

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
2-1201775767
@!!ex
2008-01-31 13:36
2008.02.24
Получить иконку окна.


9-1166547778
Kerk
2006-12-19 20:02
2008.02.24
Конкурс к годовщине Кладовки


15-1200776836
Kostafey
2008-01-20 00:07
2008.02.24
Хоть и не Delphi...


2-1201684617
Washington
2008-01-30 12:16
2008.02.24
string <-> TColor


15-1200664184
Evanescence
2008-01-18 16:49
2008.02.24
граббер в php