2

ほとんどの機能が標準のTActionを使用して実装されたフォームがあります。メニュー、ツールバー、およびいくつかのボタンがあります。TEditCopyアクションとTEditPasteアクションを使用するだけで、コードなしでクリップボードのコピー/貼り付けを実装しました。それは私が持っているTEditとTMemoボックスで完璧に動作します。

さて、TListBoxでも動作させたいです。具体的には、まったく同じメニュー項目、キーショートカット、およびツールボタンを使用して、選択したリスト項目をTListBoxにコピーできるようにしたいです。

したがって、TEditCopyアクションを拡張する必要があると思います。しかし、それは私にはあまり簡単ではないようです。特に、TEditActionは、フォーカスされたコントロールがTCustomEditコントロールであるかどうかをチェックしますが、TListBoxではありません。大変な作業になるのではないかと少し心配です。

明らかな代替策は、標準のアクションを忘れて、汎用TActionのOnExecuteメソッドでclipbardへのコピーを実装することです。

しかし、あきらめる前に、標準のTEditCopyアクションを拡張するのに役立つアイデア、ヒント、またはトリックがありますか?

4

3 に答える 3

2

これが私が実装するために出てきたハックです。

クラスに同じ名前のTEditCopyを保持しているため、すでに持っているActionListまたはMenuItemsとToolButtonsを手動で変更する必要はありません。

type
 TEditCopy = class(StdActns.TEditCopy)
  public
   function HandlesTarget(Target: TObject): Boolean; override;
   procedure ExecuteTarget(Target: TObject); override;
   procedure UpdateTarget(Target: TObject); override;
  end;

TListBoxをサポートするために必要な機能を使用して、標準のTEditCopyアクションを拡張します。

function TEditCopy.HandlesTarget(Target: TObject): Boolean;
 begin
  result:=(inherited handlesTarget(Target)) or (target is TListbox);
 end;

procedure TEditCopy.ExecuteTarget(Target: TObject);
 begin
  if (target is TListBox) and (TListBox(Target).ItemIndex<>-1) then
    clipboard.AsText:=TListBox(Target).Items[TListBox(Target).ItemIndex]
  else
    inherited;
 end;

procedure TEditCopy.UpdateTarget(Target: TObject);
 begin
  if target is TListbox then
    Enabled := true
  else
    inherited;
 end;

アプリケーションの残りの部分は変更されていません。すべてのコピー/貼り付け機能は、コードなしで実装されています。

于 2010-04-17T10:23:15.727 に答える
0

それについてウェブ上で何かを読んだことを覚えていますが、リンクが見つかりません。見つかったら、もっと正確に説明します。

ただし、私が覚えているのは、アクションが「TBasiAction.HandlesTarget」メソッド(仮想)を使用して特定のターゲットに適用できるかどうかをチェックすることです。アクションを実行するときに、メソッド「HandlesTarget」、「UpdateTarget」、および「ExecuteTarget」(TBasicActionのすべてのメンバー)がどのように使用されるかを確認する必要があります。

繰り返しになりますが、リンクが戻ってきたら、これについて詳しく説明します。

[編集]

これは私が探していた投稿ではありませんでしたが、あなたが望むものを正確に説明しているようです: etutorials:Defining Custom Actions

于 2010-04-16T13:15:16.957 に答える
0

TActionのイベントハンドラーをオーバーライドするか、TEditAction/TEditCopyのコードとTListBoxの追加の処理を組み合わせた新しい子孫を作成する必要があります。

アクションの拡張ポイントは、OnExecute / OnUpdateイベントハンドラーの設定です。これは、既存のTEdit処理を無効にするため、ここでは機能しません。TEditCopyから派生してメソッドをオーバーライドすることもできますが、TActionから直接派生した新しいクラスと同じくらいのコードになる可能性があります。他にも機能する低レベルのハックがあるかもしれませんが、私にはわかりません。たとえあったとしても、文書化されたアプローチよりも保守性が低いことが保証されています。

于 2010-04-16T13:45:35.780 に答える