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):
- Configure la etiqueta de la manera que desee tenerla;
- Seleccionarlo en el formulario;
- Vaya a
Component/Create component template
; - 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.