2011-05-25 8 views
13

Diseñé mi software con Devexpress y descubrí que las etiquetas no eran transparentes, lo que causaba que tuvieran un fondo gris.¿Configurar etiquetas múltiples para transparentar a través de 1.000 formularios?

Solo hay formularios sin fin, por lo que me preguntaba si había una manera de hacer esta tarea (de establecer etiquetas transparentes) automáticamente.

Hice algo similar anteriormente, los controles Devexpress en el formulario tenían LookAndFeel.NativeStyle = Es cierto, utilicé Grep Search para reemplazarlo a False en todos los formularios dfm. Sin embargo, en el caso de la etiqueta, la propiedad transparente no está presente.

Gracias.

+0

¿Estás comprometido a hacer esto en el IDE, o habría que estar bien con él que es hecho en tiempo de ejecución? – RobertFrank

+0

Robert, eso sería fantástico, quiero decir en el tiempo de ejecución. ¿Qué puedo hacer para lograr ese resultado? – Rosenberg

+0

En lugar de hacerlo en tiempo de diseño, podría hacerlo más fácilmente en tiempo de ejecución –

Respuesta

14

El Screen variable global mantiene un registro de todas las formas:

procedure MakeLabelsTransparent(AParent: TWinControl); 
var 
    I: Integer; 
begin 
    with AParent do 
    for I := 0 to ControlCount - 1 do 
     if Controls[I] is TLabel then 
     TLabel(Controls[I]).Transparent := True 
     else if Controls[I] is TWinControl then 
     MakeLabelsTransparent(TWinControl(Controls[I])); 
end; 

procedure TMainForm.ActiveFormChange(Sender: TObject); 
begin 
    with Screen do 
    if (ActiveCustomForm <> nil) and (ActiveCustomForm.Tag = 0) then 
    begin 
     MakeLabelsTransparent(ActiveCustomForm); 
     ActiveCustomForm.Tag := 1; 
    end; 
end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    Screen.OnActiveFormChange := ActiveFormChange; 
end; 

Y si usted tiene que utilizar la Etiquetar propiedad para un formulario particular, luego omita este control: realmente no sería mucho más lento.

+0

+1 Ingenious, NGLN. No sabía cómo usar OnActiveFormChange. – RobertFrank

+0

Perfecto, trabaje en todos los formularios MDI simultáneamente, simplemente perfecto ... Gracias. – Rosenberg

+2

Las etiquetas no necesitan ser propiedad de la forma en que viven. Sería más robusto caminar recursivamente la propiedad indexada Controles. –

1

Puede establecer la propiedad BackColor en Color.Transparent.

+4

Bueno, creo que OP quiere establecer 'Label.Transparent: = True' pero el verdadero problema aquí es cómo automatizar el cambio –

1

Lo siguiente debería funcionar: la propiedad transparent está presente en el archivo DFM solo si el valor no es el predeterminado. Entonces puede usar una búsqueda Grep para insertar "transparente = VERDADERO" justo en la siguiente línea después de "= TLabel". No he probado esto por mí mismo, pero es fácil de tratar ...

5

En tiempo de diseño, sólo puede analizar todo .dfm a continuación, añadir la línea

Transparent = True 

justo después de cualquier

object MyLabel : TLabel 

línea.

En tiempo de ejecución, es posible anular los métodos TCustomForm.DoCreate y TCustomFrame.Create, como tal:

type 
    THookedForm = class(TCustomForm) 
    procedure HookedDoCreate; 
    end; 

    THookedFrame = class(TCustomFrame) 
    constructor Create(AOwner: TComponent); override; 
    end; 

var 
    PatchForm, OriginalForm: TPatchEvent; 
    PatchPositionForm: PPatchEvent = nil; 
    PatchFrame, OriginalFrame: TPatchEvent; 
    PatchPositionFrame: PPatchEvent = nil; 

