sirve que para bootstrap delphi delphi-2010 delphi-7 delphi-xe

delphi - que - fieldset bootstrap



¿Establecer etiquetas múltiples para transparentar a través de 1.000 formularios? (6)

Despellejé mi software con Devexpress y descubrí que las etiquetas no eran transparentes, lo que causaba que tuvieran un fondo gris.

Simplemente hay formularios infinitos, así que me preguntaba si había una forma de hacer esta tarea (de establecer etiquetas transparentes) automáticamente.

Hice algo similar antes, los controles Devexpress en el formulario tenían LookAndFeel.NativeStyle = True, 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.


En el momento del diseño, puede analizar todos los archivos .dfm y luego agregar el

Transparent = True

línea justo después de cualquier

object MyLabel : TLabel

línea.

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

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;


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 lo he intentado yo mismo, pero es fácil de probar ...


Para este tipo de tarea, GExperts contiene la herramienta Establecer propiedades de componentes :

Esta herramienta espera en segundo plano hasta que compile un proyecto. Luego escanea los formularios del proyecto actual para verificar los componentes con ciertas propiedades y cambia esas propiedades a un valor definido. Esta herramienta es útil para desactivar conjuntos de datos o conexiones de bases de datos antes de compilar sus aplicaciones, pero también se puede usar para situaciones similares. Para activar el escaneo, habilite la casilla de verificación junto a este experto en la pantalla 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.


Puede establecer la propiedad BackColor en Color.Transparent .


Un consejo relacionado (siempre me olvido de usar esta práctica función):

  1. Configure la etiqueta de la manera que desee tenerla;
  2. Seleccionarlo en el formulario;
  3. Vaya a Component/Create component template ;
  4. Puede entonces un nombre para la plantilla:

A partir de ese momento, la plantilla aparece como un nuevo tipo de componente en la paleta de herramientas, con la configuración que prefiera.

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


La variable de Screen global realiza un seguimiento 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 tiene que usar la propiedad Tag para un formulario en particular, entonces omita este control: realmente no sería mucho más lento.