AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dialog zur Icon-Auswahl

Ein Thema von ToBmAsTeR · begonnen am 11. Aug 2004 · letzter Beitrag vom 13. Aug 2004
Antwort Antwort
Seite 1 von 2  1 2      
ToBmAsTeR

Registriert seit: 8. Nov 2003
Ort: Moers
13 Beiträge
 
#1

Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 04:47
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
Miniaturansicht angehängter Grafiken
windows-icondialog.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 05:20
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. 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. ) 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.dllindex 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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 07:35
Zitat von Luckie:
Warum Microsoft diese Funktion versteckt hat weiß der Geier.
Der Trainer von Energie Cottbus (Ede Geyer) weiß das?

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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 07:45
Genau das meinte ich. Ich wußte doch, ich kann mich auf mein 'Delphi-Foren-Beitragsgedächnis' verlassen.

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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
ToBmAsTeR

Registriert seit: 8. Nov 2003
Ort: Moers
13 Beiträge
 
#5

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 11:46
moin..

danke leute

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

ToBmAsTeR
  Mit Zitat antworten Zitat
ToBmAsTeR

Registriert seit: 8. Nov 2003
Ort: Moers
13 Beiträge
 
#6

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 15:33
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
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')?

ich hoffe ihr könnt mir weiterhelfen...

in der zwischenzeit mach ich mir gedanken über eine history und backup-funktion meines programms

thx schonmal
ToBmAsTeR

[EDITED] gramatikalische und sonstige fehlaaa [/EDITED]
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#7

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 15:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 15:58
Hallo,

wie wäre es mit Delphi-Referenz durchsuchenStringToWideChar
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 16:02
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.
  Mit Zitat antworten Zitat
ToBmAsTeR

Registriert seit: 8. Nov 2003
Ort: Moers
13 Beiträge
 
#10

Re: Dialog zur Icon-Auswahl

  Alt 11. Aug 2004, 17:42
hoi...



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:
stringtowidechar(iconfile, pwidecharvariable, length(iconfile)); und dann:
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...

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

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
ToBmAsTeR
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.
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