Форум: "Начинающим";
Текущий архив: 2017.10.01;
Скачать: [xml.tar.bz2];
ВнизКак программно назначить форме событие 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.001 c