Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Neues Icon für Messagebox (https://www.delphipraxis.net/94843-neues-icon-fuer-messagebox.html)

Michi123 27. Jun 2007 01:35


Neues Icon für Messagebox
 
Hey,
hab folgendes Problem. Will bei einer messagebox das Standardicon (wie z.b. Fragezeichen,...) durch ein eigenes neues Ersetzten.
Dabei bin ich jedoch nur so weit gekommen, dass ich das Programmsymbol anstatt den anderen anzeigen lassen kann.
Den untenstehenden Quellcode habe ich dafür auf einer Website gefunden.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var MsgParams:    TMsgBoxParams;
begin
  with MsgParams do
  begin
     cbSize:=SizeOf(TMsgBoxParams);
     hwndOwner:=Application.MainForm.Handle;
     hInstance:=MainInstance;
     lpszText:='Lobby Broadcaster'+ #13 +'Version: 1.1.0'+ #13 +''+ #13 +'Copyright © 2000 - 2005 by Me.'+ #13 +'All Rights Reserved.';
     lpszCaption:='About Product';
     dwStyle:=MB_OK or MB_USERICON;
     lpszIcon:=Pointer(PWideChar(WideString('MAINICON')));
     dwContextHelpId:=0;
     lpfnMsgBoxCallback:=nil;
     dwLanguageId:=DWORD(MAKEINTRESOURCE(LANG_NEUTRAL));
  end;

 MessageBoxIndirect(MsgParams);
end;
Wenn ich jetzt jedoch die Zeile "lpszIcon:=Pointer(PWideChar(WideString('MAINICON' )));" umschreiben würde, sodass ein symbol aus einer resourcen-datei geladen werden soll, so wird kein Symbol in der messsagebox angezeigt.

Weiß jemand vielleicht eine Lösung für das Problem?

Ghostwalker 27. Jun 2007 04:46

Re: Neues Icon für Messagebox
 
Der Beitrag hier sollte dir weiterhelfen.

Michi123 27. Jun 2007 08:51

Re: Neues Icon für Messagebox
 
Nein leider verliere ich irgendwie den Überblick bei dem Beispielprogramm und außerdem kann ich es mit delphi 5 nich compilieren, sodass ich sehen kann, wie sich veränderungen auswirken.. z.b. ein eigenes icon einsetzten..

Meine frage war wohl eher darauf bezogen, wie ich durch die Makierte Quelltextzeile auf ein icon zugreifen kann, ich habe es mehrfach versucht, jedoch klappt es leider nicht :(..

Delphi-Quellcode:
  MsgInfo.cbSize := SizeOf(TMsgBoxParams);
  MsgInfo.hwndOwner := hWnd;
  MsgInfo.hInstance := GetWindowLong(hWnd, GWL_HINSTANCE);
  MsgInfo.lpszText := @Text[1];
  MsgInfo.lpszCaption := @Caption[1];
  MsgInfo.dwStyle := MB_USERICON;
  MsgInfo.lpszIcon := MAKEINTRESOURCE(IDICON); // <===== Diese Zeile
  MessageBoxIndirect(MsgInfo);
Daher hat jemand viell. einen Tipp, wie ich eine ressource in der exe ansprechen kann, wenn ich z.b. den namen der souce [z.b. "101"] durch reshack-Editor weiß/bzw. auch verändern kann?
Vielen Dank schon einmal!

Luckie 27. Jun 2007 08:58

Re: Neues Icon für Messagebox
 
IDICON ist die ID des Icons aus deiner Ressource. Du müsstest also evebtuell noch eine zusätzliche Ressource mit deinem Icon erstellen.

SirThornberry 27. Jun 2007 09:08

Re: Neues Icon für Messagebox
 
ich hab das Gefühl du verstehst den Quelltext nicht sondern hast ihn einfach nur kopiert.

Delphi-Quellcode:
Pointer(PWideChar(WideString('MAINICON')));
Der Quelltext macht nichts anderes als 'MainIcon' zu einem WideString zu casten, davon die Adresse zu holen und diese auf einen Pointer zu casten um sie zuweisen zu können.

Wenn du also ein Icon in einer Ressource hast, hat diese Ressource einen Namen. Diesen Namen musst du zu einem WideString wandeln und die Adresse des WideStrings kannst du dann lpszIcon zuweisen.

Michi123 27. Jun 2007 09:14

Re: Neues Icon für Messagebox
 
sagen wir mal diese neue Test.res Datei liegt im gleichen verzeichnis wie das Programm.

Dann muss ich ja

{$R Test.res}

unter implementation einfügen, um die Ressourcendatei anzusprechen, oder?
jetzt nenn ich das icon in der ressource beispielsweise "101", wie müsste ich es dann ansprechen?
Habs mit MsgInfo.lpszIcon := MAKEINTRESOURCE(101); probiert, hat aber nicht geklappt? Hab ich was falsch gemacht?

@SirThornberry: soweit hab ich das schon verstanden.. müsste also in meinem beispiel oben Pointer(PWideChar(WideString('101'))); sein, oder geht das ausschließlich mit 'MainICON'? Denn meine Variante hat nicht funktioniert..

SirThornberry 27. Jun 2007 09:15

Re: Neues Icon für Messagebox
 
wenn du mit Icon-Indexes arbeitest gehts so:
Delphi-Quellcode:
  MsgParams.cbSize:=SizeOf(TMsgBoxParams);
  MsgParams.hwndOwner:=Self.Handle;
  MsgParams.hInstance:=GetModuleHandle('shell32.dll');
  MsgParams.lpszText:='Lobby Broadcaster'+ #13 +'Version: 1.1.0'+ #13 +''+ #13 +'Copyright © 2000 - 2005 by Me.'+ #13 +'All Rights Reserved.';
  MsgParams.lpszCaption:='About Product';
  MsgParams.dwStyle:=MB_OK or MB_USERICON;
  MsgParams.lpszIcon:=Pointer(13); //Icon13 aus IconGroup verwenden
  MsgParams.dwContextHelpId:=0;
  MsgParams.lpfnMsgBoxCallback:=nil;
  MsgParams.dwLanguageId:=0; //0 = Neutral

  MessageBoxIndirect(MsgParams);
oder laut msdn anstelle von:
Delphi-Quellcode:
MsgParams.lpszIcon:=Pointer(13); //Icon13 aus IconGroup verwenden
lieber
Delphi-Quellcode:
MsgParams.lpszIcon:=MAKEINTRESOURCE(13); //Icon13 aus IconGroup verwenden
wobei MAKEINTRESOURCE auch nur ein PChar ist was wiederum ein Pointer ist was also nichts anderes macht als die 13 zu einem Pointer zu casten.

Michi123 27. Jun 2007 09:29

Re: Neues Icon für Messagebox
 
Antwort der NAme des Icons in deinem Beispiel ist also "13" und befindet sich in der IconGroup.

Ich habe den Quelltext jetzt deinem Vorschlag angepasst, es funktioniert jedoch weder mit MsgParams.hInstance:=GetModuleHandle('shell32.dll' ); noch mit MsgParams.hInstance:=GetModuleHandle('101.res'); .

Er zeigt dann bei mir ein transparentest [also eigentlich kein Icon] an :(..

das gleiche gilt für MsgParams.lpszIcon:=Pointer(1); oder MsgParams.lpszIcon:=MAKEINTRESOURCE(1);

SirThornberry 27. Jun 2007 09:34

Re: Neues Icon für Messagebox
 
Delphi-Quellcode:
MsgParams.hInstance:=GetModuleHandle('101.res'); .
völlig falsch!
eine Ressorucendatei ist eine Datei die ähnlich wie .pas-Dateien in das Projekt einkompiliert werden. Sie sind also dann ein Teil deines Programmes. (womit dann hInstance = SysInit.HInstance wäre).

Am besten du fängst mal ganz von vorn an. Du hast also ein Icon welches du anzeigen willst. Wo befindet sich dieses Icon? In einer DLL oder ist es in deine Exe eincompiliert?

Wenn du es über eine Ressourcen-Datei (*.res) eingebunden hast wie sieht dann bei dir die .rc-Datei aus?

Michi123 27. Jun 2007 09:40

Re: Neues Icon für Messagebox
 
Gut, ich wills ja auch verstehen:

meine 101.rc hat folgeden Text: 101 ICON "Icon_2.ico"

und dann wollte ich sie unter CMD: mit dem befehl: BRC32 -r 101.rc [umwandeln zu res, was ja auch klappt]

und danach wollte ich sie dann in die exe einbinden, was mir jedoch wie du siehst probleme bereitet

:) Grade hab ich was hinbekommen.. jetzt kann ich schonmal ein anderes icon anzeigen lassen.. :) hoffe nur ich bekomm jetzt auch raus, wieso genau das Icon!

Hey also nochma danke für alles, ich habs jetzt verstanden :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:17 Uhr.
Seite 1 von 2  1 2      

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