Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Dynamische Form-Icons und VCL-Styles

  Alt 10. Dez 2019, 07:25
Ich bekomme es nicht zum laufen mit der oben genannten Methodik.
Gibt es vielleicht noch eine möglichkeit, abgesehen von -border +border style bzw recreatewnd oder wende ich es falsch an?

Im Anhang ist ein Test Projekt, binär sowie quell projekt.

Projekt Datei mit Style Aufruf:
Delphi-Quellcode:
program Project1;

{$IFNDEF MSWindows}
{$MESSAGE ERROR 'This application is made for Windows only!'}
{$ENDIF MSWindows}

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas{Form1},
  Vcl.Themes,
  Vcl.Styles;

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  TStyleManager.TrySetStyle('Jet');
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Hier das Formular:
Delphi-Quellcode:
unit Unit1;

{$IFNDEF MSWindows}
{$MESSAGE ERROR 'This unit is made for Windows only!'}
{$ENDIF MSWindows}

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
  private
    // Procedure WMGetIcon(var msg : TMessage); message WM_GETICON; // Original
    procedure WMGetIcon(var Msg: TWMGetIcon); message WM_GETICON; // Windows.pas
    procedure WMSetIcon(var Msg: TWMSetIcon); message WM_SETICON; // testweise mit Set anstelle Get
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Application.Icon := Image1.Picture.Icon; // bewirkt: nichts. -> ohne Style = Application.Icon und Form.Icon sind gesetzt
  // Application.MainForm.Icon := Image1.Picture.Icon; // bewirkt: Application.Icon ist gesetzt. (TaskBar Icon) -> ohne Style = Application.Icon und Form.Icon sind gesetzt
  // Self.Icon := Image1.Picture.Icon; // bewirkt: Application.Icon ist gesetzt. (TaskBar Icon) -> ohne Style = Application.Icon und Form.Icon sind gesetzt
  Icon := Image1.Picture.Icon; // bewirkt: Application.Icon ist gesetzt. (TaskBar Icon) -> ohne Style = Application.Icon und Form.Icon sind gesetzt
  if Checkbox1.Checked then
    RecreateWnd;
end;

(*
  // original
  procedure TForm1.WMGetIcon(var msg: TMessage);
  begin
  msg.Result := Icon.Handle;
  end;
*)


procedure TForm1.WMGetIcon(var Msg: TWMGetIcon);
begin
  // inherited;
  // Msg.Result := Icon.Handle; // bewirkt: nichts.
  // ShowMessage('WM_GETICON' + #13#10 + 'Msg: ' + IntToStr(Msg.Msg) + #13#10 + 'Result: ' + IntToStr(Msg.Result));
  DefaultHandler(Msg); // einfach nur durchschleifen...
end;

procedure TForm1.WMSetIcon(var Msg: TWMSetIcon);
begin
  // inherited;
  // Msg.Result := Msg.Icon;
  // ShowMessage('WM_SETICON' + #13#10 + 'Msg: ' + IntToStr(Msg.Msg) + #13#10 + 'HICON: ' + IntToStr(Msg.Icon) + #13#10 + 'Result: ' + IntToStr(Msg.Result));
  DefaultHandler(Msg); // einfach nur durchschleifen...
end;

end.
Frage:
Was gibt es noch für möglichkeiten bzw wie sollte man es richtig machen?
Egal wie ich es auch anstelle, nur das Taskbar Icon bzw Alt-Tab Icon wird korrekt gesetzt aber das Formular an sich bleibt sturr fixiert, abgesehen von meinem dirty unschönen workaround.
Angehängte Dateien
Dateityp: zip Caption Icon Test.zip (1,30 MB, 5x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat