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

Вниз

Как программно назначить форме событие Oncreate?   Найти похожие ветки 

 
Gedevan   (2015-11-03 12:40) [0]

Событие нужно назначать когда форма уже создана? т.е. метод крейт был вызван. В таком случае, как же мне подсунуть туда свою процедуру?


 
кгшзх ©   (2015-11-03 13:38) [1]

событие это свойство. процедура это значение этого свойства.
еще должен быть оператор присваивания между ними.


 
gedevan   (2015-11-03 13:42) [2]

и? суть в том что если я пишу  Form := TForm.Create(nil); а затем Form.OnCreate := eventProc;

то это ничего не дает, т.к. он крейт у формы уже случился.


 
кгшзх ©   (2015-11-03 13:47) [3]

ты спрашивал как подсунуть.
я тебе сказал как подсунуть.
другого способа нет, так как событие это свойство а обработчик это значение


 
gedevan   (2015-11-03 13:48) [4]

я спрашивал как так подсунуть чтобы оно срабатывало.


 
кгшзх ©   (2015-11-03 13:55) [5]

чтобы срабатывало вызови сам


 
Sha ©   (2015-11-03 13:55) [6]

можно написать конструктор с доп. параметром


 
кгшзх ©   (2015-11-03 13:56) [7]

можно написать конструктор с доп. параметром

для TForm?


 
sniknik ©   (2015-11-03 14:45) [8]

> если я пишу  Form := TForm.Create(nil); а затем Form.OnCreate := eventProc;
//TForm2
 TForm2 = class(TForm)
 private
 public
   constructor CreateProc(AOwner: TComponent; Proc: TNotifyEvent);
 end;

constructor TForm2.CreateProc(AOwner: TComponent; Proc: TNotifyEvent);
begin
 onCreate:= Proc;
 inherited Create(AOwner);
end;

//TForm1
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2:= TForm2.CreateProc(self, FormCreate);
 Form2.ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ShowMessage(TControl(Sender).Name);
end;


 
кгшзх ©   (2015-11-03 15:00) [9]

вот это по нашему, по бразильски.
лень вызвать процедуру явно, поетому мы напишем класс.


 
sniknik ©   (2015-11-03 15:31) [10]

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

кстати классы на основании форм удобны, их даже IDE поддерживает, в нужные места inherited расставляет, и наследуется прямо из меню. чего еще нужно?


 
Smile ©   (2015-11-03 17:26) [11]

Событие нужно назначать когда форма уже создана? т.е. метод крейт был вызван.
На мой взгляд, не исключено, что чего-то недопонял, похоже на то, как заставить позвонить будильник установленный на 7:00, после того как он позвонил, попросить его позвонить в 6:00 в те же сутки. Хотя не уверен, что правильно понял вопрос топика.


 
sniknik ©   (2015-11-04 00:52) [12]

> чего-то недопонял
метод oncreate <> конструктору объекта.

если в будильниках понятнее чем код, то вот аналогия - представь будильник который звонит не сам, а по нажатию на кнопку... ну, а чтобы автоматизировать нажатие в определенное время будильник ставят в часы с кукушкой... время приходит кукушка вылетает долбит по кнопке - будильник звонит... просто же. ну вот, а теперь захотели менять мелодии сменой будильников с ними, причем выбирать мелодию прямо в момент звонка. и что делать? если извне системы, ориентируясь на сам звонок, то ничего "поезд"(кукушка) уже ушел когда услышали... а вот если изнутри, то там процесс звонка не одномоментный, есть еще действия "открытие дверцы кукушки", начало "вылета"... ориентируясь на них "будильники" можно менять... ПРОФИТ.


 
Германн ©   (2015-11-04 00:54) [13]


> Smile ©   (03.11.15 17:26) [11]
>
> На мой взгляд, не исключено, что чего-то недопонял

