AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Dynamisches 2 Dimensionales Array problem
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisches 2 Dimensionales Array problem

Ein Thema von EWeiss · begonnen am 15. Feb 2017 · letzter Beitrag vom 16. Feb 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Dynamisches 2 Dimensionales Array problem

  Alt 15. Feb 2017, 23:06
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

Geändert von EWeiss (16. Feb 2017 um 02:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: Dynamisches 2 Dimensionales Array problem

  Alt 15. Feb 2017, 23:23
Obwohl ich kaum verstehe, was du eigentlich meinst: Wenn in SetItemIcon der Parameter nSubItem immer 2 ist, dann sollte ein Zugriff auf ImgIcon[(Item + 1), HeaderItem] mit HeaderItem = 3 einen Range-Error auslösen.

Kannst du ein kleines Beispielprogramm ohne viel Drumrum zeigen, das dein Problem reproduziert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Dynamisches 2 Dimensionales Array problem

  Alt 15. Feb 2017, 23:31
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Dynamisches 2 Dimensionales Array problem

  Alt 15. Feb 2017, 23:41
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

Geändert von EWeiss (11. Jul 2019 um 16:45 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Dynamisches 2 Dimensionales Array problem

  Alt 16. Feb 2017, 02:23
Ich behelfe mir jetzt so.

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.

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

Geändert von EWeiss (11. Jul 2019 um 16:45 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Dynamisches 2 Dimensionales Array problem

  Alt 16. Feb 2017, 03:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#7

AW: Dynamisches 2 Dimensionales Array problem

  Alt 16. Feb 2017, 07:58
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: Dynamisches 2 Dimensionales Array problem

  Alt 16. Feb 2017, 08:08
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Dynamisches 2 Dimensionales Array problem

  Alt 16. Feb 2017, 08:15
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.
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

Geändert von EWeiss (16. Feb 2017 um 08:18 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 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