Как вызвать процедуру из другой процедуры

Существует эта ссылка Как мне вызвать процедура внутри другой процедуры на Паскале Но это не совсем мой случай.

procedure TForm1.Button1Click(Sender: TObject);
var
   [...]
begin
  // click on button
  [...]
end; 

а у меня такая процедура

procedure TForm1.CheckListBox2DblClick(Sender: TObject);
begin
  // on double click in flags
  [the same code like above]
end; 

я пробовал это, но это не работает

procedure TForm1.CheckListBox2DblClick(Sender: TObject);
begin
  TForm1.Button1Click;
end;    

тогда я попробовал это

procedure TForm1.CheckListBox2DblClick(Sender: TObject);
begin
  TForm1.Button1Click(Sender: TObject);
end; 

это тоже не работает
Может ли кто-нибудь помочь мне?


person Max Muster    schedule 19.02.2014    source источник


Ответы (2)


Просто вызовите его напрямую, используя либо nil, либо другой компонент в качестве Sender:

procedure TForm1.CheckListBox2DblClick(Sender: TObject);
begin
  Button1Click(nil);
end;  

procedure TForm1.CheckListBox2DblClick(Sender: TObject);
begin
  Button1Click(CheckListBox2);
end;      

Обратите внимание, что вы не используете имя класса (или имя переменной) самой формы, поскольку вы звоните из текущего экземпляра формы. IOW, не используйте TForm1 или Form1 внутри метода класса; который ограничивает вас конкретным экземпляром формы вместо того, чтобы быть доступным для всех экземпляров. Если вам нужно уточнить его, используйте Self, как в Self.Button1Click(nil);.

person Ken White    schedule 19.02.2014
comment
Спасибо, Работает, через 7 минут принимаю. но что такое ноль? - person Max Muster; 19.02.2014
comment
nil — это неназначенный указатель. Это означает передать процедуре указатель ни на что, потому что для нее требуется параметр. Вы можете проверить его, чтобы увидеть, является ли он нулевым, используя if Sender <> nil или if not Assigned(Sender). Sender — это элемент управления, который отправляет событие (заставляя его вызываться); поскольку вы делаете это из обработчика событий другого элемента управления, может быть уместно или нецелесообразно предоставлять Sender событию, которое вы запускаете вручную, в зависимости от того, что на самом деле делает ваш код. Поскольку у меня нет этой информации, я продемонстрировал оба способа. - person Ken White; 19.02.2014

Попробуй это

procedure TForm1.CheckListBox2DblClick(Sender: TObject);
begin
TForm1.Button1Click(Sender);
end; 
person Random    schedule 19.02.2014
comment
Я получаю эту ОШИБКУ: procmaileditor1.pas(145,30) Ошибка: в методах класса можно получить доступ только к методам класса, свойствам класса и переменным класса - person Max Muster; 19.02.2014
comment
вторая версия также не компилируется: procmaileditor1.pas(146,30) Ошибка: в методах класса можно получить доступ только к методам класса, свойствам класса и переменным класса - person Max Muster; 19.02.2014
comment
Вы можете попробовать назначить функцию напрямую TForm1.CheckListBox2DblClick:[email protected] - person Random; 19.02.2014