delphi teditcopyアクションを拡張して、リストボックスアイテムをクリップボードにコピーする
質問
標準のTACTIONを使用してその機能のほとんどが実装されたフォームがあります。メニュー、ツールバー、そしていくつかのあまりにもButtonsがあります。 Clipboardコピー/ペーストをまったくコードなしで実装しました。TeditCopyとTeditPasteアクションを使用しています。 TeditとTmemoボックスで完璧に機能します。
今、私もそれをTlistBoxで動作させたいです。具体的には、まったく同じMenuitems、キーショートカット、ツールボタンを使用して、選択したリスト項目をtlistboxにコピーできるようにしたいと考えています。
ですから、Teditcopyアクションを拡張する必要があると思います。しかし、それは私にはそれほど簡単ではないようです。特に、TEDITACTIONは、フォーカスコントロールがTCUSTOMEDITコントロールであることをチェックしますが、これはそうではありません。私はそれがあまりにも多くの仕事になることを少し恐れています。
明らかな代替案は、標準的なアクションを忘れて、一般的なタクションの1つのXecuteメソッドでClipbardにコピーを実装することです。
しかし、あきらめる前に、標準的なteditcopyアクションを拡張するのに役立つアイデア、ヒント、またはトリックがありますか?
解決
イベントハンドラーのタクションのハンドラーをオーバーライドするか、TDITACTION/TEDITCOPYのコードをTlistBoxの追加ハンドリングと組み合わせた新しい子孫を作成する必要があります。
アクションの拡張ポイントは、OneXecute/OnUpDateイベントハンドラーを設定することです。これは、既存のTEDIT処理を無効にするため、ここでは機能しません。 Teditcopyから下降してメソッドをオーバーライドすることもできますが、おそらく、Tactionからまっすぐに降り注ぐ新しいクラスと同じくらいのコードになるでしょう。他の低レベルのハックが機能するかもしれませんが、私はそれを見ません。たとえあったとしても、文書化されたアプローチよりも保守性が低いと保証されています。
他のヒント
これが私が実装するために出てきたハックです。
ActionListまたはMenuitemsとToolbuttonsを手動で変更する必要はありません。 同名 クラスのteditcopy。
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;
アプリケーションの残りの部分は変更されていません。すべてのコピー/貼り付けfunctionAlitは、まったくコードなしで実装されています。
私はそれについてウェブ上で何かを読んだことを覚えていますが、私はリンクを裏切ることができません。私がそれを見つけたら、私はそれについてもっと正確にあなたに話します。
しかし、私が覚えているのは、「tbasiaction.handlestarget」メソッドを使用して、特定のターゲットに適用できる(またはそうでない)アクションをチェックすることです。これは仮想です。アクションを実行するときに「Handlestarget」、「UpdateTarget」、「ExectEtarget」(TbasicActionのすべてのメンバー)がどのように使用されるかを確認する必要があります。
繰り返しますが、リンクが戻ってきた場合、これについて詳しく説明します。
編集
これは私が探していた投稿ではありませんでしたが、あなたが望むものを正確に説明しているようです:Etutorials:カスタムアクションの定義