Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание объектов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c