1

TSpeedButton 型のカスタム コンポーネントがあり、次の 2 つの追加プロパティが定義されています。

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 が押されたときにコンポーネント名を変数に渡し、メモの保存ボタンが押されたときにその名前を取得し、それを使用してメモ テキストを speedbuttons CommentText プロパティに割り当てることでした。しかし、これを行うには、考えられる各スピードボタン名をチェックし、そのプロパティにメモ値を割り当てるある種の case..of ステートメントを使用する必要があることに気付きました。

最初にメモを開いたスピードボタンにメモテキストを割り当てる簡単な方法はありますか?

4

3 に答える 3

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;

そして、次のように2番目のイベントハンドラーを書き直すことができます。

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

うーん。それらは同じです。2つの同じ機能を持つことは無駄なので、ボタン固有に聞こえないように、一方を取り除き、もう一方の名前を変更します。

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

次に、両方のOnClickボタンのプロパティを設定して、その1つのイベントハンドラーを参照します。オブジェクトインスペクターでプロパティをダブルクリックするだけでは、これを行うことはできません。名前を自分で入力するか、ドロップダウンリストから選択するか、実行時にイベントプロパティを割り当てる必要があります。

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

また、コントロールにはもっと意味のある名前を使用することをお勧めします。それLabel15は特にひどいです。15番目のラベルが編集中であることを示すラベルであることをどのように思い出すことができますか?たとえば、それを呼び出しEditInProgressLabelます。

于 2009-08-27T06:24:52.797 に答える
2

すでに追加の変数を渡しているので、SpeedButton 自体を渡さないのはなぜですか? その後、参照を検索する必要はありません。

于 2009-08-27T00:16:06.073 に答える
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;

名前だけでなく、ボタン自体を覚えることもできます。

于 2009-08-27T06:22:46.077 に答える