Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Dynamisches 2 Dimensionales Array problem (https://www.delphipraxis.net/191751-dynamisches-2-dimensionales-array-problem.html)

EWeiss 15. Feb 2017 22:06


Dynamisches 2 Dimensionales Array problem
 
Mein Array.

Delphi-Quellcode:
var
  ImgIcon: array of array of Cardinal;
Delphi-Quellcode:
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;
Ein Eintrag sieht dann so aus.

1 Eintrag (0, 0, 12345).
2 Eintrag (0, 0, 54321).

Das Problem wenn ich nun gegenprüfe.

Delphi-Quellcode:
if ImgIcon[(Item + 1), HeaderItem] <> 0 then
begin
Dann ist auch bei HeaderItem = 3 die Bedingung true obwohl ich als Subitem immer 2 addiert habe.

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

Uwe Raabe 15. Feb 2017 22:23

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:
ImgIcon[(Item + 1), HeaderItem]
mit
Delphi-Quellcode:
HeaderItem = 3
einen Range-Error auslösen.

Kannst du ein kleines Beispielprogramm ohne viel Drumrum zeigen, das dein Problem reproduziert?

EWeiss 15. Feb 2017 22:31

AW: Dynamisches 2 Dimensionales Array problem
 
Zitat:

Obwohl ich kaum verstehe, was du eigentlich meinst:
Kurz erläutert.
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:

Kannst du ein kleines Beispielprogramm ohne viel Drumrum zeigen, das dein Problem reproduziert?
Nur an Hand des Code Beispiel das ich schon geschickt habe.

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

EWeiss 15. Feb 2017 22:41

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

EWeiss 16. Feb 2017 01:23

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

EWeiss 16. Feb 2017 02:12

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:
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;
und die Überprüfung so

Delphi-Quellcode:
if (HeaderItem = ItemsInfo[Item].SubItem) and (ItemsInfo[Item].ImgIcon <> 0) then
begin
Warum das mit dem Mehrdimensionalen Array nicht ging.. na was soll's

gruss

Sherlock 16. Feb 2017 06:58

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 hier weiter unten beschrieben), oder man verwendet Delphi-Referenz durchsuchenSystem.DynArraySetLength.

Sherlock

Uwe Raabe 16. Feb 2017 07:08

AW: Dynamisches 2 Dimensionales Array problem
 
Zitat:

Zitat von EWeiss (Beitrag 1361740)
Die Bedingung wird mit True erfüllt obwohl HeaderItem 3 eigentlich außerhalb des Bereichs liegt.

Wenn HeaderItem außerhalb des Bereichs liegt, sollte ein RangeError ausgelöst werden. Wenn allerdings kein Range-Checking eingeschaltet ist, kann als Rückgabe alle Mögliche drin stehen. Statistisch liegt dann die Wahrscheinlichkeit für eine Null bei ca. 1:MaxInt.

Stellt sich nur die Frage, warum die Abfrage überhaupt mit HeaderItem = 3 durchgeführt wird.

EWeiss 16. Feb 2017 07:15

AW: Dynamisches 2 Dimensionales Array problem
 
Zitat:

Zitat von Sherlock (Beitrag 1361752)
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 hier weiter unten beschrieben), oder man verwendet Delphi-Referenz durchsuchenSystem.DynArraySetLength.

Sherlock

Nun ja ich habe mich hier schlau gemacht und gelesen das man SetLength auch mit 2 Parametern aufrufen kann.
Delphi-Quellcode:
SetLength(ImgIcon, Item + 1, SubItem)


Das hat kein Problem verursacht bis auf das die ersten beiden Einträge 0 waren.
Siehe das Bild in diesen Beitrag

Zitat:

Stellt sich nur die Frage, warum die Abfrage überhaupt mit HeaderItem = 3 durchgeführt wird.
Ich bin dazu gezwungen da ich alle Header durchlaufen muss.
Aber mit dem Array of Record funktioniert es ja jetzt.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr.

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