![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно назначить форме событие Oncreate?
Gedevan © (2015-11-03 12:40:00)Событие нужно назначать когда форма уже создана? т.е. метод крейт был вызван. В таком случае, как же мне подсунуть туда свою процедуру?
Palladin (2015-11-06 13:48:00) [1]http://www.eonet.ne.jp/~gakana/tablacus/scriptcontrol_en.html
ухты (2015-11-05 16:31:00) [2]
> Вам, барин, надо почитать статью А. Тенцера:
> Использование Microsoft ScriptControl.
Только для х64 нету Microsoft ScriptControl. По крайней мере до недавнего времени не было, может кто то и собрал ...
Leonid Troyanovsky (2015-11-05 10:14:00) [3]
> Германн © (05.11.15 01:01) [26]
> и поняли бы в каком мире мы нынче живём! :)
Нынче как и раньше:
кто не стремится узнать как перекрыть конструктор
идет в очередь за метлой.
--
Regards, LVT.
Leonid Troyanovsky (2015-11-05 10:10:00) [4]
> gedevan (05.11.15 06:53) [28]
> написано на скриптовом языке, т.е. чтобы вызвать это мне
> нужно специально для этого события скомпилировать отдельный
> скрипт и запустить его...
Кто на ком стоял?
Вам, барин, надо почитать статью А. Тенцера:
Использование Microsoft ScriptControl.
Возможно, что лопата там.
--
Regards, LVT.
Leonid Troyanovsky (2015-11-05 10:04:00) [5]
> Юрий Зотов © (04.11.15 18:12) [20]
> и запускаю программу. Вопрос: какой метод сработает - RunTimeProc
> или DesignTimeProc ?Это я к тому, что перекрытие конструктора
> может и не сработать.
В любом случае назначаемый обработчик уже должен существовать.
Т.е., в перекрытом конструкторе нужно просто вызвать RunTimeProc
в нужном месте.
--
Regards, LVT.
Leonid Troyanovsky (2015-11-05 09:59:00) [6]
> кгшзх © (04.11.15 14:52) [18]
> актуален для всего лежащего на форме, но не созданного в
> рантайме
На худой конец и форма контрол.
--
Regards, LVT.
gedevan (2015-11-05 06:53:00) [7]procedure AfterConstruction; virtual; кстати получается что не подходит, потому что, то что я должен в нем выполнить написано на скриптовом языке, т.е. чтобы вызвать это мне нужно специально для этого события скомпилировать отдельный скрипт и запустить его...
Gedevan (2015-11-05 05:46:00) [8]госпаде, программа IDE на скриптовом языке там есть дефолтная форма. Т.е. у меня в проге тоже есть Design time и run time. вот в Designtime я пишу обработчик для Oncreate формы, а в рантайме хочу чтобы он выполнился. в скриптовом языке есть возможность создавать программно все компоненты и формы и назначать им обработчики, и именно это я и пытаюсь реализовать, потому что в противном случае мне приходится на каждый обработчик компилировать свой скрипт, создавать компоненты в рантайме, подцеплять им процедуры события и вызывать из этих процедур этот скрипт, т.е. на каждое событие нужен отдельный скрипт, а я ща делаю чтобы был 1 скрипт на всех. Сейчас у меня в рантайме при запуске в апликейшене создается форма и у нее есть событие FormCreate и там я и написал вызов скрипта. А если форму создаешь в самом скрипте, то вот и получается фигня такая..
Я почитал, пробую...
Германн (2015-11-05 01:01:00) [9]Удалено модератором
Примечание: Создание пустых сообщений
NoUser (2015-11-04 22:20:00) [10]> Юрий Зотов © (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-04 21:15:00) [11]А вообще, непонятно, зачем понадобилось назначение обработчика OnCreate в run-time. Похоже на X, Y, Z.
Юрий Зотов (2015-11-04 21:11:00) [12]> NoUser © (04.11.15 20:06) [21]
У Вас в строке 13 происходит чтение DFM и если там прописан назначенный в design-time обработчик OnCreate, то он перекроет назначенные Вами в строках 8, 9 10.
См. [20].
Smile (2015-11-04 20:15:00) [13]Удалено модератором
Примечание: Создание пустых сообщений
NoUser (2015-11-04 20:06:00) [14]> [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;
Юрий Зотов (2015-11-04 18:12:00) [15]
constructor TMyForm.Create(AOwner: TComponent; RunTimeProc: TNotifyEvent)
begin
OnCreate := RunTimeProc;
inherited Create(AOwner);
end;
В IDE назначаю TMyForm.OnCreate = DesignTimeProc и запускаю программу. Вопрос: какой метод сработает - RunTimeProc или DesignTimeProc ?
Это я к тому, что перекрытие конструктора может и не сработать. Лучшее решение - AfterConstruction.
Sha (2015-11-04 15:12:00) [16]> Dimka Maslov © (04.11.15 12:25) [17]
> А что AfterConstruction теперь запрещён?
Нет, не запрещен, его тоже нормально перекрыть можно в своем классе. Это другой штатный способ сделать что-то до вызова OnCreate.
Проблема с передачей туда параметра. Если через поле класса, то лучше это сделать прямо в конструкторе. Не глобальные же переменные использовать.
кгшзх (2015-11-04 14:52:00) [17]Еще для контролов может быть полезно Loaded; override.
лоадед актуален для всего лежащего на форме, но не созданного в рантайме
Dimka Maslov (2015-11-04 12:25:00) [18]А что AfterConstruction теперь запрещён?
sniknik (2015-11-04 11:38:00) [19]> Это уже не будильник, который звонит после нажатия на кнопку, когда я уже проснулся :)
понятно, читаешь местами, и потому "в будильниках" ты тоже нихрена не понимаешь... где кукушка?
Leonid Troyanovsky (2015-11-04 09:22:00) [20]
> Германн © (04.11.15 00:54) [13]
> в рантайме показано как нужно динамически создавать компоненты
> и как им назначать обработчики событий. Формы тоже можно
> создавать динамически и можно назначать им обработчики.
> Вот только у компонент нет обработчиков OnCreate, а у форм
> и датамодулей есть. А назначить его динамически форме хочется.
Для динамически создаваемых компонентов (форм в т.ч.)
лучше не назначать обработчики, а перекрывать (override)
соответствующие методы диспетчеризации. Ну, или конструктор,
как в данном случае.
Еще для контролов может быть полезно Loaded; override.
--
Regards, LVT.