Entwickler-Ecke

Dateizugriff - ExtractIcon Problem!


DelphiNoob - Mo 24.03.03 18:00
Titel: ExtractIcon Problem!
Hi,

ich bin gerade dabei mittels ExtractIcon() ein Icon aus der eigenen Programmdatei zu extrahieren, und im ListView für Items zu verwenden.

Momentan sieht der Code wie folgt aus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
listitem:TListitem;
icon: TIcon;
anzicon: integer;

...

ExtrFileName = 'F:\Project1.exe';

...

listitem:=ListView1.Items.Add;
icon:=TIcon.create;
anzicon:=ExtractIcon(hinstance,PChar(ExtrFileName),Cardinal(-1));
icon.handle:=ExtractIcon(hinstance,PChar(ExtrFileName),anzicon);
listitem.Imageindex:=ImageList1.AddIcon(icon);
icon.Free;


Leider funktioniert das nicht so wie ich will. Ich hab auch schon verschiedene Varianten ausprobiert. Mal ohne Cardinal() bei "-1", mal mit wie oben beschrieben. Mal anstatt "anzicon" einfach eine Zahl genommen.
Auch mal "anzicon" mit Cardinal().

Im Listview1 ist auch die ImageList1 bei den Icons eingetragen, also da liegt der Fehler auch nicht.

Vielleicht sollte ich noch erwähnen: Das Icon was ich benötige ist nicht das MAINICON! Sondern ein Icon was ich mittels Resource Datei eingespeist habe. Und ich bin auch sicher das dass Icon eingebaut wird beim compilieren, da shabe ich überprüft.

Hoffe auf schnelle Hilfe.

Mfg
DelphiNoob


DelphiNoob - Mo 24.03.03 20:52

*däumchen dreh*

*g*


Aya - Di 25.03.03 00:54

Hi,

wieso so umständlich? :)
Wenn du das Icon doch in einer Resource drin hast.. mach es einfach so:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Icon: TIcon;
begin
  Icon:=TIcon.Create;
  Icon.LoadFromResourceName(hInstance,'MYICON');
  ImageList.AddIcon(Icon);
  Icon.Free;
end;


Au'revoir,
Aya~


DelphiNoob - Di 25.03.03 11:56

ähm ja... also

nur damit ich das nachvollziehe:

Lade ich das Icon dann immer aus einer *.res file? Die wird doch in die EXE eingebaut, somit brauch ich die im fertigen Programm nicht mehr.

Und "MYICON", ist das jetzt nur ne bezeichnung so für das Beispiel oder was ist das?


DelphiNoob - Di 25.03.03 12:05

Achso, und: LoadFromResourceName kennt er erst garnicht. Obwohl es in der Hilfe steht... ich habs auch nochmal überprüft, aber er rafft es nicht.


Delete - Di 25.03.03 12:59

DelphiNoob hat folgendes geschrieben:
Lade ich das Icon dann immer aus einer *.res file? Die wird doch in die EXE eingebaut, somit brauch ich die im fertigen Programm nicht mehr.

Du lädtst damit das Symbol aus den Ressourcen deiner Exe, quasi: aus der eingebauten RES-Datei.

Zitat:
Und "MYICON", ist das jetzt nur ne bezeichnung so für das Beispiel oder was ist das?

Das ist der Name des Icons, den du in der Ressourcendatei angegeben hast. Etwa

Quelltext
1:
STOPBILD  ICON  "stop.ico"                    

"STOPBILD" wäre hierbei der Name (pchar bzw. String) des Icons. Das gilt auch für Zahlen, sprich: wenn du die Icons in der RES-Datei nummerierst, dann sind das keine echten Zahlen sondern eher mit Strings vergleichbar:

Quelltext
1:
'1'                    

und nicht

Quelltext
1:
1                    


Zitat:
Obwohl es in der Hilfe steht.

Ist wahrscheinlich nur ein Tippfehler. Guck mal ob du evtl. ein R zuviel drin hast, o.ä.


DelphiNoob - Di 25.03.03 13:10

@MathiasSimmack

Danke für deine Aufklärung! Immer wieder nett!

Und wegen dem Tippfehler: Ich hab es sogar direkt aus der Hilfe rauskopiert, also das "LoadFromResourceName". Hab ich vieleicht ne Unit einzubinden? Also "Graphics" ist unter den "uses", und die ist für Icons ja eigentlich nötig.

Plz help *heul*

Aber ich poste nochmal den momentanen Code:


Quelltext
1:
2:
3:
4:
5:
6:
7:
icon:=TIcon.create;
      try
        icon.LoadFromResourceName(hInstance,'120');
      finally
        listitem.Imageindex:=ImageList1.AddIcon(icon);
      end;
icon.free


Info: Das Icon in der Res File hat die Nr. 120.

Mfg
DelphiNoob


Delete - Di 25.03.03 15:02

Hm, ich habe gerade mal mein Delphi 5 angeschmissen, und da gibt´s diese Funktion gar nicht. Alternativ mach dies:

Quelltext
1:
icon.Handle := LoadIcon(hInstance,'120');                    

nach dem Erstellen (icon := TIcon.Create) desselben. Das sollte eigentlich funktionieren, weil "LoadIcon" eine API-Funktion aus der Windows-Unit ist.


DelphiNoob - Di 25.03.03 15:06

Hab ich auch nicht! Ich hab hier Delphi7, da steht mir folgendes mit "Load..." zu verfügung:

LoadFromClipboardFormat
LoadFromStream
LoadFromFile

Das ursprüngliche LoadFronResourceName ist aber in der Hilfe in zusammenhang mit TIcon angegeben! Das MUSS es doch geben!

*FLUCH, GRUMMEL*


DelphiNoob - Di 25.03.03 15:09

Wenn ich allerdings ne Bitmap oder so laden möchte, da existiert "LoadFromResourceName". (Also bei TBitmap)


wulfskin - Di 25.03.03 16:11

DelphiNoob hat folgendes geschrieben:
Hab ich auch nicht! Ich hab hier Delphi7, da steht mir folgendes mit "Load..." zu verfügung:

LoadFromClipboardFormat
LoadFromStream
LoadFromFile

Das ursprüngliche LoadFronResourceName ist aber in der Hilfe in zusammenhang mit TIcon angegeben! Das MUSS es doch geben!

*FLUCH, GRUMMEL*
Versuch es trotzdem mal mit LoadIcon ;)! Dies ist keine Methode von TIcon sondern eine WinApi-Methode die in der Unit Windows deklariert ist.

Gruß wulfskin!


DelphiNoob - Di 25.03.03 16:18

Nu hab ich euch alle Lieb ;)

DANKEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!

Zur vervollständigung:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
icon: TIcon;

...

icon:=TIcon.create;
      try
        icon.handle:=(LoadIcon(hInstance,'MYICON'));
        listitem.Imageindex:=ImageList1.AddIcon(icon);
      finally
        icon.Free;
      end;


Mfg
DelphiNoob