![]() |
Dynamisches 2 Dimensionales Array problem
Mein Array.
Delphi-Quellcode:
var
ImgIcon: array of array of Cardinal;
Delphi-Quellcode:
Ein Eintrag sieht dann so aus.
procedure TSkinListView.SetItemIcon(nItem, nSubItem: Integer; wsItems: WideString);
var fi: TSHFileInfo; Item, SubItem: Integer; begin ZeroMemory(@fi,sizeof(TSHFileInfo)); if SHGetFileInfo(PWideChar(wsItems), 0, fi, sizeof(TSHFileInfo), SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME) <> 0 then begin SetLength(ImgIcon, nItem + 1, nSubItem + 1); ImgIcon[nItem, nSubItem] := fi.hIcon; end; end; 1 Eintrag (0, 0, 12345). 2 Eintrag (0, 0, 54321). Das Problem wenn ich nun gegenprüfe.
Delphi-Quellcode:
Dann ist auch bei HeaderItem = 3 die Bedingung true obwohl ich als Subitem immer 2 addiert habe.
if ImgIcon[(Item + 1), HeaderItem] <> 0 then
begin Wie kann es also sein das die Bedingung dann trotzdem erfüllt wird. Warum wird hier nicht das Item und SubItem addiert? also 1 Eintrag (1, 2, 12345). 2 Eintrag (2, 2, 54321). gruss |
AW: Dynamisches 2 Dimensionales Array problem
Obwohl ich kaum verstehe, was du eigentlich meinst: Wenn in SetItemIcon der Parameter nSubItem immer 2 ist, dann sollte ein Zugriff auf
Delphi-Quellcode:
mit
ImgIcon[(Item + 1), HeaderItem]
Delphi-Quellcode:
einen Range-Error auslösen.
HeaderItem = 3
Kannst du ein kleines Beispielprogramm ohne viel Drumrum zeigen, das dein Problem reproduziert? |
AW: Dynamisches 2 Dimensionales Array problem
Zitat:
Die Bedingung wird mit True erfüllt obwohl HeaderItem 3 eigentlich außerhalb des Bereichs liegt. Das ist ja mein Problem. ImgIcon[(Item + 1), HeaderItem] das Ergebnis ist mehr wie 0 wenn HeaderItem 3 ist. Zitat:
Der Aufruf ist PLList.SetItemIcon(PlayListCount, 2, pFiles[1]); PlayListCount wird inkrementiert 2 ist das SubItem für das HeaderItem pFiles[1]) ist der Pfad zur Exe Datei. gruss |
AW: Dynamisches 2 Dimensionales Array problem
Wie im Bild zu sehen wird nur das HIcon zum Array addiert.
Das Item und SubItem hingegen nicht. Ich glaube das gehe ich falsch an. Muss da nochmal drüber Nachdenken. gruss |
AW: Dynamisches 2 Dimensionales Array problem
Ich behelfe mir jetzt so.
Delphi-Quellcode:
if HeaderItem = High(ImgIcon[0]) then
Was ich aber durch das Array erreichen wollte war etwas anderes. Die ListView hat 5 Columns Für jede Column kann ich bei belieben ein Icon Addieren. Über das Mehrdimensionale Array wollte ich nun weitergeben welche Column einen Icon-Eintrag hat und das auf diese weise hinterfragen.
Delphi-Quellcode:
if ImgIcon[(Item + 1), HeaderItem] <> 0 then
Nur das will er nicht. Das HeaderItem ist im Array 0 genauso wie das Item lediglich der 3 Eintrag ist belegt mit dem Handle des Icon. Eintrag 0 = [0](0, 0, 12345) Wie soll ich so das HeaderItem mit dem 2 Eintrag überprüfen? Wenn da überall 0 steht. Theoretisch wäre es ja auch möglich das der erste Eintrag im ListView bei Column 1 ein Icon hat die anderen in der Liste bei Column 1 aber nicht. Was dann? Wenn ich die Einträge im Array nicht auslesen kann. Meiner Meinung nach müsste dann der erste Eintrag im Array so aussehen.. Eintrag 0 = [0](1, 2, 12345) = [0](Item, SubItem, IconHandle) Ist es möglich das es auf diese weise nicht geht? (Ich glaube muss mir ein Array auf Record zulegen.) 1 Dimensional. Vielleicht kommt es jetzt etwas besser rüber. gruss |
AW: Dynamisches 2 Dimensionales Array problem
Ok hat sich erledigt.
So geht's wie es soll.
Delphi-Quellcode:
type
PItemsInfo = ^TItemsInfo; TItemsInfo = record Item : Integer; SubItem : Integer; ImgIcon: HICON; end;
Delphi-Quellcode:
var
ItemsInfo: array of TItemsInfo;
Delphi-Quellcode:
und die Überprüfung so
procedure TSkinListView.SetSysItemIcon(nItem, nSubItem: Integer; wsItems: WideString);
var fi: TSHFileInfo; begin ZeroMemory(@fi,sizeof(TSHFileInfo)); if SHGetFileInfo(PWideChar(wsItems), 0, fi, sizeof(TSHFileInfo), SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON) <> 0 then begin SetLength(ItemsInfo, nItem + 1); ItemsInfo[nItem].Item := nItem; ItemsInfo[nItem].SubItem := nSubItem; ItemsInfo[nItem].ImgIcon := fi.hIcon; end; end;
Delphi-Quellcode:
Warum das mit dem Mehrdimensionalen Array nicht ging.. na was soll's
if (HeaderItem = ItemsInfo[Item].SubItem) and (ItemsInfo[Item].ImgIcon <> 0) then
begin gruss |
AW: Dynamisches 2 Dimensionales Array problem
Ich vermute mal ins Blaue, daß das mit dem dynamischen Array nicht geklappt hat, weil das SetLength nicht korrekt verwendet wurde. Ich war erstaunt, daß das SetLength drei Parameter akzeptiert, das ist zumindest in meinem Berlin so nicht dokumentiert. Für dynamische Arrays gibt es zwei Wege, entweder fortgesetztes Aufrufen von SetLength für jede Dimension (wie
![]() ![]() Sherlock |
AW: Dynamisches 2 Dimensionales Array problem
Zitat:
Stellt sich nur die Frage, warum die Abfrage überhaupt mit HeaderItem = 3 durchgeführt wird. |
AW: Dynamisches 2 Dimensionales Array problem
Zitat:
Delphi-Quellcode:
SetLength(ImgIcon, Item + 1, SubItem)
Das hat kein Problem verursacht bis auf das die ersten beiden Einträge 0 waren. Siehe das ![]() Zitat:
Aber mit dem Array of Record funktioniert es ja jetzt. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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-2025 by Thomas Breitkreuz