Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Icon aus Exe funktioniert nur auf Button? (https://www.delphipraxis.net/130245-icon-aus-exe-funktioniert-nur-auf-button.html)

Flodding 5. Mär 2009 13:00


Icon aus Exe funktioniert nur auf Button?
 
Huhu und Guten Tag zusammen...

ich hab im Internet diese Funktion gefunden, die aus 2 Teilen besteht...

Delphi-Quellcode:
uses
  ShellApi;

// Gibt Anzahl Icons aus EXE, DLL oder ICO.
function TotalNumberOfIcons(const FileName: String): Integer;
begin
  if not FileExists(FileName) then Result := -1
//    else Result := ExtractIcon(HInstance, PChar(FileName), -1); Fehler korrigiert.
    else Result := ExtractIcon(HInstance, PChar(FileName), $FFFFFFFF);
end; {Popov}
Delphi-Quellcode:
uses
  ShellApi;

// Gibt Icon zurück aus EXE, DLL oder ICO.
function GetIconFromFileA(const FileName: String; Index: Word;
  Icon: TIcon): Boolean;
begin
  Result := False;
  if (TotalNumberOfIcons(FileName) < 1) or
     ((Index + 1 ) > TotalNumberOfIcons(FileName)) then
    Exit;

  Icon.Handle := ExtractIcon(HInstance, PChar(FileName), Index);
  Result := True;
end; {Popov}
wenn ich jetzt geticonfromfilea aus einem button aufrufe...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  AIcon: TIcon;
begin
  AIcon := TIcon.Create;
  try
    if GetIconFromFileA('c:\windows\explorer.exe', 0, AIcon) then
    form1.canvas.Draw(0, 0, AIcon);
  finally
    AIcon.Free;
  end;
end;
... dann zeigt er mir das icon in der oberen linken ecke meines forms an... supiklasse :)

verwende ich das ganze jetzt aber so:

Delphi-Quellcode:
procedure ExeSearch(ADirectory: String);
var
  SS: TSearchRec;
  AIcon: TIcon;
begin
    if FindFirst(ADirectory + '\*.exe', faAnyFile, SS)=0 then
    begin
      repeat
        with form1 do begin

AIcon := TIcon.Create;
try
if GetIconFromFileA('c:\windows\explorer.exe', 0, AIcon) then
canvas.Draw(0, 0, AIcon);
finally
AIcon.Free;
end;

        Programmpfada[a] := ADirectory + '\' + SS.Name;
        listbutton[y] := TXiButtonLeft.Create(form1.ScrollBox1);
        ListButton[y].Caption:=(GetVersionInfo(ADirectory + '\' + SS.Name, 'FileDescription'));
        listbutton[y].left:=0;
etc...
        listbutton[y].Parent := form1.ScrollBox1;
        ListButton[y].OnClick:= ListButton_Click;
        ListButton[y].Name:='List' + inttostr(y);
        a:=a+1;
        x:=x+22;
        y:=y+1;
        end;
      until FindNext(SS)<>0;
      FindClose(SS);
    end;
end;
dann wird mir kein icon oben links in der ecke angezeigt... warum?

Bernhard Geyer 5. Mär 2009 13:03

Re: Icon aus Exe funktioniert nur auf Button?
 
Das ExeSearch keine Methode deines Formulares ist wird für Canvas irgendeine globale Variable genommen und dort die Draw-Methode aufgerufen anstatt des Canvas deines Formulares.

DeddyH 5. Mär 2009 13:04

Re: Icon aus Exe funktioniert nur auf Button?
 
Auf welchen Canvas willst Du denn da zeichnen?

[edit] Roter Kasten :?: [/edit]

taaktaak 5. Mär 2009 13:05

Re: Icon aus Exe funktioniert nur auf Button?
 
procedure TForm1.Button1Click ist eine Methode, du hast also Zugriff auf dein Formular. procedure ExeSearch ist eine "stinknormale" Prozedur ohne Zugriff auf deine Form-Klasse daran wird's wohl liegen.

// edit : Roter Kasten? Welcher rote Kasten?

Flodding 5. Mär 2009 13:06

Re: Icon aus Exe funktioniert nur auf Button?
 
Zitat:

Delphi-Quellcode:
        with form1 do begin

AIcon := TIcon.Create;
try
if GetIconFromFileA('c:\windows\explorer.exe', 0, AIcon) then
canvas.Draw(0, 0, AIcon);
finally
AIcon.Free;
end;

        Programmpfada[a] := ADirectory + '\' + SS.Name;

ich habs doch in der with drinne...

taaktaak 5. Mär 2009 13:07

Re: Icon aus Exe funktioniert nur auf Button?
 
Mach doch einfach mal 'ne Methode draus...

Flodding 5. Mär 2009 13:11

Re: Icon aus Exe funktioniert nur auf Button?
 
Zitat:

Zitat von DeddyH
Auf welchen Canvas willst Du denn da zeichnen?

[edit] Roter Kasten :?: [/edit]

was für ein roter kasten?

Zitat:

Zitat von taaktaak
Mach doch einfach mal 'ne Methode draus...

wie mach ich das? procedure?!

DeddyH 5. Mär 2009 13:14

Re: Icon aus Exe funktioniert nur auf Button?
 
Oben im interface-Teil im private-Abschnitt des Formulars:
Delphi-Quellcode:
procedure ExeSearch(ADirectory: String);
Und im implementation-Teil dann
Delphi-Quellcode:
procedure TForm1.ExeSearch(ADirectory: String);

Tyrael Y. 5. Mär 2009 13:14

Re: Icon aus Exe funktioniert nur auf Button?
 
[ot]
Zitat:

Zitat von Flodding
ich habs doch in der with drinne...

with hat der Teufel persönlich erfunden....wer das benutzt wird in der Debug Hölle landen. :mrgreen:
[/ot]

´tschuldigung ;)

Wie die anderen schon geschrieben haben, deine Funktion/Proedur hat nichts mit der Form zu tun.
Deine Form ist "zufällig" in deiner Prozedur bekannt, weil sich diese Prozedur wahrscheinlich in der Form unit befindet und die Form global dort deklariert ist.

Bernhard Geyer 5. Mär 2009 13:15

Re: Icon aus Exe funktioniert nur auf Button?
 
Zitat:

Zitat von Flodding
ich habs doch in der with drinne...

Bitte kein Zugriff auf die global angelegte globale Variable: "with form1 do begin"
Das ist der übel von vielen Problemen und bei deiner obigen Formatierung sehr leicht zu übersehen.
Bist du dir auch sicher das form1 auch die Instanz deines Formulares was du gerade siehst?


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