Угу. Психологию новичков. Во всех статьях, начиная со знаменитой статьи ЕФ о жизни и смерти в рантайме показано как нужно динамически создавать компоненты и как им назначать обработчики событий. Формы тоже можно создавать динамически и можно назначать им обработчики. Вот только у компонент нет обработчиков OnCreate, а у форм и датамодулей есть. А назначить его динамически форме хочется. :)


 
Smile ©   (2015-11-04 04:55) [14]

> sniknik ©   (04.11.15 00:52) [12]

будильник который звонит не сам, а по нажатию на кнопку...
Это уже не будильник, который звонит после нажатия на кнопку, когда я уже проснулся :)


 
Leonid Troyanovsky ©   (2015-11-04 09:22) [15]


> Германн ©   (04.11.15 00:54) [13]

> в рантайме показано как нужно динамически создавать компоненты
> и как им назначать обработчики событий. Формы тоже можно
> создавать динамически и можно назначать им обработчики.
> Вот только у компонент нет обработчиков OnCreate, а у форм
> и датамодулей есть. А назначить его динамически форме хочется.

Для динамически создаваемых компонентов (форм в т.ч.)
лучше не назначать обработчики, а перекрывать (override)
соответствующие методы диспетчеризации. Ну, или конструктор,
как в данном случае.

Еще для контролов может быть полезно Loaded; override.

--
Regards, LVT.


 
sniknik ©   (2015-11-04 11:38) [16]

> Это уже не будильник, который звонит после нажатия на кнопку, когда я уже проснулся :)
понятно, читаешь местами, и потому "в будильниках" ты тоже нихрена не понимаешь... где кукушка?


 
Dimka Maslov ©   (2015-11-04 12:25) [17]

А что AfterConstruction теперь запрещён?


 
кгшзх ©   (2015-11-04 14:52) [18]

Еще для контролов может быть полезно Loaded; override.


лоадед актуален для всего лежащего на форме, но не созданного в рантайме


 
Sha ©   (2015-11-04 15:12) [19]

> Dimka Maslov ©   (04.11.15 12:25) [17]
> А что AfterConstruction теперь запрещён?

Нет, не запрещен, его тоже нормально перекрыть можно в своем классе. Это другой штатный способ сделать что-то до вызова OnCreate.
Проблема с передачей туда параметра. Если через поле класса, то лучше это сделать прямо в конструкторе. Не глобальные же переменные использовать.


 
Юрий Зотов ©   (2015-11-04 18:12) [20]


constructor TMyForm.Create(AOwner: TComponent; RunTimeProc: TNotifyEvent)
begin
 OnCreate := RunTimeProc;
 inherited Create(AOwner);
end;


В IDE назначаю TMyForm.OnCreate = DesignTimeProc и запускаю программу. Вопрос: какой метод сработает - RunTimeProc или DesignTimeProc ?

Это я к тому, что перекрытие конструктора может и не сработать. Лучшее решение - AfterConstruction.


 
NoUser ©   (2015-11-04 20:06) [21]

> [2]


// Application.CreateForm(TAddForm, AddForm);

procedure TMainForm.FormCreate(Sender: TObject);
begin
 AddForm := TAddForm(TAddForm.NewInstance);

 case Random(3) of
   0: AddForm.OnCreate := AddForm.FormCreateX;
   1: AddForm.OnCreate := AddForm.FormCreateY;
   2: AddForm.OnCreate := AddForm.FormCreateZ;
 end;

 AddForm.Create(Application);
end;


 
Smile ©   (2015-11-04 20:15) [22]

Удалено модератором
Примечание: Создание пустых сообщений


 
Юрий Зотов ©   (2015-11-04 21:11) [23]

> NoUser ©   (04.11.15 20:06) [21]

У Вас в строке 13 происходит чтение DFM и если там прописан назначенный в design-time обработчик OnCreate, то он перекроет назначенные Вами в строках 8, 9 10.

См. [20].


 
Юрий Зотов ©   (2015-11-04 21:15) [24]

А вообще, непонятно, зачем понадобилось назначение обработчика OnCreate в run-time. Похоже на X, Y, Z.


 
NoUser ©   (2015-11-04 22:20) [25]

