Ich habe von HolgerX eine sehr gut funktionierende Lösung erhalten.
Hier die Funktion:
Delphi-Quellcode:
function PickIconDialog(var Filename: WideString; var IconIndex: Integer ): Boolean;
implementation
function _PickIconDlg(AHwnd : HWND; pszIconPath : PWideString; cchIconPath : DWORD; var piIconIndex : integer):integer; stdcall; external 'Shell32.dll' name 'PickIconDlg';
function PickIconDialog(var Filename: WideString; var IconIndex: Integer ): Boolean;
var
tmp : Array[0..MAX_PATH-1] of WideChar; // Min Size of pszIconPath must be MAX_PATH
begin
Result := False;
FillChar(tmp[0], MAX_PATH * SizeOf(WideChar),0);
Move(FileName[1],tmp[0],Length(FileName)* SizeOf(WideChar));
if (_PickIconDlg( 0, @tmp[0], MAX_PATH, IconIndex ) <> 0 ) then
begin
Filename := Widestring(tmp);
Result := True;
end;
end;
Hier der Aufruf:
Delphi-Quellcode:
procedure TfrmMain.btnGetIconClick(Sender: TObject);
var
IconFile: WideString;
IconIndex: Integer;
begin
IconFile := '';
IconIndex := 0;
if edIconLocation.Text <> '' then
IconFile := edIconLocation.Text;
try
IconIndex := StrToInt( edIconIndex.Text );
except
IconIndex := 0;
end;
if ( PickIconDialog( IconFile, IconIndex ) = True ) then
begin
edIconLocation.Text := IconFile;
try
edIconIndex.Text := IntToStr( IconIndex );
except
edIconIndex.Text := '0';
end;
Image1.Picture.Icon.Handle := ExtractIcon( hInstance, PWideChar( IconFile ), Cardinal( IconIndex ) );
end;
end;
Zeile Image1.Picture.Icon.Handle funktioniert nur wenn vorher bereits ein Icon drinnen liegt (tut es in meinem Fall)
Falls eins fehlt, per TIcon eins zur Laufzeit generieren, Image1.Picture.Assign() glaub ich wars und dann TIcon löschen.
edIconLocation und edIconIndex ist jeweils ein Edit-Feld mit einem Dateinamen und Index-Wert.
Wenn ich es wie oben beschrieben Aufrufe zeigt mir der Dialog nun alles brav an und zwängt sich nicht mehr ungewollt woanders rein (also der Filename Rückgabe-Wert).
Hier der Original Auszug aus meiner ShlObj.pas:
Delphi-Quellcode:
function PickIconDlg(hwnd: HWND; pszIconPath: LPWSTR; cchIconPath: UINT;
var piIconIndex: Integer): Integer; stdcall;
implementation
function PickIconDlg; external shell32 name 'PickIconDlg' delayed;
Vielen Dank!