Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dialog zur Icon-Auswahl (https://www.delphipraxis.net/27491-dialog-zur-icon-auswahl.html)

ToBmAsTeR 11. Aug 2004 03:47


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

Luckie 11. Aug 2004 04:20

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: http://www.delphi-source.de/jedi/jvcl/komponenten.php -> TJvChangeIconDialog das scheint es zu sein. Aber nur deswegen alles installieren würde ich nicht. Ich suche noch mal weiter.

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

MathiasSimmack 11. Aug 2004 06:35

Re: Dialog zur Icon-Auswahl
 
Zitat:

Zitat von Luckie
Warum Microsoft diese Funktion versteckt hat weiß der Geier.

Der Trainer von Energie Cottbus (Ede Geyer) weiß das? :shock: ;)

Ansonsten hatte ich hier mal ein paar Problemchen mit undokumentierten Sachen. In dem Beitrag steckt auch ein Anhang u.a. mit dem Icon-Dialog und anderen Sachen.

Luckie 11. Aug 2004 06:45

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.

ToBmAsTeR 11. Aug 2004 10:46

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

ToBmAsTeR 11. Aug 2004 14:33

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" als Ausgangspunkt festlegen
{$IFDEF UNICODE}
 lstrcpyW(@buf[1],pwidechar(iconfile));
{$ELSE}
 lstrcpy(@buf[1],pchar(iconfile));
{$ENDIF}
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):
Delphi-Quellcode:
// "explorer.exe" als Ausgangspunkt festlegen
{$IFDEF UNICODE}
 lstrcpyW(@buf[1],'explorer.exe');
{$ELSE}
 lstrcpy(@buf[1],'explorer.exe');
{$ENDIF}
(stammt aus dem beispiel von MathiasSimmack)

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]

MathiasSimmack 11. Aug 2004 14:55

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:
pchar(StringVariable)
pwidechar(StringVariable)
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 Delphi-Referenz durchsuchenSetString ein, der aus einem PChar einen String macht. Wenn du in dem Themengebiet mal in der Delphi-Hilfe suchst, müsstest du auch die anderen Funktionen finden.

Gollum 11. Aug 2004 14:58

Re: Dialog zur Icon-Auswahl
 
Hallo,

wie wäre es mit Delphi-Referenz durchsuchenStringToWideChar

MathiasSimmack 11. Aug 2004 15:02

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.

ToBmAsTeR 11. Aug 2004 16:42

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:

pchar(StringVariable)
pwidechar(StringVariable)
das hab ich ja schon probiert.. dann kommt diese fehlermeldung "datei ■■■■■■ nicht gefunden"

und das mit stringtowidechar raff ich irgendwie nicht..
angewendet wird die function doch so oder:
Delphi-Quellcode:
stringtowidechar(iconfile, pwidecharvariable, length(iconfile));
und dann:
Delphi-Quellcode:
lstrcpyW(@buf[1],pwidecharvariable);
so hab ich das verstanden.. aber funzenuckelt leider nich.. schmiert genau an dieser stelle mit 'ner zugriffsverletzung sonstwas in kernel32.dll ab... :wall:

irgendwie muss das doch machbar sein 'ne stringvarable in die widestring-variable "buf" reinzubekommen :gruebel:

so siehts im moment im sourcecode aus:
Delphi-Quellcode:
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;
thx für eure mitarbeit :thumb:
ToBmAsTeR


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 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