> Юрий Зотов ©   (04.11.15 21:11) [23]
Ага, тогда так: )
.
procedure DoCreate; override;
.
procedure TAddForm.DoCreate;
begin
 case Random(3) of
   0: OnCreate := FormCreateX;
   1: OnCreate := FormCreateY;
   2: OnCreate := FormCreateZ;
 end;
inherited;
end;


 
Германн ©   (2015-11-05 01:01) [26]

Удалено модератором
Примечание: Создание пустых сообщений


 
Gedevan   (2015-11-05 05:46) [27]

госпаде, программа IDE на скриптовом языке там есть дефолтная форма. Т.е. у меня в проге тоже есть Design time и run time. вот в Designtime я пишу обработчик для Oncreate  формы, а в рантайме хочу чтобы он выполнился. в скриптовом языке есть возможность создавать программно все компоненты и формы и назначать им обработчики, и именно это я и пытаюсь реализовать, потому что в противном случае мне приходится на каждый обработчик компилировать свой скрипт, создавать компоненты в рантайме, подцеплять им процедуры события и вызывать из этих процедур этот скрипт, т.е. на каждое событие нужен отдельный скрипт, а я ща делаю чтобы был 1 скрипт на всех. Сейчас у меня в рантайме при запуске в апликейшене создается форма и у нее есть событие FormCreate и там я и написал вызов скрипта. А если форму создаешь в самом скрипте, то вот и получается фигня такая..

Я почитал, пробую...


 
gedevan   (2015-11-05 06:53) [28]

procedure AfterConstruction; virtual; кстати получается что не подходит, потому что, то что я должен в нем выполнить написано на скриптовом языке, т.е. чтобы вызвать это мне нужно специально для этого события скомпилировать отдельный скрипт и запустить его...


 
Leonid Troyanovsky ©   (2015-11-05 09:59) [29]


> кгшзх ©   (04.11.15 14:52) [18]

> актуален для всего лежащего на форме, но не созданного в
> рантайме

На худой конец и форма контрол.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2015-11-05 10:04) [30]


> Юрий Зотов ©   (04.11.15 18:12) [20]

> и запускаю программу. Вопрос: какой метод сработает - RunTimeProc
> или DesignTimeProc ?Это я к тому, что перекрытие конструктора
> может и не сработать.

В любом случае назначаемый обработчик уже должен существовать.
Т.е., в перекрытом конструкторе нужно просто вызвать RunTimeProc
в нужном месте.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2015-11-05 10:10) [31]


> gedevan   (05.11.15 06:53) [28]

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

Кто на ком стоял?

Вам, барин, надо почитать статью А. Тенцера:
Использование Microsoft ScriptControl.

Возможно, что лопата там.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2015-11-05 10:14) [32]


> Германн ©   (05.11.15 01:01) [26]

> и поняли бы в каком мире мы нынче живём! :)

Нынче как и раньше:
кто не стремится узнать как перекрыть конструктор
идет в очередь за метлой.

--
Regards, LVT.


 
ухты ©   (2015-11-05 16:31) [33]


> Вам, барин, надо почитать статью А. Тенцера:
> Использование Microsoft ScriptControl.
Только для х64 нету Microsoft ScriptControl. По крайней мере до недавнего времени не было, может кто то и собрал ...


 
Palladin ©   (2015-11-06 13:48) [34]

http://www.eonet.ne.jp/~gakana/tablacus/scriptcontrol_en.html



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

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

Наверх




Память: 0.56 MB
Время: 0.004 c
2-1446719068
Евгений Медведев
2015-11-05 13:24
2017.10.01
ошибка при запуске экзэшника


15-1465914259
pavel_guzhanov
2016-06-14 17:24
2017.10.01
Вопрос про флешку


3-1314608477
Цукор5
2011-08-29 13:01
2017.10.01
count (таблица.*)


2-1446463756
Валя
2015-11-02 14:29
2017.10.01
прокуртка кнопок


4-1283746765
SPeller
2010-09-06 08:19
2017.10.01
Как определить что программа запущена в режиме RemoteApp?