AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

array of record sortieren

Ein Thema von venice2 · begonnen am 7. Dez 2020 · letzter Beitrag vom 27. Jan 2021
Antwort Antwort
Seite 3 von 3     123
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
969 Beiträge
 
Delphi 2010 Architect
 
#21

AW: array of record sortieren

  Alt 8. Dez 2020, 22:44
Neues Problem das nur unter 32Bit auftritt.

Zitat:
Exception:
------------------------------------------------------------------------------------
2.2 Address: 0263A332
2.5 Type : EBufferOverflowError
2.6 Message: Application has corrupted the memory: $0E663DE0 ARRAY [?] 5128 bytes.
2.7 ID : 40060000
2.11 Sent : 0

Call Stack Information:
----------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack |Address |Module |Offset |Unit |Class |Procedure/Method |Line |
----------------------------------------------------------------------------------------------------------------------------------------
|*Exception Thread: ID=9580; Parent=0; Priority=0 |
|Class=; Name=MAIN |
|DeadLock=0; Wait Chain= |
|Comment= |
|--------------------------------------------------------------------------------------------------------------------------------------|
|7FFFFFFE|03 |00000000|0263A337|SK_Aero.dll |0000A337|System | |_DynArrayClear | |
|00000020|04 |0019E490|0281B1B8|SK_Aero.dll |001EB1B8|uListView|TSkinListView|SortItems |1858[38] |
|00000020|04 |0019E6CC|02819C37|SK_Aero.dll |001E9C37|uListView|TSkinListView|ListViewProc |1270[40] |
|00000020|04 |0019E9DC|0281783B|SK_Aero.dll |001E783B|uListView|TSkinListView|ClientWndProc |292[18] |
In der Funktion.

Delphi-Quellcode:

    SetLength(lItemsInfoArray, length(ItemsInfo));

    for i := High(ItemsInfo) downto Low(ItemsInfo) do
      begin
        j := StringList.IndexOf(ItemsInfo[i].IdentStr);
        if j >= 0 then
          begin
            lItemsInfoArray[j] := ItemsInfo[i];
            StringList[j] := 'Vorhanden';
          end;
      end;

      for i := High(lItemsInfoArray) downto Low(lItemsInfoArray) do
        ItemsInfo[i] := lItemsInfoArray[i];
selber code unter 64Bit läuft einwandfrei.

Kommentiere ich ihn aus läuft alles nur nicht mehr sortiert.


Hmm..

