Вызов процедуры в Delphi

У меня есть процедура с Sender: TObject параметром

procedure TForm1.FormCreate(Sender: TObject);

Как я могу снова вызвать эту процедуру?

Эта версия не работает:

TForm1.FormCreate(Sender: TObject);

Заранее спасибо.


person Liviu Solcovenco    schedule 24.03.2012    source источник
comment
вы должны вызвать его с помощью экземпляра объекта. поэтому, если вам нужно вызвать его из кода формы, вы должны использовать self.FormCreate(self) или просто FromCreate(self), а если вам не нужен отправитель - FormCreate(nil). кстати, не стоит снова звонить FormCreate.   -  person teran    schedule 24.03.2012
comment
Отправитель в основном не используется новичками и простыми программами. Отправитель - это способность узнать, кто отправил вызов, и, если это не поможет, выбрать способ действия или даже выполнить вызов процедуры, такой как sender.proc, в функции.   -  person none    schedule 25.03.2012


Ответы (1)


Я предполагаю, что вы хотите вызвать процедуру FormCreate экземпляра TForm1.

Вы можете использовать FormCreate(Self) или FormCreate(nil) (или вы можете передать любой экземпляр TObject в качестве параметра), если вы находитесь внутри класса TForm1. В противном случае вы должны написать Form1.FormCreate(Self) или Form1.FormCreate(nil) или аналогично, где Form1 - соответствующий экземпляр TForm1.

Во всяком случае, вызывать FormCreate процедуру в более позднее время не особо «элегантно». Действительно, название ясно предполагает, что процедура вызывается при создании формы.

Если конкретная часть логики вашего FormCreate метода требуется на других этапах, и вы просто не хотите дублировать код, вам, вероятно, следует реализовать этот фрагмент в виде отдельного метода (процедуры или функции) и также вызвать его в FormCreate как и в других частях вашей программы, если это необходимо.

Но тогда вам может быть лучше вообще перенести эту часть вашей бизнес-логики из FormCreate. Что мы обычно делаем в FormCreate, так это создаем / инициализируем объекты, которые позже неинициализируются / уничтожаются в FormDestroy (при необходимости). Итак, хорошо подумайте, что вы делаете в FormCreate, может быть, есть лучшее, логически более подходящее место для некоторых или всех действий, которые вы реализовали в этом методе.

person Andreas Rejbrand    schedule 24.03.2012
comment
Спасибо за ответы. Посоветуйте, пожалуйста, лучший способ выполнить код из TForm1.FormCreate (Sender: TObject); в другом месте. Конечно, не копировать. - person Liviu Solcovenco; 24.03.2012
comment
Поместите код, который вы хотите повторно использовать, в отдельной функции и вызовите эту функцию из ваших OnCreate и из других областей, где вам нужно ее вызвать, возможно? - person Thomas; 24.03.2012
comment
@Liviu: Рефакторинг. Видимо какую-то часть вашего FormCreate имеет смысл выполнить несколько раз. Поместите эту часть в отдельную процедуру с подходящим именем, например LoadListOfFiles (или любым другим, имеющим смысл в вашем приложении - скорее всего, не с этим именем!). Затем позвоните LoadListOfFiles в свой FormCreate и в любое другое время, когда захотите. Таким образом, вы также можете делать в FormCreate вещи, которые вы должны делать только тогда, когда форма действительно создана. - person Andreas Rejbrand; 24.03.2012
comment
У меня хватило смелости добавить несколько предложений к вашему правильному ответу. Не стесняйтесь откатывать его или редактировать столько, сколько хотите, если вы считаете, что мои дополнения подрывают вашу основную идею. (Примечание: я не видел ни одного комментария во время редактирования.) - person Andriy M; 24.03.2012
comment
Я пробовал, но не работает. TForm1 = class(TForm) MainMenu1: TMainMenu; procedure ajax(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure ajax(Sender:TObject); begin end; - person Liviu Solcovenco; 24.03.2012
comment
@LiviuSolcovenco: Вы, кажется, путаете очень разные вещи: объявление / определение метода (процедуры или функции) и вызов метода. Когда вы объявляете (или, я бы сказал, определяете) метод в разделе implementation, вы указываете его имя вместе с именем class, которому он принадлежит. В вашем случае заголовок метода в implementation должен читать: procedure TForm1.ajax(Sender: TObject);. … - person Andriy M; 24.03.2012
comment
@LiviuSolcovenco: Но когда вы вызываете этот метод, вам может не понадобиться префикс, и вы ссылаетесь на него просто по имени ajax: …; ajax(whatever); …. Вы можете сделать это из метода того же класса. Но когда вы вызываете ajax в методе другого класса, укажите соответствующее имя экземпляра в качестве префикса: …; Form1.ajax(whatever); …. - person Andriy M; 24.03.2012
comment
Проблема в том, что вы плохо знаете язык. Вам следует немного изучить процедурные типы в Delphi, процедуры, функции, overloading, прототипы, типы параметров < i> var, const, in, out, untyped и т. д. Ответ на самом деле довольно плохой, потому что вы, вероятно, ничему из него не научились. - person az01; 24.03.2012
comment
@ az01: Совершенно верно. OP действительно должен изучить основы ООП в Delphi (например, разницу между классом и экземпляром). Тем не менее, не всегда бывает так, что у вас достаточно времени / энергии, чтобы написать целое руководство, когда вы обнаруживаете вопрос, в котором OP не хватает фундаментальных знаний по предмету. Но с технической точки зрения мой ответ совершенно правильный ... - person Andreas Rejbrand; 24.03.2012