2012-06-20 19 views
5

Al hacer doble clic en TStaticText en un formulario, se copia el título de ese TStaticText en el portapapeles. No es necesario hacer doble clic.haciendo doble clic en TStaticText en la aplicación Delphi XE2 copia el título en el portapapeles

Pasos para reproducir:

  • Uso de la actualización Win 64 y Delphi XE2 4.
  • Crear una VCL Formas de aplicación.
  • Coloque un TEdit en el formulario.
  • Coloque un TStaticText en el formulario. Cambie el título a "TStaticText1Caption"
  • Coloque un segundo TStaticText en el formulario. Cambiar título a "TStaticText2Caption"
  • Ejecutar programa (F9)
  • Escriba texto en el TEdit. Selecciónelo todo y cópielo mediante CTRL + C.
  • Borre el texto en el TEdit. Pégalo para verificar que el texto sea lo que copiaste.
  • Borre el texto en el TEdit.
  • Haga doble clic en TStaticText.
  • Pega el texto en TEdit. Observe que no es el texto original copiado, sino el título de TStaticText.

Ya he enviado un informe de error a Embarcadero.

Intenté asignar un evento de doble clic a los TStaticTexts. Todavía copia el título al portapapeles aunque ejecuta el evento de doble clic.

procedure TForm1.StaticText1DblClick(Sender: TObject); 
begin 
    Edit1.Text := 'Hello'; 
end; 

procedure TForm1.StaticText2DblClick(Sender: TObject); 
begin 
    Edit1.Text := 'World'; 
end; 

Esto no ocurre con TLabel o cualquier otro control de VCL que he probado.

Tenemos muchos TStaticTexts en nuestros formularios con fines de diseño visual y cambiar a TLabels no es una opción.

¿Alguien tiene alguna idea sobre cómo evitar que esto suceda?

Respuesta

8

Esto no es un error de delphi, este comportamiento es causado por el Windows Static Control que se crea mediante el componente TStaticText VCL.

A partir de Windows Vista, los controles de texto estático copiar automáticamente su contenido en el portapapeles cuando se hace doble clic en ellos si se establece el estilo SS_NOTIFY (el estilo SS_NOTIFY se establece por el método CreateParams del componente TCustomStaticText)

Recomendados conferencias How do I make it so that users can copy static text on a dialog box to the clipboard easily?

como Solución puede quitar el estilo SS_NOTIFY anulando método de los CreateParams al igual que

type 
    TStaticText = class(Vcl.StdCtrls.TStaticText) 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

    TForm1 = class(TForm) 
    StaticText1: TStaticText; 
    private 
    public 
    end; 

var 
    Form1: TForm42; 

implementation 

{$R *.dfm} 

{ TStaticText } 

procedure TStaticText.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    with Params do 
    Style := Style and not SS_NOTIFY; 
end; 

Nota: hay que tener en cuenta si se quita este estilo desde el control que no recibirá la STN_CLICKED, STN_DBLCLK, STN_DISABLE y códigos de notificación STN_ENABLE cuando el usuario hace clic o doble clic en el control.

+0

De acuerdo con el artículo al que se ha vinculado, existe una alternativa: "si desea desactivar la función * doble clic para copiar * en un control estático' SS_NOTIFY', debe subclasificar el control estático y comer los clics tú mismo." –

+0

Sí, esa es una opción válida también. – RRUZ

+0

Agradezco la respuesta. Supongo que es un cambio interno de cómo se crean los controles de VCL con Delphi más nuevo en comparación con Delphi más antiguo. Nos hemos encontrado con muchos pequeños problemas al convertir de Delphi 6 a XE2. Tendremos que encontrar una alternativa donde esto causaría un problema. –

Cuestiones relacionadas