![]() |
Dialog zur Icon-Auswahl
Liste der Anhänge anzeigen (Anzahl: 1)
moinsen...
ich hab vor mit einem programm icon-angaben in einige desktop.ini oder in die registry zu schreiben.. soweit is das ja ganz simpel.. "iconpfad,iconindex" (z.b.: "C:\windows\system32\shell32.dll,192") aber da ich die DLLs oder EXEs nicht jedesmal vorher mit 'nem ressoucen-viewer öffnen möchte um die nummern der entsprechenden icons herauszufinden, würd ich gern so'nen ähnlichen (oder am besten den gleichen) dialog verwenden, den windows auch verwendet, wenn man bei einer verknüpfung das symbol ändern will... bild is im anhang, damit jeder versteht was ich hier meine... also ich stell mir das im moment so vor: mit'nem BitBtn ruf ich 'nen OpenDialog auf und wähle die ICO, DLL oder EXE aus und kann dann mit diesem dialog das gewünschte icon auswählen, sofern DLL oder EXE geöffnet wurden. falls es nicht möglich ist, den windows-dialog einfach zu übernehmen, dann würd ich mir so'n dingen auch selberbauen, wenn ich wüsste wie man alle icons und deren indexnummer aus den DLLs oder EXEs möglichst einfach und schnell rausbekommt. ich hab auch schon nach dem thema gesucht, hab aber leider nix gefunden was mich weiterbringen würde... bis dann und thx im voraus ToBmAsTeR |
Re: Dialog zur Icon-Auswahl
Also ich weiß, dass wir das schon mal hatten. Ich meine Mathias Simmack hätte da mal was gepostet, aber ich finde es nicht mehr. Ich habe aber mal etwas gesucht, da es mich jketzt auch interessiert. Gefunden haben ich was in der JVCL:
![]() So wenn man weiß wo nach man suchen muss, ist es ganz einfach. Das Mistding läuft unter dem Namen PickIconDialog. :roll: Dabei handelt es sich um eine undokumentierte Funktion in der Shell32.dll und muss über den ordinalen Wert importiert werden. 8Deswegen habe ich sie in der DLL auch nicht gefunden. :evil:) Warum Microsoft diese Funktion versteckt hat weiß der Geier.
Delphi-Quellcode:
function PickIconDialog(Handle: THandle; FileName: PChar; FileNameSize: integer;
var IconIndex: integer): Boolean; stdcall; external 'shell32.dll' index 62; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var IconIndex: Integer; begin if PickIconDialog(Handle, PChar('shell32.dll'), Length('shell32.dll'), IconIndex) then ShowMessage(IntTOStr(IconIndex)); end; Vormerken für die CodeLib!!! Unbedingt aufzunehmende Stichworte, damit man es wieder findet (Da sie im Beitrag so nicht vorkommen.): icon auswahl dialog system auswahldialog |
Re: Dialog zur Icon-Auswahl
Zitat:
Ansonsten hatte ich ![]() |
Re: Dialog zur Icon-Auswahl
Genau das meinte ich. Ich wußte doch, ich kann mich auf mein 'Delphi-Foren-Beitragsgedächnis' verlassen. :zwinker:
Nur finde das mal mit den DStichworten: Icon, Auswahl, Dialog, Auswahldialog. Selbst bei Google hast du da verloren. Nur durch Zufall bin ich auf den richtigen Namen gestossen. |
Re: Dialog zur Icon-Auswahl
moin..
danke leute :dp: ich werd das gleich mal ausprobieren... und wenn das prog fertig ist, werd ich das hier mal vorstellen. ich geb nun schonmal bekannt was ich genau vorhab: kennt ihr den registry eintrag "driveicons"? ('\SOFTWARE\Microsoft\Windows\CurrentVersion\Explo rer\DriveIcons\') in den unterschlüsseln kann für jedes laufwerk ein festes symbol angegeben werden und auch ein fester name... egal ob sichdas gerät "hinter" dem laufwerksbuchstaben ändert. allerdings werden DefaultLabel und DefaultIcon von laufwerksspezifischen Namen bzw. Icons "überlagert". das eintragen, löschen usw. funktioniert auch schon super, bis jetzt kann man aber leider nur die icondatei öffnen und muss die nummer des gewünschten icons noch selbst eingeben. bis dann und thx für eure schnelle antwort :hello: ToBmAsTeR |
Re: Dialog zur Icon-Auswahl
moiin...
ein problem gelöst.. nun hab ich gleich das nächste. den dialog kann ich jetzt problemlos öffnen, den dateinamen und den index bekomm ich auch ohne probleme raus, nur das öffnen einer angegebenen datei klappt leider nich so ganz. ich hab das hier fast komplett aus dem beispielprogramm übernommen, geändert habe ich nur ein paar namen der variablen, das ist auch nicht das problem.
Delphi-Quellcode:
procedure TMainForm.PickIcon(hwndicon: HWND; var iconfile: string; var iconindex: integer);
var {$IFDEF UNICODE} buf : widestring; {$ELSE} buf : string; {$ENDIF} idx : dword; begin // "buf" auf MAX_PATH setzen, & leeren {$IFDEF UNICODE} SetLength(buf,MAX_PATH * 2); {$ELSE} SetLength(buf,MAX_PATH); {$ENDIF} ZeroMemory(@buf[1],length(buf)); // "iconfile" als Ausgangspunkt festlegen {$IFDEF UNICODE} lstrcpyW(@buf[1],pwidechar(iconfile)); {$ELSE} lstrcpy(@buf[1],pchar(iconfile)); {$ENDIF} // Dialog aufrufen {$IFDEF UNICODE} if(PickIconDlg(hwndicon,pwidechar(buf),length(buf),idx)) then {$ELSE} if(PickIconDlg(hwndicon,pchar(buf),length(buf),idx)) then {$ENDIF} begin {$IFDEF UNICODE} buf := widestring(buf); iconfile := string(buf); iconindex := idx; {$ELSE} buf := string(buf); iconfile := buf; iconindex := idx; {$ENDIF} end; end; das eigentliche problem tritt in diesen zeilen auf:
Delphi-Quellcode:
iconfile ist eine string-variable, der in der dieser prozedur ein dateiname übergeben wird, aber das funzt nicht.. obwohl es ja eigentlich das gleiche ist wie das hier (bis auf die variable):
// "iconfile" als Ausgangspunkt festlegen
{$IFDEF UNICODE} lstrcpyW(@buf[1],pwidechar(iconfile)); {$ELSE} lstrcpy(@buf[1],pchar(iconfile)); {$ENDIF}
Delphi-Quellcode:
(stammt aus dem beispiel von MathiasSimmack)
// "explorer.exe" als Ausgangspunkt festlegen
{$IFDEF UNICODE} lstrcpyW(@buf[1],'explorer.exe'); {$ELSE} lstrcpy(@buf[1],'explorer.exe'); {$ENDIF} was ich jetzt nicht raffe, dass da String nicht gleich String ist :wall: oder mag der an dieser stelle keine absoluten pfadangaben (c:\windows\explorer.exe) die aus einer string variable kommen, anstatt direkt als string ('c:\windows\explorer.exe')? :roteyes: ich hoffe ihr könnt mir weiterhelfen... in der zwischenzeit mach ich mir gedanken über eine history und backup-funktion meines programms :gruebel: thx schonmal ToBmAsTeR [EDITED] gramatikalische und sonstige fehlaaa [/EDITED] |
Re: Dialog zur Icon-Auswahl
Die API-Funktionen, wie "lstrcpy", arbeiten nicht mit Strings wie du sie aus Delphi kennst. In dem Fall handelt es sich um pchars. Die einfachste Variante, wenn du mit Variablen arbeiten willst/musst, ist eben der gezeigte Typecast:
Delphi-Quellcode:
Aber Delphi stellt selbst auch Routinen zum Konvertieren von String nach PChar/PWidechar und umgekehrt zur Verfügung. Im Augenblick fällt mir da aber nur
pchar(StringVariable)
pwidechar(StringVariable) ![]() |
Re: Dialog zur Icon-Auswahl
|
Re: Dialog zur Icon-Auswahl
Ja, ich meinte das jetzt aber nicht so, dass nun jeder anfängt, die entsprechenden Namen zu posten. Irgendwas muss ToBmAsTeR ja auch selbst machen. ;) Andernfalls hätte ich kurz Delphi gestartet und die entsprechenden Funktionen auch gleich selbst rausgesucht.
|
Re: Dialog zur Icon-Auswahl
hoi...
:wall: :wall: :wall: entweder sind die functions und procedures total kompliziert oder ich einfach nur zu blöd.. @MathiasSimmack: Zitat:
und das mit stringtowidechar raff ich irgendwie nicht.. angewendet wird die function doch so oder:
Delphi-Quellcode:
und dann:
stringtowidechar(iconfile, pwidecharvariable, length(iconfile));
Delphi-Quellcode:
so hab ich das verstanden.. aber funzenuckelt leider nich.. schmiert genau an dieser stelle mit 'ner zugriffsverletzung sonstwas in kernel32.dll ab... :wall:
lstrcpyW(@buf[1],pwidecharvariable);
irgendwie muss das doch machbar sein 'ne stringvarable in die widestring-variable "buf" reinzubekommen :gruebel: so siehts im moment im sourcecode aus:
Delphi-Quellcode:
thx für eure mitarbeit :thumb:
procedure TMainForm.PickIcon(hwndicon: HWND; var iconfile: string; var iconindex: integer);
var {$IFDEF UNICODE} pwidecharvariable: pwidechar; buf : widestring; {$ELSE} buf : string; {$ENDIF} idx : dword; begin // "buf" auf MAX_PATH setzen, & leeren {$IFDEF UNICODE} SetLength(buf,MAX_PATH * 2); {$ELSE} SetLength(buf,MAX_PATH); {$ENDIF} ZeroMemory(@buf[1],length(buf)); // "iconfile" als Ausgangspunkt festlegen {$IFDEF UNICODE} stringtowidechar(iconfile,pwidecharvariable,length(iconfile)); lstrcpyW(@buf[1],pwidecharvariable); {$ELSE} lstrcpy(@buf[1],pchar(iconfile)); {$ENDIF} // Dialog aufrufen {$IFDEF UNICODE} if(PickIconDlg(hwndicon,pwidechar(buf),length(buf),idx)) then {$ELSE} if(PickIconDlg(hwndicon,pchar(buf),length(buf),idx)) then {$ENDIF} begin {$IFDEF UNICODE} buf := widestring(buf); iconfile := string(buf); iconindex := idx; {$ELSE} buf := string(buf); iconfile := buf; iconindex := idx; {$ENDIF} end; end; ToBmAsTeR |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz