Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Application.Icon setzen (https://www.delphipraxis.net/195916-application-icon-setzen.html)

freimatz 6. Apr 2018 18:24

Application.Icon setzen
 
Hallo,
in meiner App erscheint zuerst ein SpashScreen. Das ist eine einfache TForm. Das Hauptformular wird erst später geladen. Ich möchte nun dass in der Taskleiste nun gleich ein Icon und der Titel erscheint.
Beim Titel klappt das mit Application.Titel recht gut, beim Icon gelingt es mir nicht.
Wie macht man das am Besten, woran kann es liegen?
Letzter Versuch war:
Delphi-Quellcode:
       
       Icon := TIcon.Create;
       try
         SplashForm.cxImageListMainIcon.GetIcon(0, Icon);
         Application.Icon.Assign(Icon);
       finally
         Icon.Free;
       end;
cxImageListMainIcon ist dabei einem Imagelist. Mit einem TImage gings auch nicht. Auch nicht mit SplashForm.Icon.
Für Ideen oder eine Lösung wäre ich dankbar.

günni0 6. Apr 2018 18:42

AW: Application.Icon setzen
 
Delphi-Quellcode:
Application.Icon := SplashForm.cxImageListMainIcon.GetIcon(0, Icon);

sollte eigentlich funktionieren.

freimatz 6. Apr 2018 18:52

AW: Application.Icon setzen
 
Danke. Leider Nein: [DCC Fehler] Fm_Splash.pas(70): E2010 Inkompatible Typen: 'TIcon' und 'procedure, untyped pointer or untyped parameter': GetIcon ist keine function.
(PS.: gegooglet habe ich auch schon lange.)

günni0 6. Apr 2018 18:53

AW: Application.Icon setzen
 
Mein Fehler. So natürlich:

Delphi-Quellcode:
IconX := SplashForm.cxImageListMainIcon.GetIcon(0, Icon);

Application.Icon := IconX;

freimatz 6. Apr 2018 21:33

AW: Application.Icon setzen
 
Sorry, dadurch wird GetIcon immer noch nicht zu einer function ;-)

KodeZwerg 6. Apr 2018 22:21

AW: Application.Icon setzen
 
So hole ich mir zur Laufzeit Icons aus der Resource:

Delphi-Quellcode:
{$R MYICONS.RES}

procedure TForm1.Button1Click(Sender: TObject);
var
  h : hIcon;
begin
  h := LoadIcon(hInstance, 'ICON_1');
  Application.Icon.Handle := h;
  InvalidateRect(Application.Handle, nil, true);
end;

günni0 6. Apr 2018 22:24

AW: Application.Icon setzen
 
Na dann jetzt aber nochmal richtig ...
Delphi-Quellcode:
SplashForm.cxImageListMainIcon.GetIcon(0, Icon);
Application.Icon := Icon;
oder direkt ohne Zwischenvariable

Delphi-Quellcode:
SplashForm.cxImageListMainIcon.GetIcon(0, Application.Icon);

freimatz 7. Apr 2018 08:53

AW: Application.Icon setzen
 
Funktioniert leider auch nicht - außer dass es später eine Schutzverletzung gibt (vermutlich weil es dann SplashForm und soit auch das Icon nicht mehr gibt.)

@KodeZwerg: Danke. Das sieht jetzt eher lowlevel aus. Versucht habe ich es so:
Delphi-Quellcode:
  h := LoadIcon(hInstance, 'MAINICON');
  Application.Icon.Handle := h;
  InvalidateRect(Application.Handle, nil, true);
Es funktionert aber auch nicht. Nach dem Debugger hat h einen Wert. Nach der Doku ("If the function succeeds, the return value is a handle to the newly loaded icon. If the function fails, the return value is NULL. To get extended error information, call GetLastError.") müsste das Laden ja dann geklappt haben weil h ist ja nicht NULL.
Application, Application.Icon.Handle und Application.Handle habe nach Debugger auch was drin.
Das Icon erscheint aber nicht bei mir.

Ich habe den Verdacht dass mir DevExpress da noch irgendwie reinspuckt.

Aufgrund von https://stackoverflow.com/questions/...plication-icon mein neuster letzter erfolgloser Versuch:
Delphi-Quellcode:
var
  hApp: HWND;
  hSmall : hIcon;
  hLarge : hIcon;
begin
  hApp := Application.Handle;

  hSmall := LoadImage(HInstance, 'MAINICON', IMAGE_ICON,16, 16, 0);
  hLarge := LoadImage(HInstance, 'MAINICON', IMAGE_ICON,256, 256, 0);

  SendMessage(hApp, WM_SETICON, ICON_SMALL, hSmall) ;
  SendMessage(hApp, WM_SETICON, ICON_BIG, hLarge) ;

  InvalidateRect(hApp, nil, true);
  UpdateWindow(hApp);
end;
Ich gebs mal vorläufig auf.

KodeZwerg 7. Apr 2018 09:25

AW: Application.Icon setzen
 
Delphi-Quellcode:
{$R MYICONS.RES}

procedure TForm1.Button1Click(Sender: TObject);
var
  h : hIcon; // wir brauchen das Handle, nicht das Image, deswegen HICON
begin
  h := LoadIcon(hInstance, 'ICON_1'); // in Resource-Datei MyIcons.res ist ein Eintrag Namens ICON_1, Handle dahin erzeugen
  Application.Icon.Handle := h; // Handle an das Programm übergeben
  InvalidateRect(Application.Handle, nil, true); // Programm update
end;
Also in MyIcons.res existiert ein Icon was den Namen "ICON_1" bekommen hat, dem System ist in der Regel die Größe egal da es von selbst runter/hoch skaliert. Ich hab keinen Check drinn da die Resource bei mir immer existiert. Ob es LowLevel ist kann ich nicht sagen, nur das es bei mir auf diese Weise klappt kann ich sagen.

Code:
SendMessage(hApp, WM_SETICON, ICON_BIG, h);
sollte das WinApi Äquivalent sein und genügen.
Ich vermute LoadImage() macht nicht das gleiche wie LoadIcon().

Code:
SendMessage(hApp, WM_SETICON, ICON_BIG, LoadIcon(hInstance, 'MAINICON'));
Probier's mal so.

günni0 7. Apr 2018 11:06

AW: Application.Icon setzen
 
Zitat:

Funktioniert leider auch nicht - außer dass es später eine Schutzverletzung gibt (vermutlich weil es dann SplashForm und soit auch das Icon nicht mehr gibt.)
Wenn das hier nicht funktioniert stimmt irgendwas in deinem Projekt aber nicht. Einfacher gehts nicht.

Delphi-Quellcode:
SplashForm.cxImageListMainIcon.GetIcon(0, Application.Icon);


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz