extender la acción delphi TEditCopy también copiar elementos de cuadro de lista en el portapapeles

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

  •  27-09-2019
  •  | 
  •  

Pregunta

Tengo un formulario con la mayor parte de su funcionalidad implementada utilizando taction estándar. Tengo un menú, una barra de herramientas, y algunos toobuttons. He implementado portapapeles copia / pega con ningún código en absoluto, sólo el uso de acciones TEditCopy y TEditPaste. Funciona perfecto en las cajas TEDIT y TMemo que tengo.

Ahora, yo quiero que funcione con TListBox, también. En concreto, quiero ser capaz de copiar el elemento de la lista seleccionada en un TListBox utilizando los mismos menuitems, accesos directos y botones de herramientas clave.

Por lo tanto, creo que voy a necesitar extender la acción TEditCopy. Pero no parece muy sencillo para mí. En particular, los controles TEditAction para el centraron de control para ser un control TCustomEdit, que un TListBox no lo es. Tengo un poco de miedo de que sea demasiado trabajo.

La alternativa obvia es olvidarse de las acciones estándar y ejecutar la copia de Clipbard en el método OnExecute de un taction genérico.

Sin embargo, antes de renunciar, ¿tienes alguna idea, sugerencia o truco que me ayudaría a prolongar la acción TEditCopy estándar?

¿Fue útil?

Solución

Se debe reemplazar cualquiera de los controladores de eventos de un taction o crear un nuevo descendiente que combina los códigos de TEditAction / TEditCopy con el manejo adicional para TListBox.

El punto de extensión de las acciones está fijando los manipuladores OnExecute / OnUpdate evento, y que no va a funcionar aquí, ya que podría desactivar el manejo TEdit existente. Se podría descender desde TEditCopy y anular los métodos, pero probablemente sería tanto código como una nueva clase que descendía directamente de taction. Es posible que haya algún otro truco bajo nivel que trabajar, pero yo no lo veo, e incluso si lo hubiera, se garantiza que sea menos fácil de mantener que el enfoque documentado.

Otros consejos

Aquí está el truco Salí de implementar.

No requiere cambiar manualmente el ActionList o los MenuItems y botones de herramientas que ya tengo, porque me quedo con el mismo nombre TEditCopy para la clase.

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

Se extiende la acción TEditCopy estándar con la funcionalidad requerida de apoyar TListBox también.

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;

El resto de la aplicación no se ha modificado. Todo el copiar / pegar functionalit todavía se implementa con ningún código en absoluto.

Me acuerdo de tener algo de lectura en la web al respecto, pero no puedo encontrar el enlace de vuelta. Si encuentro de vuelta, te voy a decir más precisamente en ello.

Lo que recuerdo, sin embargo, es que una acción cheques wether que se pueden aplicar (o no) a un objetivo en particular mediante el método "TBasiAction.HandlesTarget" - que es virtual. Debe comprobar cómo se utilizan los métodos "HandlesTarget", "UpdateTarget" y "ExecuteTarget" (todos los miembros de TBasicAction) al ejecutar una acción.

Una vez más, más sobre esto si encuentro el enlace de vuelta.

[Editar]

Esto no era el puesto que estaba buscando, pero parece describir exactamente lo que quiere: etutorials: Definición de acciones personalizadas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top