Verlängerung der delphi TEditCopy Aktion auch Listbox Elemente Zwischenablage kopieren

StackOverflow https://stackoverflow.com/questions/2652322

  •  27-09-2019
  •  | 
  •  

Frage

habe ich ein Formular mit den meisten seiner Funktionalität mit implementiert Standard TAction. Ich habe ein Menü, eine Symbolleiste und einige toobuttons. Ich habe Zwischenablage kopieren implementiert / paste ohne Code überhaupt, nur TEditCopy und TEditPaste Aktionen verwenden. Es funktioniert perfekt in der TEdit und TMemo Boxen ich habe.

Jetzt will ich es mit TListBox arbeiten, auch. Insbesondere möchte ich die ausgewählte Listenelement in einem TListBox mit den gleichen menuitems, Tastenkürzel und Toolbuttons in der Lage sein zu kopieren.

Also, ich glaube, ich werde die TEditCopy Aktion verlängern müssen. Aber es scheint nicht sehr einfach für mich. Insbesondere konzentrierten sich die TEditAction prüft, ob die Steuerung eine TCustomEdit Kontrolle zu sein, die ein TListBox es nicht ist. Ich bin ein wenig Angst, dass es einfach zu viel Arbeit sein wird.

Die offensichtliche Alternative ist, über die Standard-Aktionen zu einfach vergessen und die Kopie Clipbard im OnExecute Verfahren eines generischen TAction zu implementieren.

Aber, bevor er aufgibt, haben Sie eine Idee, Tipp oder Trick, der mir die Standard TEditCopy Aktion verlängern würde helfen?

War es hilfreich?

Lösung

Sie sollten entweder den Ereignishandler eines TAction außer Kraft setzen oder einen neuen Nachkommen dass Mähdrescher des Code von TEditAction / TEditCopy mit der zusätzlichen Handhabung für TListBox erstellen.

Der Erweiterungspunkt für Aktionen wird die Einstellung der OnExecute / OnUpdate Event-Handler, und das wird hier nicht funktionieren, weil es die bestehende TEdit Handhabung deaktivieren würde. Sie könnten von TEditCopy absteigen und die Methoden zu überschreiben, aber es wäre wahrscheinlich so viel Code als eine neue Klasse, die gerade aus TAction abstammen. Es könnte einige andere Low-Level-Hack, die funktionieren würde, aber ich sehe es nicht, und selbst wenn es, es ist garantiert, dass weniger wartbar als die dokumentierten Ansatz.

Andere Tipps

Hier ist der Hack, den ich kam zu implementieren.

Es erfordert nicht manuell die Action oder die MenuItems und Toolbuttons ändern, die ich schon habe, weil ich die gleichen Namen hält TEditCopy für die Klasse.

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

Es erweitert die Standard-TEditCopy Aktion mit der erforderlichen Funktionalität als auch TListBox unterstützen.

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;

Der Rest der Anwendung ist unverändert. Alle Kopieren / Einfügen Functionalit ist noch ohne Code überhaupt umgesetzt werden.

Ich erinnere mich darüber lesen etwas auf dem Netz haben, aber ich kann den Link zurück nicht finden. Wenn ich es wieder finden, ich werde Ihnen sagen, genauer gesagt über sie.

Was ich mich erinnere, ist jedoch, dass eine Aktion überprüft, ob sie angewandt werden kann (oder nicht) zu einem bestimmten Ziel, die „TBasiAction.HandlesTarget“ Methode - die virtuell ist. Sie sollten prüfen, wie die Methoden „Handles“, „Update“ und „ExecuteTarget“ (alle Mitglieder von TBasicAction) verwendet werden, wenn eine Aktion ausgeführt wird.

Auch hier mehr darüber, wenn ich den Link zurück finden.

[Bearbeiten]

Das war nicht die Post die ich suchte, aber es scheint, genau zu beschreiben, was Sie wollen: etutorials: definieren von benutzerdefinierten Aktionen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top