Geändert von venice2 ( 9. Dez 2020 um 03:22 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.389 Beiträge
 
Delphi 10.4 Sydney
 
#22

AW: array of record sortieren

  Alt 9. Dez 2020, 11:39
buf: array [0 .. 255] of Char;

ListView_GetItemText entspricht in dieser Delphi-Version ListView_GetItemTextW und erwartet als Buffer ein Array aus WideChar
Als Buffergröße muss nicht die maximale Anzahl der Byte, sondern die maximale Anzahl der WideChar (je 2 Byte) angegeben werden.
Delphi-Quellcode:
buf: array [0 .. 255] of WideChar;

ListView_GetItemText(hListView, i, 1, buf, Length(buf));
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
969 Beiträge
 
Delphi 2010 Architect
 
#23

AW: array of record sortieren

  Alt 9. Dez 2020, 15:45
buf: array [0 .. 255] of Char;

ListView_GetItemText entspricht in dieser Delphi-Version ListView_GetItemTextW und erwartet als Buffer ein Array aus WideChar
Als Buffergröße muss nicht die maximale Anzahl der Byte, sondern die maximale Anzahl der WideChar (je 2 Byte) angegeben werden.
Delphi-Quellcode:
buf: array [0 .. 255] of WideChar;

ListView_GetItemText(hListView, i, 1, buf, Length(buf));
Die Stringliste wird korrekt mit den Daten gefüllt.
Das Problem ist das Array.


Exception:
------------------------------------------------------------------------------------
2.2 Address: 0238A332
2.5 Type : EBufferOverflowError
2.6 Message: Application has corrupted the memory: $0674EB40 ARRAY [?] 5128 bytes.
2.7 ID : E53C0000
2.11 Sent : 0

Call Stack Information:
--------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack |Address |Module |Offset |Unit |Class |Procedure/Method |Line |
--------------------------------------------------------------------------------------------------------------------------------------
|*Exception Thread: ID=2236; Parent=0; Priority=0 |
|Class=; Name=MAIN |
|DeadLock=0; Wait Chain= |
|Comment= |
|------------------------------------------------------------------------------------------------------------------------------------|
|7FFFFFFE|03 |00000000|0238A337|SK_Aero.dll |0000A337|System | |_DynArrayClear | |
|00000020|04 |0019D9D0|0256B1A7|SK_Aero.dll |001EB1A7|uListView|TSkinListView|SortItems |1863[42] |
|00000020|03 |0019E1C0|7742E892|a |0001E892|recursive|area |removed |3[0] |
|00000020|03 |0019E464|023896CA|SK_Aero.dll |000096CA|System | |_CopyRecord | |
|00000020|04 |0019E47C|0256B10F|SK_Aero.dll |001EB10F|uListView|TSkinListView|SortItems |1848[27] |
|00000020|04 |0019E6CC|02569C24|SK_Aero.dll |001E9C24|uListView|TSkinListView|ListViewProc |1271[40] |



definition von ListView_GetItemText
D2010
Delphi-Quellcode:
function ListView_GetItemText(hwndLV: HWND; i, iSubItem: Integer;
  pszText: PWideChar; cchTextMax: Integer): Integer;
D10.4
LPWSTR = PWideChar!
Delphi-Quellcode:
function ListView_GetItemText(hwndLV: HWND; i, iSubItem: Integer;
  pszText: LPWSTR; cchTextMax: Integer): Integer;
Sollte also gleich sein. Aber . Ja! Ich habe es getestet macht keinen unterschied. Danke
Anwendung stürzt ab innerhalb des Arrays

Geändert von venice2 ( 9. Dez 2020 um 17:54 Uhr)
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
969 Beiträge
 
Delphi 2010 Architect
 
#24

AW: array of record sortieren

  Alt 9. Dez 2020, 20:58
Also das Array ist definitiv falsch unter 32Bit

Aber!
Warum wird das von 64Bit akzeptiert und in 32Bit nicht?
Wäre schön wenn mir das jemand erklären könnte.

32Bit
Ich muss die länge des Array lItemsInfoArray auf StringList.Count setzen = 172 Einträge.
Die 64Bit Version
SetLength(lItemsInfoArray, length(ItemsInfo));

gibt mir nur 160 Einträge zurück. Warum ??

Delphi-Quellcode:
    StringList := TStringList.Create;
    try
      ItemCount := ListView_GetItemCount(hListView);

      SubItem := ItemsInfo[0].SubItem;

      for IntI := 0 to ItemCount - 1 do
      begin
        ZeroMemory(@buf, sizeof(buf));
        ListView_GetItemText(hListView, IntI, 1, buf, Length(buf));
        ItemText := buf;
        StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen.
      end;

      SetLength(lItemsInfoArray, StringList.Count);
      try
        for IntI := StringList.Count downto 0 do
        begin
          j := StringList.IndexOf(ItemsInfo[IntI].IdentStr);
          if j >= 0 then
            begin
              lItemsInfoArray[j] := ItemsInfo[IntI];
              StringList[j] := 'Vorhanden';
            end;
        end;

        for IntI := High(lItemsInfoArray) downto Low(lItemsInfoArray) do
          ItemsInfo[IntI] := lItemsInfoArray[IntI];
      except
        raise Exception.Create(SysErrorMessage(GetLastError));
      end;


    finally
      StringList.Free;
    end;
Unter 64Bit ist es die korrekte länge.
Delphi-Quellcode:
    StringList := TStringList.Create;
    try
      ItemCount := ListView_GetItemCount(hListView);

      SubItem := ItemsInfo[0].SubItem;

      for i := 0 to ItemCount - 1 do
      begin
        ZeroMemory(@buf, sizeof(buf));
        ListView_GetItemText(hListView, i, SubItem, buf, SizeOf(buf));
        ItemText := buf;
        StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen.
      end;

      SetLength(lItemsInfoArray, length(ItemsInfo));

      for i := High(ItemsInfo) downto Low(ItemsInfo) do
        begin
          j := StringList.IndexOf(ItemsInfo[i].IdentStr);
          if j >= 0 then
            begin
              lItemsInfoArray[j] := ItemsInfo[i];
              StringList[j] := 'Vorhanden';
            end;
        end;

        for i := High(lItemsInfoArray) downto Low(lItemsInfoArray) do
          ItemsInfo[i] := lItemsInfoArray[i];
    finally
      StringList.Free;
    end;
Wieder so eine Sache die mich extrem nervt.
64Bit gibt mir die korrekte länge von length(ItemsInfo) zurück und zwar 172, aber wie ich schon sagte unter 32Bit nur 160.
Bei solchen gravierenden Fehlern sucht man sich blöde.

Geändert von venice2 ( 9. Dez 2020 um 21:11 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.389 Beiträge
 
Delphi 10.4 Sydney
 
#25

AW: array of record sortieren

  Alt 27. Jan 2021, 14:09
Welcher von beiden Quellcode ist den die 64Bit-Version?
Die Stringliste hat in beiden Versionen(32/64 Bit) 172 Einträge und das ist die korrekte Anzahl von Items in der ListView?
Das Array ItemsInfo hat in der 64Bit-Version 172 Einträge und in der 32Bit-Version 160 Einträge?

Wenn das Array ItemsInfo gefüllt wird, wird vermutlich auch parallel die ListView gefüllt.
Vergleiche bei jedem hinzugefügten Element ListView_GetItemCount(hListView) mit Length(ItemsInfo).

Wenn da das Problem liegt, zeig uns doch bitte den vollständigen Code wo ItemsInfo gefüllt wird.
Inklusive der Stelle wo das aufgerufen wird.

Schalte bitte die Warnungen in deinem Compiler ein, insbesondere "Variable ist unter Umständen nicht initialisiert".
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf