estendendo la Delphi azione TEditCopy di copiare anche elementi ListBox negli appunti

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

  •  27-09-2019
  •  | 
  •  

Domanda

Ho una forma con la maggior parte delle sue funzionalità implementate utilizzando dell'aderenza in marcia standard. Ho un menu, una barra degli strumenti, e alcune toobuttons. Ho implementato copia negli appunti / incolla senza codice a tutti, usando solo le azioni TEditCopy e TEditPaste. Esso funziona perfettamente nelle caselle TEdit e TMemo ho.

Ora, voglio lavorare con TListBox, anche. In particolare, voglio essere in grado di copiare l'elemento elenco selezionato in un TListBox utilizzando gli stessi menuitems, scorciatoie da tastiera e toolbuttons.

Quindi, credo che avrò bisogno di estendere l'azione TEditCopy. Ma non sembra molto semplice per me. In particolare, i controlli TEditAction dei concentrati di controllo per un controllo TCustomEdit, quale un TListBox non lo è. Io sono un po 'paura che possa essere solo troppo lavoro.

L'ovvia alternativa è quello di dimenticare appena circa le azioni standard e realizzare la copia clipbard nel metodo OnExecute di un dell'aderenza in marcia generico.

Ma, prima di rinunciare, avete qualche idea, suggerimento o trucco che mi avrebbe aiutato a estendere l'azione TEditCopy norma?

È stato utile?

Soluzione

Si dovrebbe ignorare sia i gestori di eventi di un dell'aderenza in marcia o creare un nuovo discendente che unisce i codici da TEditAction / TEditCopy con la gestione extra per TListBox.

Il punto di estensione per le azioni sta mettendo i gestori OnExecute / OnUpdate evento, e che non funziona qui perché sarebbe disabilitare la gestione TEdit esistente. Si potrebbe scende da TEditCopy e l'override dei metodi, ma probabilmente sarebbe tanto codice come una nuova classe che discende direttamente dal dell'aderenza in marcia. Ci potrebbe essere qualche altro trucco di basso livello che avrebbe funzionato, ma io non lo vedo, e anche se ci fosse, è garantito per essere meno gestibile rispetto all'approccio documentato.

Altri suggerimenti

Ecco l'hack sono uscito da implementare.

E non richiede di modificare manualmente l'ActionList oi MenuItems e toolbuttons ho già fatto, perché io continuo a stesso nome TEditCopy per 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;

Si estende l'azione TEditCopy serie con la funzionalità richiesta di sostenere TListBox pure.

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;

Il resto dell'applicazione è invariato. Tutto il copia / incolla functionalit è ancora implementata senza codice a tutti.

Mi ricordo di aver qualcosa di lettura sul web su di esso, ma non riesco a trovare la parte posteriore di collegamento. Se mi trovo di nuovo, ti dirò di più preciso su di esso.

Quello che mi ricordo, però, è che l'azione controlla se esso può essere applicato (o meno) ad un obiettivo particolare utilizzando il metodo "TBasiAction.HandlesTarget" - che è virtuale. Si dovrebbe controllare come i metodi "HandlesTarget", "UpdateTarget" e "ExecuteTarget" (tutti i membri del TBasicAction) vengono utilizzati durante l'esecuzione di un'azione.

Anche in questo caso, più su questo se trovo il link di ritorno.

[Modifica]

Questo non era il posto che cercavo, ma sembra descrivere esattamente quello che vuoi: etutorials: azioni Definizione dei

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top