Saltar al contenido

Tutorial de estilos de Delphi VCL: cómo cambiar el estilo en tiempo de ejecución

Anduvimos recabado por diferentes foros y así de este modo traerte la solución para tu dilema, si continúas con dificultades puedes dejar un comentario y contestaremos porque estamos para ayudarte.

Solución:

Estoy agregando una respuesta porque a menudo se prefiere la información local a solo los enlaces.

Aquí esta la key hechos que necesita saber antes de comenzar:

  1. Muchos controles VCL tienen propiedades de color, pero esas propiedades se ignorarán cuando los estilos estén activados, y los “controles comunes” predeterminados, como Button, serán dibujados por Delphi, en lugar de usar el estilo XP o Windows 2000 que “viene con ventanas “.

  2. De alguna manera, en lo más profundo de su aplicación, los estilos VCL ponen ganchos que se encargan de pintar sus controles. Todo lo que pueda manejar se dibujará usando una “máscara” encima de los controles normales. Mucha gente llama a esto “skinning the vcl”, y antes de los estilos VCL, es posible que haya encontrado un sistema de skin de terceros. Ahora está integrado.

  3. Todo lo que no esté enganchado seguirá teniendo el estilo normal. Por lo tanto, la mayoría de los controles de terceros y algunas partes de la VCL no serán temáticas. No espere resultados perfectos al instante. Además, es posible que a veces vea algunos parpadeos momentáneos o fallas como resultado del desollado, eso es de esperar. Agregue la carga de estilos en tiempo de ejecución, y la calidad final de su resultado es una incógnita. No puede garantizar necesariamente que el estilo que se carga en tiempo de ejecución contendrá todo lo que podría querer que contenga. Tampoco puede garantizar eso con uno que incluya estáticamente en su aplicación, pero al menos los que incluya estáticamente podrían ser verificados por su equipo de control de calidad (que podría ser usted).

Y estos son los pasos más simples para comenzar: Realmente, solo los pasos del 2 al 4 son esenciales.

  1. Haga clic en Archivo -> Nuevo -> Proyecto de formularios VCL.

  2. Haga clic con el botón derecho en las opciones del proyecto en el panel Administrador de proyectos y haga clic en Propiedades. Vaya a Aplicación -> Apariencia

  3. Haga clic en un estilo personalizado para activarlo. (Amakrits es el primero en mi lista, así que haré clic en eso).

  4. Haga clic en el cuadro combinado Estilo predeterminado y cámbielo a otro que no sea el predeterminado.

  5. Pon algo en tu formulario para que no esté vacío. (Un botón, un cuadro de lista, etc.).

  6. Ejecute su aplicación.

ingrese la descripción de la imagen aquí

Ahora, cosas avanzadas: Cambia tu estilo en tiempo de ejecución:

Utilizo este botón, haga clic y formcreate para hacer eso:

Agregar fdefaultStyleName:String; a la sección privada de su formulario.

Asegurarse Vcl.Themes está en su cláusula de usos.

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Assigned(TStyleManager.ActiveStyle) and (TStyleManager.ActiveStyle.Name<>'Windows') then begin
   TStyleManager.TrySetStyle('Windows');
 end else begin
   TStyleManager.TrySetStyle(fdefaultStyleName); // whatever was in the project settings.
 end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if Assigned(TStyleManager.ActiveStyle) then
  fdefaultStyleName := TStyleManager.ActiveStyle.Name;

end;

Un ejemplo (procedimiento público). Recuerde que usa Vcl.Themes;

procedure TData.AllowSKIN( bSKIN:boolean );
var
    sSKIN:string;
begin
    sSKIN := 'Aqua Light Slate';
    if not bSKIN then sSKIN := 'Windows';
    TStyleManager.TrySetStyle( sSKIN );
end;

Tengo un formulario (plantilla) que llamo en mi aplicación para permitir que el usuario configure máscaras. Simplemente ShowSkinForm para mostrar el formulario. También puede llamar a LoadLastSkin durante la inicialización de la aplicación para que la última máscara se aplique automáticamente.

UNIT FormSkinsDisk;

    -----------------
   2017.02.23
   Universal skin loader. Loads skins from disk (vsf file)

   To use it:
      Application.ShowMainForm:= FALSE;   
      MainForm.Visible:= FALSE; // Necessary so the form won't flicker during skin loading at startup
      LoadLastSkin  (during application initialization)
      MainForm.Show;
      Skins should be present in the 'Systemskins' folder

  Skins folder:
         c:UsersPublicDocumentsEmbarcaderoStudio15.0Styles

  KNOWN BUG:
     TStyleManager.IsValidStyle always fails if Vcl.Styles is not in the USES list!!  http://stackoverflow.com/questions/30328644/how-to-check-if-a-style-file-is-already-loaded
-------------------------------------------------------------------------------------------------------------

INTERFACE                                                                                                     $WARN GARBAGE OFF   Silence the: 'W1011 Text after final END' warning 

USES
  System.SysUtils, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, System.Classes, System.Types;

