Delphi 2009:传递组件名称onclick事件然后设置属性

时间:2009-08-26 23:59:22

标签: delphi components onclick custom-component

我有一个TSpeedButton类型的自定义组件,它定义了两个额外的属性:

CommentHeading: string;
CommentText: string;

我在设计时设置了CommentHeading。

按下速度按钮时,会显示一个备忘录,其下方有一个按钮,用于保存其内容。处理此问题的程序:

procedure CustomSpeedButton1Click(Sender: TObject);
begin
   Receiver := CustomSpeedButton1.Name; // possibly used to save the memo text back to this speedbuttons property after comments are submitted
   ViewComments(CustomSpeedButton1.CommentTitle,CustomSpeedButton1.CommentText);
end;

ViewComments程序本身:

procedure ViewComments(comment_caption:string; comment_text:string);
begin
  label15.Hide; // label showing editing in progress, hidden until user begins typing
  Button1.Enabled     := false; // the button for saving the memo text, hidden until user begins typing
  CommentsBox.Visible := true; // pop up the comment box at the bottom of the form
  CommentsBox.Caption := 'Comments: ' + comment_caption;
  CommentsMemo.Text   := comment_text; // if there are existing comments assign them to memo
end;

需要将备忘录的内容分配给自定义SpeedButton的CommentText属性。

我最初的想法是,当按下自定义SpeedButton时,我可以将组件名称传递给变量,然后在按下备忘录上的保存按钮时检索该名称,并使用它将备忘录文本分配给速度按钮CommentText属性。但后来我才意识到,要做到这一点,我必须使用某种情况...语句检查每个可能的速度按钮名称,然后将备忘录值分配给它的属性,这看起来非常单调乏味。

是否有更简单的方法将备忘录文本分配给打开备忘录的速拨按钮开始?

3 个答案:

答案 0 :(得分:2)

由于你已经传递了额外的变量,为什么不直接传递SpeedButton呢?然后你不需要查阅参考文献。

答案 1 :(得分:2)

最后,你问的是如何告诉ViewComments函数它正在使用哪个按钮的属性。

您是否了解Sender参数在OnClick事件中的作用?它告诉事件处理程序正在处理哪个对象的事件。它正好服务于您希望为ViewComments函数带来的角色。

这就是梅森在答案中所得到的。而不是传递所有属性值,传递对象本身

procedure ViewComments(CommentButton: TCustomSpeedButton);

然后从所有按钮的事件处理程序中调用它:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
  ViewComments(CustomSpeedButton1);
end;

procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
  ViewComments(CustomSpeedButton2);
end;

没有字符串,没有case语句,没有查找。

那应该回答你的问题,但你可以做得更好。还记得我之前说的关于Sender参数的内容吗?当有人单击第一个按钮时,该Sender处理程序的OnClick参数将成为按钮,因此我们可以像这样重写第一个事件处理程序:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

你可以像这样重写第二个事件处理程序:

procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

嗯。他们是一样的。有两个相同的功能是浪费,所以摆脱一个并重命名另一个,因此它不会发出按钮特定的声音:

procedure TForm1.CommentButtonClick(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

然后设置两个按钮的OnClick属性以引用该一个事件处理程序。您只能通过双击Object Inspector中的属性来执行此操作。您需要自己键入名称,从下拉列表中选择名称,或在运行时分配事件属性:

CustomSpeedButton1.OnClick := CommentButtonClick;
CustomSpeedButton2.OnClick := CommentButtonClick;

我还想鼓励您为控件使用更有意义的名称。那Label15特别令人震惊。你怎么能记得第十五标签是指示编辑正在进行中的标签?例如,将其称为EditInProgressLabel

答案 2 :(得分:0)

对代码进行一些小改动应该可以解决问题:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
var
  btn: TCustomSpeedButton;
begin
   btn := Sender as TCustomSpeedButton;
   Receiver := btn.Name; 
   ViewComments(btn.CommentTitle, btn.CommentText);
end;

编辑评论后:

procedure TForm1.StoreComments(comment: string);
var
  btn: TCustomSpeedButton;
begin
  btn := FindComponent(Receiver) as TCustomSpeedButton;
  btn.CommentText := comment;
end;

你也可以记住按钮本身而不仅仅是它的名字。