Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1314608477
Цукор5
2011-08-29 13:01
2017.10.01
count (таблица.*)


2-1446719068
Евгений Медведев
2015-11-05 13:24
2017.10.01
ошибка при запуске экзэшника


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


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский