Como alterar o tema de um form específico em runtime (Delphi)

Delphi

28/09/2023

Boa tarde, estava criando um form para exibir uma mensagem qualquer de forma mais personalizada do que o MessageDlg do próprio Delphi, ai cheguei num ponto em que não estou conseguindo avançar.
Observe, eu gostaria de mudar o tema apenas desse form, no momento de sua criação, para que ele tivesse um tema específico independente do tema que a aplicação estiver usando no momento.

Antes que eu me esqueça: a aplicação com o Framework uniGUI, mas estou aceitando soluções que possam ser aplicadas no próprio Delphi pois penso que talvez eu possa adaptá-las.

Alguém poderia me ajudar com isso?

//codigo da class que cria o form e chama para exibir a mensagem
class function TFMessageBox.Mensagem(Titulo, Msg: string; Tipo: TMyType; Botoes: array of TMyButtons; Application: TUniGUIApplication; Theme: string = FDataModulo.Theme; H: Integer = 150; W: Integer = 400): Boolean;
var
  i: Integer;
  frm: TFMessageBox;
begin
  frm := TFMessageBox.Create(Application);
  try
    frm.Caption := Titulo;
    frm.lbMessage.Caption := Msg;
    frm.Height := H;
    frm.Width := W;

    if Theme <> FDataModulo.Theme then
      if Theme in UniServerModule.ThemeManager.AllThemes then
        frm.??? := Theme; // para testar pode comentar esse bloco e remover o parametro

    for i := 0 to Length(Botoes) - 1 do
    begin
      case (Botoes[i]) of
        mbPYes:
          begin
            frm.btYes.Visible := True;
            frm.PnlYes.Visible := True;
          end;
        mbPNo:
          begin
            frm.btNo.Visible := True;
            frm.PnlNo.Visible := True;
          end;
        mbPOk:
          begin
            frm.btOk.Visible := True;
            frm.PnlOk.Visible := True;
          end;
        mbPCancel:
          begin
            frm.btCancel.Visible := True;
            frm.PnlCancel.Visible := True;
          end;
        mbPClose:
          frm.btClose.Visible := True;
      else
        begin
          frm.btOk.Visible := True;
          frm.PnlOk.Visible := True;
        end;
      end;
    end;

    case (Tipo) of
      mtPQuestion:
        begin
          frm.ImgQuestion.Visible := True;
          frm.ImgQuestion.Height := 70;
        end;
      mtPInformation:
        begin
          frm.ImgInformation.Visible := True;
          frm.ImgInformation.Height := 70;
        end;
      mtPWarning:
        begin
          frm.ImgWarning.Visible := True;
          frm.ImgWarning.Height := 70;
        end;
      mtPError:
        begin
          frm.ImgError.Visible := True;
          frm.ImgError.Height := 70;
        end;
      mtPDelete:
        begin
          frm.ImgDelete.Visible := True;
          frm.ImgDelete.Height := 70;
        end
    else
      begin
        frm.ImgInformation.Visible := True;
        frm.ImgInformation.Height := 70;
      end;
    end;

    frm.ShowModal;

    case (frm.ModalResult) of
      mrOk, mrYes:
        result := True;
    else
      result := False;
    end;

  finally
    if (frm <> nil) then
      FreeAndNil(frm);
  end;
end;


Caso precise disponibilizo o form inteiro mediante solicitação.
Lyncon Oliveira

Lyncon Oliveira

Curtidas 0

Respostas

Lyncon Oliveira

Lyncon Oliveira

28/09/2023

Veja que o in
...
; Application: TUniGUIApplication;
...
é de um tipo do próprio uniGUI, que tenho que passar para criar o form corretamente (não sei se removendo o parâmetro e substituindo seu uso por "nil" funcionaria no Delphi (puro, sem ser uniGUI), mas para não funcione sugiro utilizar "TApplication" no lugar de "TUniGUIApplication", e passar "Application" no momento de chamar a função)
GOSTEI 0
Lyncon Oliveira

Lyncon Oliveira

28/09/2023

peço desculpas, não havia tentado compilar antes de publicar aqui, onde se encontram:

...
class function TFMessageBox.Mensagem(Titulo, Msg: string; Tipo: TMyType; Botoes: array of TMyButtons; Application: TUniGUIApplication; Theme: string = FDataModulo.Theme; H: Integer = 150; W: Integer = 400): Boolean;

...


e

...
    if Theme <> FDataModulo.Theme then
      if Theme in UniServerModule.ThemeManager.AllThemes then
        frm.??? := Theme; // para testar pode comentar esse bloco e remover o parametro

...


peço que substitua por, respectivamente, os seguintes códigos:

...
class function TFMessageBox.Mensagem(Titulo, Msg: string; Tipo: TMyType; Botoes: array of TMyButtons; Application: TUniGUIApplication; Theme: string = ''ThemeOfDataModule''; H: Integer = 150; W: Integer = 400): Boolean;

...


e

...
    if Theme = ''ThemeOfDataModule'' then
//      frm.??? := FDataModulo.Theme
    else if Theme in UniServerModule.ThemeManager.AllThemes then
        //frm. := Theme;

...
GOSTEI 0
Lyncon Oliveira

Lyncon Oliveira

28/09/2023

Perdão, novamente, pela pressa e desatenção não percebi que não estava compilando novamente, após alterar o trecho:
...
...
    if Theme = ''ThemeOfDataModule'' then
//      frm.??? := FDataModulo.Theme
    else if Theme in UniServerModule.ThemeManager.AllThemes then
        //frm. := Theme;

...


por

...
    if Theme = 'ThemeOfDataModule' then
//      frm.??? := FDataModulo.Theme
    else
      for i := 0 to High(UniServerModule.ThemeManager.AllThemes) do
        if UniServerModule.ThemeManager.AllThemes[i] = Theme then
        begin
//              frm.??? := Theme;
          Break;
        end;

...


Irá compilar (ainda não sei como definir o tema);
GOSTEI 0
POSTAR