TYPE
  TfrmSkinsDisk = class(TForm)
    lBox: TListBox;
    procedure FormCreate  (Sender: TObject);
    procedure FormDestroy (Sender: TObject);
    procedure lBoxClick   (Sender: TObject);
    procedure FormClose   (Sender: TObject; var Action: TCloseAction);
    procedure lblTopClick (Sender: TObject);
  private
    procedure FillLstBox;
  public
 end;


procedure LoadLastSkin(CONST DefaultSkin: string= '');     On first run, set the DefaultSkin to an existing file (no path) like: 'Graphite Green.vsf'. Leave it empty if you want the default Windows theme to load 
procedure ShowSkinForm;



IMPLEMENTATION $R *.dfm

USES
   IOUtils, Vcl.Styles, cIO, vcl.Themes, cINIFile, cINIFileEx, CubicTPU;   VCL.Styles is mandatory here

VAR
  SkinFile: string;                                               Disk short file name (not full path) for the current loaded skin 

CONST
    DefWinTheme= 'Windows default theme';





-----------------------------------------------------------------------------------------
   UTILS
-----------------------------------------------------------------------------------------

function GetSkinDir: string;
begin
 Result:= GetAppSysDir+ 'skins';
end;


function LoadSkinFromFile(CONST DiskShortName: string): Boolean;
VAR  Style : TStyleInfo;
begin
 Result:= FileExists(GetSkinDir+ DiskShortName);

 if Result then
  if TStyleManager.IsValidStyle(GetSkinDir+ DiskShortName, Style)
  then
    if NOT TStyleManager.TrySetStyle(Style.Name, FALSE)
    then
      begin
       TStyleManager.LoadFromFile(GetSkinDir+ DiskShortName);
       TStyleManager.SetStyle(Style.Name);
      end
    else Result:= FALSE
  else
     MesajError('Style is not valid: '+ GetSkinDir+ DiskShortName);
end;


procedure LoadLastSkin(CONST DefaultSkin: string= '');
begin
 SkinFile:= cINIFile.ReadString('LastDiskSkin', DefaultSkin);                                                   This is a relative path so the skin can still be loaded when the application is moved to a different folder 

 if SkinFile = ''
 then SkinFile:= DefaultSkin;

 if (SkinFile > '')
 AND (SkinFile <> DefWinTheme)               DefWinTheme represents the default Windows theme/skin. In other words don't load any skin file. Let Win skin the app 
 then LoadSkinFromFile(SkinFile);
end;


procedure ShowSkinForm;
VAR
   frmSkins: TfrmSkinsDisk;
begin
 frmSkins:= TfrmSkinsDisk.Create(NIL);
 frmSkins.ShowModal;
 FreeAndNil(frmSkins);
end;




----------------------------------------------------------------------------------------
   CREATE
-----------------------------------------------------------------------------------------

procedure TfrmSkinsDisk.FormCreate(Sender: TObject);
begin
 LoadForm(Self);
 FillLstBox;      Populate skins 
end;


procedure TfrmSkinsDisk.FormDestroy(Sender: TObject);
begin
 SaveForm(Self);
 cINIFile.WriteString ('LastDiskSkin', SkinFile);
end;

procedure TfrmSkinsDisk.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:= caFree;
end;







-----------------------------------------------------------------------------------------------------------------------
   Populate skins
-----------------------------------------------------------------------------------------------------------------------

procedure TfrmSkinsDisk.lblTopClick(Sender: TObject);
begin
 FillLstBox;
end;


procedure TfrmSkinsDisk.FillLstBox;      Populate skins 
VAR
   s, FullFileName: string;
begin
 lBox.Items.Clear;
 lBox.Items.Add(DefWinTheme);     This corresponds to Windows' default theme 
 lblTop.Hint:= GetSkinDir;

 if NOT DirectoryExists(GetSkinDir) then
  begin
   lblTop.Caption:= 'The skin directory could not be located! '+ GetSkinDir+ CRLF+ 'Add skins then click here to refresh the list.';
   lblTop.Color:= clRedBright;
   lblTop.Transparent:= FALSE;
   EXIT;
  end;

  Display all *.vsf files 
 for FullFileName in TDirectory.GetFiles(GetSkinDir, '*.vsf') DO
  begin
   s:= ExtractFileName(FullFileName);
   lBox.Items.Add(s);
  end;
end;



procedure TfrmSkinsDisk.lBoxClick(Sender: TObject);
begin
 if lBox.ItemIndex < 0 then EXIT;

 SkinFile:= lBox.Items[lBox.ItemIndex];
 if SkinFile= DefWinTheme then
  begin
   TStyleManager.SetStyle('Windows');
   SkinFile:= DefWinTheme;
  end
 else
  if LoadSkinFromFile(SkinFile) then
   begin
     Bug fix                                                                                    fix for this bug: http://stackoverflow.com/questions/30328924/form-losses-modal-attribute-after-changing-app-style 
    Application.ProcessMessages;
    BringToFront;
   end;
end;


end.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *