estendendo o delphi TEditCopy ação de também copiar itens de caixa de listagem para a área de transferência

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

  •  27-09-2019
  •  | 
  •  

Pergunta

Eu tenho um formulário com a maior parte das funcionalidades implementadas utilizando o padrão de Tato.Eu tenho um menu, uma barra de ferramentas, e alguns toobuttons.Implementei a área de transferência copiar/colar com nenhuma linha de código, usando apenas TEditCopy e TEditPaste ações.Ele funciona perfeito no TEdit e TMemo caixas que eu tenho.

Agora, eu quero que ele funcione com TListBox, também.Especificamente, eu quero ser capaz de copiar o item de lista selecionada em um TListBox utilizando as mesmas os itens dos menus, atalhos de teclas e toolbuttons.

Então, eu acredito que será necessário estender o TEditCopy Ação.Mas ele não parece muito em linha reta de frente para mim.Em particular, o TEditAction verifica o foco de controle para ser um TCustomEdit de controle, que um TListBox é não.Eu sou um pouco de medo de que ele vai ser apenas muito trabalho.

A alternativa óbvia é simplesmente esquecer o padrão de ações e implementar a cópia para clipbard no OnExecute método de um genérico Tato.

Mas, antes de desistir, você tem alguma ideia, dica ou truque que iria me ajudar a estender o padrão TEditCopy ação?

Foi útil?

Solução

Você deve substituir os manipuladores de eventos de uma tação ou criar um novo descendente que combine o código do Teditaction/TeditCopy com o manuseio extra para o TlistBox.

O ponto de extensão das ações é definir os manipuladores de eventos Onexecute/OnUpdate, e isso não funcionará aqui porque desativaria o manuseio do TEDIT existente. Você poderia descer do TeditCopy e substituir os métodos, mas provavelmente seria o código tão uma nova classe que desceu diretamente da Taction. Pode haver outro hack de baixo nível que funcionaria, mas eu não o vejo e, mesmo que houvesse, é garantido que seja menos sustentável do que a abordagem documentada.

Outras dicas

Aqui está o hack que saí para implementar.

Não é necessário alterar manualmente a lista de ação ou os menuitems e as ferramentas que eu já tenho, porque mantenho o mesmo nome TeditCopy para a classe.

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

Ele estende a ação padrão do TEDITCOPY com a funcionalidade necessária de suportar o TlistBox também.

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;

O restante do aplicativo permanece inalterado. Toda a cópia/pasta funcionalit ainda é implementada sem nenhum código.

Eu lembro de ter lido algo na internet sobre isso, mas eu não consigo encontrar o link de volta.Se eu encontrar, eu vou te dizer mais precisamente sobre isso.

O que eu me lembro, porém, é que uma ação verifica se ele pode ser aplicado (ou não) a um determinado objectivo, utilizando o "TBasiAction.HandlesTarget método de" o que é virtual.Você deve verificar como os métodos "HandlesTarget", "UpdateTarget" e "ExecuteTarget" (todos os membros da TBasicAction) são utilizados durante a execução de uma Ação.

Novamente, mais sobre isso, se eu encontrar o link de volta.

[Editar]

Este não era o post que eu estava procurando, mas parece descrever exatamente o que você deseja :etutorials :A Definição De Acções Personalizadas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top