Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi System Image List kopieren (https://www.delphipraxis.net/123752-system-image-list-kopieren.html)

oki 7. Nov 2008 19:55


System Image List kopieren
 
Hi Leute,

ich möchte die System Image List in meine eigene ImageList kopieren, damit ich die passenden Icons zu gelisteten Dateien in meinem Listview anzeigen kann. Hierzu habe ich zwei eigene Imagelisten angelegt. Eine für die Icons 32x32 und eine für die Icons 16x16. Zum Kopieren wollte ich die Shell-Funktion Shell_GetImageLists aus Shell32.dll verwenden.

Die Definition aus der Hilfe lautet:
Zitat:

BOOL Shell_GetImageLists(
HIMAGELIST *phiml,
HIMAGELIST *phimlSmall
);

Parameters

phiml
[in] Pointer to the handle of an image list which, on success, receives the system image list for large (32 x 32) icons.
phimlSmall
[in] Pointer to the handle of an image list which, on success, receives the system image list for small (16 x 16) icons.
Leider klappt das nicht. Ich bekomme folgende Fehlermeldung:
Zitat:

E2036 Variable erforderlich
Eingebunden und benutzt habe ich die Funktion folgendermaßen:

Delphi-Quellcode:
....
function Shell_GetImageLists(LargeList : PCardinal; SmallList : PCardinal) : Boolean; stdcall;

implementation

function Shell_GetImageLists; external shell32 name 'Shell_GetImageLists';
....


procedure TOTFListView.CreateWnd;
begin
  inherited;
  FFileImageList16 := TImageList.Create(self);
  FFileImageList16.Height := 16;
  FFileImageList16.Width := 16;
  self.SmallImages := FFileImageList16;

  FFileImageList32 := TImageList.Create(self);
  FFileImageList32.Height := 32;
  FFileImageList32.Width := 32;
  self.LargeImages := FFileImageList32;

  Shell_GetImageLists(@FFileImageList32.Handle, @FFileImageList16.Handle); // Fehler
end;
Ich denke, die Fehlermeldung kommt, weil Handle eine Nur-Lese-Eigenschaft ist.
Gleichzeitig gehe ich aber davon aus, dass das Handle gar nicht verändert werden soll, sondern nur die Zielliste ist, in die die Icons kopiert werden sollen.

Jetzt gibt es zwei Möglichkeiten, jemand weist mir den Richtigen Weg für die Benutzung dieser Funktion oder es gibt einen anderen Weg den ich nicht sehe.

Schon mal Dank für die Hilfe,

Gruß oki

Apollonius 7. Nov 2008 19:58

Re: System Image List kopieren
 
Du musst Zeiger auf lokale Variablen übergeben, in die dann Handles geschrieben werden. Dann musst du einen Weg finden, die Listen zu kopieren.

oki 7. Nov 2008 21:34

Re: System Image List kopieren
 
Hi,

genau das Kopieren soll die Funktion imho ja ausführen. Hier die Beschreibung aus der Hilfe:
Zitat:

Shell_GetImageLists Function

--------------------------------------------------------------------------------

Retrieves system image lists for large and small icons.

Gruß oki

Apollonius 7. Nov 2008 21:38

Re: System Image List kopieren
 
Eben nicht. Die Funktion macht dir interne Variablen zugänglich, welche in die out-Parameter geschrieben werden. Du hast jetzt das Problem, dass du die Imagelist in die Delphi-TImageList kopieren musst.

Du solltest auch beachten, dass es diese Funktion in Zukunft möglicherweise nicht mehr geben wird.

Edit:
Zitat:

Ich denke, die Fehlermeldung kommt, weil Handle eine Nur-Lese-Eigenschaft ist.
Zumindest in Delphi 2006 hat Handle einen Setter. Die Fehlermeldung kommt, weil eine Eigenschaft keine Adresse hat. Du kannst also einfach die von Shell_GetImageLists zurückgegebenen Handles in die Imagelisten einsetzen, wenn du ShareImages auf True setzt.

oki 7. Nov 2008 21:42

Re: System Image List kopieren
 
Ähmm,

dann ist das klar. Nur wie kopiere ich dann die Images? Auf die kommt es mir ja eigentlich an.

Gruß oki

Apollonius 7. Nov 2008 21:47

Re: System Image List kopieren
 
Sollte es bei Edits nicht auch einen roten Kasten geben?

oki 7. Nov 2008 21:48

Re: System Image List kopieren
 
OK,

jetzt hab ich das gefunden:
Zitat:

_GetIcon Function
Creates an icon from an image and mask in an image list.

Syntax


HICON ImageList_GetIcon(
HIMAGELIST himl,
int i,
UINT flags
);

Parameters

himl
A handle to the image list.
i
An index of the image.
flags
A combination of flags that specify the drawing style. For a list of values, see the description of the fStyle parameter of the ImageList_Draw function.
Return Value

Returns the handle to the icon if successful, or NULL otherwise.
Stellt sich als nächstes die Frage; Wie bekomme ich das Icon von dem ich das Handle habe in meine Imagelist?

Gruß oki

oki 7. Nov 2008 21:51

Re: System Image List kopieren
 
Zitat:

Zitat von Apollonius
Sollte es bei Edits nicht auch einen roten Kasten geben?

Zumindest bei mir kam der rote Kasten.

Ich probier das mal aus.

Zitat:

Du solltest auch beachten, dass es diese Funktion in Zukunft möglicherweise nicht mehr geben wird.
dann ist das eine Sackgasse. Gib es einen besseren Weg?

Gruß oki

Luckie 7. Nov 2008 21:57

Re: System Image List kopieren
 
Lad dir mal meine nonVCL Demos zu den Tutorials runter. Da hat Mathias beim Litview-Demo mit der Systemiconlist gearbeitet.

Apollonius 7. Nov 2008 21:58

Re: System Image List kopieren
 
Wie wäre es mit SHGetImageList?

oki 7. Nov 2008 22:15

Re: System Image List kopieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Dank euch beiden.
Folgender Code klappt bei mir:
Delphi-Quellcode:
procedure TOTFListView.CreateWnd;
var SML, ML : PLongWord;
begin
  inherited;
  FFileImageList16 := TImageList.Create(self);
  FFileImageList16.Height := 16;
  FFileImageList16.Width := 16;
  self.SmallImages := FFileImageList16;

  FFileImageList32 := TImageList.Create(self);
  FFileImageList32.Height := 32;
  FFileImageList32.Width := 32;
  self.LargeImages := FFileImageList32;

  GetMem(ML, Sizeof(LongWord));
  ML^ := 0;
  GetMem(SML, Sizeof(LongWord));
  SML^ := 0;
  Shell_GetImageLists(ML, SML);
  if SML^ > 0 then
    FFileImageList16.Handle := SML^;
  if ML^ > 0 then
    FFileImageList32.Handle := ML^;
  FreeMem(ML);
  FreeMem(SML);
end;
In den Anhang habe ich auch noch einen Screenshot gelegt.

Jetzt stellt sich nur noch die Frage mit der Sackgasse.

Gruß oki

Apollonius 7. Nov 2008 22:19

Re: System Image List kopieren
 
Es ist unnötig, hier auf den Speichermanager zurückzugreifen. Deklariere SML und ML als LongWord bzw. HIMAGELIST. Dann kannst du dir die Aufrufe von GetMem und FreeMem sparen. Der Funktion kannst du einfach @SML und @ML übergeben.

oki 7. Nov 2008 23:45

Re: System Image List kopieren
 
Klar, mit den Zeigern. Eine Deklaration mittels var in der Funktion tut es sicher auch. Ist beim Probieren entstanden. Ich wollte auch erst HIMAGELIST benutzen, hab aber nicht rausbekommen wo das deklariert ist.

Gruß oki

oki 9. Nov 2008 19:05

Re: System Image List kopieren
 
Hi Luckie.

Ich stell mich wohl grad etwas blöd an, aber ich kann das Demo nicht finden. Ich hab im Forum gesucht und auf deiner HomePage. Kannst du bitte mal so nett sein und mir den direkten Link posten?

Auch wenn mein Code aktuell funzt möchte ich ihn trotzdem noch mal prüfen. Ich bin mir nicht sicher, ob ich wirklich alles richtig mache in der Verwendung.

Schon mal Dank und Gruß

oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz