l'extension de la delphi l'action TEditCopy copier également les éléments listbox le presse-papiers

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

  •  27-09-2019
  •  | 
  •  

Question

J'ai une forme avec la plupart de ses fonctionnalités mises en œuvre en utilisant TAction standard. J'ai un menu, une barre d'outils, et quelques toobuttons. J'ai mis en copie de presse-papiers / coller sans code du tout, juste en utilisant des actions TEditCopy et TEditPaste. Il fonctionne parfaitement dans les boîtes TEdit et j'ai TMemo.

Maintenant, je veux travailler avec TListBox aussi. Plus précisément, je veux être en mesure de copier l'élément de la liste sélectionnée dans un TListBox en utilisant les mêmes menuitems, des raccourcis clavier et des boutons d'outils.

Alors, je crois que je vais devoir étendre l'action TEditCopy. Mais il ne semble pas en avant très simple pour moi. En particulier, les contrôles de TEditAction pour le contrôle porté à un contrôle TCustomEdit, qui a TListBox ce n'est pas. Je suis un peu peur que ce sera juste trop de travail.

L'alternative évidente est d'oublier au sujet des actions standard et mettre en œuvre la copie à clipbard dans la méthode OnExecute d'un TAction générique.

Mais, avant d'abandonner, avez-vous une idée, indice ou truc qui me aider à étendre l'action standard TEditCopy?

Était-ce utile?

La solution

Vous devez soit remplacer les gestionnaires d'événements d'un TAction ou de créer un nouveau descendant qui combine le code de TEditAction / TEditCopy avec la manipulation supplémentaire pour TListBox.

Le point d'extension des actions sont des paramètres OnExecute / OnUpdate gestionnaires d'événements, et qui ne fonctionnera pas ici parce qu'il désactiverait la gestion TEdit existante. Vous pouvez descendre de TEditCopy et passer outre les méthodes, mais il serait probablement aussi beaucoup de code comme une nouvelle classe qui est descendu tout droit de TAction. Il pourrait y avoir un autre bidouille de bas niveau qui fonctionnerait, mais je ne le vois pas, et même s'il y avait, il est garanti d'être moins maintenable que l'approche documentée.

Autres conseils

Voici le hack je suis sorti à mettre en œuvre.

Il ne nécessite pas de modifier manuellement le ActionList ou les je l'ai déjà MenuItems et des boutons d'outils, parce que je garde le même nom TEditCopy pour la classe.

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

Il étend l'action standard TEditCopy avec les fonctionnalités requises pour soutenir TListBox ainsi.

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;

Le reste de l'application reste inchangé. Tous les copier / coller Functionalit est toujours mis en œuvre sans code du tout.

Je me souviens avoir lu quelque chose sur le web à ce sujet, mais je ne trouve pas le dos de lien. Si je trouve en arrière, je vais vous le dire plus précisément à ce sujet.

Ce que je me rappelle, cependant, est qu'un contrôle d'action castrés il peut être appliqué (ou non) à une cible particulière en utilisant la méthode « TBasiAction.HandlesTarget » - ce qui est virtuel. Vous devriez vérifier comment les méthodes « HandlesTarget », « UpdateTarget » et « ExecuteTarget » (tous les membres de TBasicAction) sont utilisés lors de l'exécution d'une action.

Encore une fois, plus à ce sujet si je trouve le dos de lien.

[Modifier]

Ce ne fut pas le poste que je cherchais, mais il semble décrire exactement ce que vous voulez: etutorials: Définition des actions personnalisées

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top