AW: array of record sortieren
Neues Problem das nur unter 32Bit auftritt.
Zitat:
Delphi-Quellcode:
selber code unter 64Bit läuft einwandfrei.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]; Kommentiere ich ihn aus läuft alles nur nicht mehr sortiert. Hmm.. |
AW: array of record sortieren
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)); |
AW: array of record sortieren
Zitat:
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:
D10.4
function ListView_GetItemText(hwndLV: HWND; i, iSubItem: Integer;
pszText: PWideChar; cchTextMax: Integer): Integer; LPWSTR = PWideChar!
Delphi-Quellcode:
Sollte also gleich sein. Aber . Ja! Ich habe es getestet macht keinen unterschied. Danke
function ListView_GetItemText(hwndLV: HWND; i, iSubItem: Integer;
pszText: LPWSTR; cchTextMax: Integer): Integer; Anwendung stürzt ab innerhalb des Arrays |
AW: array of record sortieren
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
Delphi-Quellcode:
SetLength(lItemsInfoArray, length(ItemsInfo));
gibt mir nur 160 Einträge zurück. Warum ??
Delphi-Quellcode:
Unter 64Bit ist es die korrekte länge.
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;
Delphi-Quellcode:
Wieder so eine Sache die mich extrem nervt.
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; 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. |
AW: array of record sortieren
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". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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