procedure PatchCreate; 
var ov: cardinal; 
begin 
    // hook TForm: 
    PatchPositionForm := PPatchEvent(@THookedForm.DoCreate); 
    OriginalForm := PatchPositionForm^; 
    PatchForm.Jump := $E9; // Jmp opcode 
    PatchForm.Offset := PtrInt(@THookedForm.HookedDoCreate)-PtrInt(PatchPositionForm)-5; 
    if not VirtualProtect(PatchPositionForm, 5, PAGE_EXECUTE_READWRITE, @ov) then 
    RaiseLastOSError; 
    PatchPositionForm^ := PatchForm; // enable Hook 
    // hook TFrame: 
    PatchPositionFrame := PPatchEvent(@TCustomFrame.Create); 
    OriginalFrame := PatchPositionFrame^; 
    PatchFrame.Jump := $E9; // Jmp opcode 
    PatchFrame.Offset := PtrInt(@THookedFrame.Create)-PtrInt(PatchPositionFrame)-5; 
    if not VirtualProtect(PatchPositionFrame, 5, PAGE_EXECUTE_READWRITE, @ov) then 
    RaiseLastOSError; 
    PatchPositionFrame^ := PatchFrame; // enable Hook 
end; 

{ THookedForm } 

procedure THookedForm.HookedDoCreate; 
var i: integer; 
begin 
    // enumerate all labels, then set Transparent := true 
    for i := 0 to Components.Count-1 do 
    if Components[i] is TLabel then 
     TLabel(Components[i]).Transparent := true; 
    DoCreate; // call initial code 
end; 

{ THookedFrame } 

constructor THookedFrame.Create(AOwner: TComponent); 
var i: integer; 
begin 
    // enumerate all labels, then set Transparent := true 
    for i := 0 to Components.Count-1 do 
    if Components[i] is TLabel then 
     TLabel(Components[i]).Transparent := true; 
    inherited Create(AOwner); // call normal constructor 
end; 

.... 

initialization 
    PatchCreate; 
+0

@Warren Es mi primera solución. Y el OP solicitó una solución en tiempo de ejecución, así que di una solución genérica de esta solicitud. –

+0

¡Esta es una buena solución! :-) Leyendo mi comentario, veo que no tengo sentido. –

+0

@Warren gracias;) –

9

Para este tipo de tarea, GExperts contiene los Establecer las propiedades del componente herramienta:

Esta herramienta espera en el fondo hasta que compila un proyecto. Luego escanea los formularios del proyecto actual a verifica los componentes con ciertas propiedades y cambia esas propiedades a un valor definido. Esta herramienta es útil para desactivar los conjuntos de datos o las conexiones a la base de datos antes de compilar sus aplicaciones, pero puede usarse para cualquier situación similar a . Para activar el escaneo, habilite la casilla de verificación junto a este experto en la pantalla de configuración de GExperts .

Se puede usar para establecer una propiedad que aún no está en el DFM, y solo requiere una entrada adicional en la configuración de GExpert, y una recompilación.

Acabo de probarlo y funciona como se esperaba.

+0

Lo recomiendo, ya que es posible que algún día desee una etiqueta no transparente y pueda configurarla de otra manera. –

+0

Definitivamente la segunda mejor solución. No tenía idea de esto. Un millón de gracias. – Rosenberg

5

Un consejo relacionado (siempre me olvido de hacer uso de esta característica práctica):

  1. Configurar la etiqueta de la forma en que desea tenerlo;
  2. Selecciónelo en el formulario;
  3. Ir a Component/Create component template;
  4. A continuación, puede un nombre para la plantilla:

enter image description here

A partir de entonces, la plantilla aparece como un nuevo tipo de componente en la paleta de herramientas, con los ajustes que prefiera.

(Sí, sé que esto no cambia las etiquetas actuales)

+0

bueno, probaré esto en uno de mis componentes personalizados cuyos valores predeterminados están establecidos en piedra –

+1

Aunque esto no proporciona una solución a la pregunta, es ** realmente útil **. Nunca pensé en hacer clic en el menú 'Crear plantilla de componente'. ¡Gracias! – Rosenberg

Cuestiones relacionadas