array of record sortieren
Bekomme es wieder nicht gebacken.
Delphi-Quellcode:
Ich möchte das Array so sortieren das der "StringList[j]" String gleich ist mit dem IdentStr.
procedure TSkinListView.SortItems(hListView: hWnd; ColumnIndex: Integer);
var i, j : Integer; hItemsInfo : TItemsInfo; StringList: TStringList; ItemCount: Integer; buf: array [0 .. 255] of Char; ItemText: PWideChar; begin ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert StringList := TStringList.Create; try ItemCount := ListView_GetItemCount(hListView); for i := 0 to ItemCount - 1 do begin ZeroMemory(@buf, sizeof(buf)); ListView_GetItemText(hListView, i, 1, buf, sizeof(buf)); ItemText := buf; StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen. end; for i := High(ItemsInfo) downto Low(ItemsInfo) do begin for j := 0 to (i - 1) do begin // Problem es wird nur der nächste mit dem vorherigen getauscht. if StringList[j] > ItemsInfo[j].IdentStr then begin hItemsInfo := ItemsInfo[j]; ItemsInfo[J] := ItemsInfo[j + 1]; ItemsInfo[J + 1] := hItemsInfo; end; end; end; finally StringList.Free; end; end; Kann wer helfen und sagen was falsch läuft. |
AW: array of record sortieren
Ich gehe mal davon aus, ItemsInfo ist dein "array of record", welches sortiert werden soll. Oder?
Wo wird denn Itemsinfo gefüllt? Wo und wie ist ItemsInfo deklariert? |
AW: array of record sortieren
Zitat:
Delphi-Quellcode:
TItemsInfo = record
Item: Integer; SubItem: Integer; ImgIcon: HICON; Extension: WideString; Path: WideString; Width: Integer; Height: Integer; IdentStr: WideString; end; TSkinListView = class(TInterfacedPersistent, ISkinListView) private ItemsInfo: array of TItemsInfo; //...
Delphi-Quellcode:
Ich sortiere die Liste
procedure TSkinListView.SetItemIcon(nItem, nSubItem: Integer;
ImgIdent: WideString; ImgPath: WideString); var lpImg: LONG_PTR; hbmReturn: HBitmap; ii: ICONINFO; hbmMask: HBitmap; bw, bh: single; begin if ImgPath <> '' then begin if FileExists(ImgPath) then begin if GdipLoadImageFromFile(PWideChar(ImgPath), lpImg) = OK then begin GdipCreateHBITMAPFromBitmap(lpImg, hbmReturn, 0); if hbmReturn <> 0 then begin GdiPGetImageDimension(lpImg, bw, bh); hbmMask := CreateCompatibleBitmap(GetDC(0), round(bw), round(bh)); ii.fIcon := TRUE; ii.hbmColor := hbmReturn; ii.hbmMask := hbmMask; hic := CreateIconIndirect(ii); DeleteObject(hbmMask); DeleteObject(hbmReturn); end; end; end; end; SetLength(ItemsInfo, nItem + 1); ItemsInfo[nItem].Item := nItem; ItemsInfo[nItem].SubItem := nSubItem; ItemsInfo[nItem].Width := round(bw); ItemsInfo[nItem].Height := round(bh); ItemsInfo[nItem].ImgIcon := hic; ItemsInfo[nItem].IdentStr := ImgIdent; end;
Delphi-Quellcode:
ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert
und fülle eine StringList mit den Aktuellen Daten so wie sie sortiert wurden. Alphabetisch positiv und negativ abhängig von der Sortier Richtung. Nun muss ich das Array of record ItemsInfo so sortieren das der IdentStr gleich ist den Index der StringList. Wenn ich das nicht tue werden die Icons an falscher Position gezeichnet. ItemsInfo[J] müsste dann gleich sein wie der Index der Stringlist der so verglichen wird
Delphi-Quellcode:
if StringList[j] > ItemsInfo[j].IdentStr then
|
AW: array of record sortieren
Ich bin zwar nue ein Anfänger,doch ein Senf kann ich dazugeben.
So habe ich es gemacht. Ist natürlich nur als Beispiel gedacht.
Delphi-Quellcode:
type
TRec = record Titel : string; Network : string; URL : string; end; type TArray = array of TRec; function Compare(const Data1, Data2: TRec): Integer; begin Result := CompareText(Data1.Titel, Data2.Titel); end; procedure Swap(var Data1, Data2: TRec); var Temp : TRec; begin Temp := Data1; Data1 := Data2; Data2 := Temp; end; procedure SortArray(var People: TArray); var Index : Integer; Laenge : Integer; Swapped : Boolean; begin Laenge := Length(People); repeat Swapped := False; for Index := 1 to Laenge - 1 do begin if Compare(People[Index - 1], People[Index]) > 0 then begin Swap(People[Index - 1], People[Index]); Swapped := True; end; end; Dec(Laenge); until not Swapped; end; procedure TForm1.Button1Click(Sender: TObject); var Index : Integer; Array_Rec : TArray; begin Index := 0; SetLength(Array_Rec, Memo1.Lines.Count - 1); while Index <= Memo1.Lines.Count - 1 do begin Array_Rec[Index].Titel := Memo1.Lines[Index]; Array_Rec[Index].Network := Memo1.Lines[Index + 1]; Array_Rec[Index].URL := Memo1.Lines[Index + 2]; Inc(Index, 3); end; SortArray(Array_Rec); for Index := 0 to Length(Array_Rec) - 1 do begin if Array_Rec[Index].Titel <> '' then begin Memo2.Lines.Add(Array_Rec[Index].Titel); Memo2.Lines.Add(Array_Rec[Index].Network); Memo2.Lines.Add(Array_Rec[Index].URL); end; end; end; |
AW: array of record sortieren
Danke werde mir das mal anschauen.
Dachte ich könnte das direkt in meine sortier Funktion mit übertragen. Nur weis ehrlich nicht wie.
Delphi-Quellcode:
function CompareFunc(lp1, lp2, SubItem: LParam): Integer; stdcall;
var buf1, buf2: WideString; a, b: Integer; begin SetLength(buf1, MAX_PATH); ZeroMemory(@buf1[1], MAX_PATH); SetLength(buf2, MAX_PATH); ZeroMemory(@buf2[2], MAX_PATH); ListView_GetItemText(LVHandle, lp1, SubItem, @buf1[1], MAX_PATH); ListView_GetItemText(LVHandle, lp2, SubItem, @buf2[1], MAX_PATH); case ColumnInfo[SubItem].SortType of // Dateigröße sortInt: begin // alles nach dem Leerzeichen entfernen (z.B. "12345 B") if (pos(#32, buf1) > 0) then delete(buf1, pos(#32, buf1), length(buf1)); if (pos(#32, buf2) > 0) then delete(buf2, pos(#32, buf2), length(buf2)); if UpDown then begin b := StrToIntDef(buf1, 0); a := StrToIntDef(buf2, 0); end else begin a := StrToIntDef(buf1, 0); b := StrToIntDef(buf2, 0); end; if (a > b) then Result := 1 else if (a < b) then Result := -1 else Result := 0; end // Name oder Typ else begin if UpDown then Result := lstrcmpi(@buf2[1], @buf1[1]) else Result := lstrcmpi(@buf1[1], @buf2[1]); end; end; end; |
AW: array of record sortieren
Deine Funktion gibt mir falsche werte zurück.
Delphi-Quellcode:
PItemsInfo = ^TItemsInfo;
TItemsInfo = record Item: Integer; SubItem: Integer; ImgIcon: HICON; Extension: WideString; Path: WideString; Width: Integer; Height: Integer; IdentStr: WideString; end;
Delphi-Quellcode:
type TArray = array of TItemsInfo;
Delphi-Quellcode:
procedure TSkinListView.Swap(var Data1, Data2: TItemsInfo);
var Temp : TItemsInfo; begin Temp := Data1; Data1 := Data2; Data2 := Temp; end; function TSkinListView.Compare(const Data1, Data2: TItemsInfo): Integer; begin Result := CompareText(Data1.IdentStr, Data2.IdentStr); end; procedure TSkinListView.SortArray(var ItemsInfo: TArray); var Index : Integer; Laenge : Integer; Swapped : Boolean; begin Laenge := Length(ItemsInfo); repeat Swapped := False; for Index := 1 to Laenge - 1 do begin if Compare(ItemsInfo[Index - 1], ItemsInfo[Index]) > 0 then begin Swap(ItemsInfo[Index - 1], ItemsInfo[Index]); Swapped := True; end; end; Dec(Laenge); until not Swapped; end;
Delphi-Quellcode:
var
ItemsArray: TArray; begin ItemCount := ListView_GetItemCount(hListView); SetLength(ItemsArray, ItemCount); i := 0; while i <= ItemCount - 1 do begin ItemsArray[i].IdentStr := ItemsInfo[i].IdentStr; ItemsArray[i].Item := ItemsInfo[i].Item; ItemsArray[i].SubItem := ItemsInfo[i].SubItem; ItemsArray[i].ImgIcon := ItemsInfo[i].ImgIcon; ItemsArray[i].Extension := ItemsInfo[i].Extension; ItemsArray[i].Path := ItemsInfo[i].Path; ItemsArray[i].Width := ItemsInfo[i].Width; ItemsArray[i].Height := ItemsInfo[i].Height; Inc(i); end; SortArray(ItemsArray); EDIT: Das hier
Delphi-Quellcode:
if Compare(ItemsInfo[Index - 1], ItemsInfo[Index]) > 0 then
Nicht jeder Eintrag hat ein Icon und wenn kein Icon existiert ist der IdentStr leer. muss zu
Delphi-Quellcode:
Compare(ItemsInfo[Index - 1], ItemsInfo[Index]);
geändert werden damit alles mitgenommen wird nicht nur die Strings. Hmm.. geht nur wenn ich numeric sortiere nicht mit string. https://im-coder.com/sortieren-von-a...habetisch.html Danke. |
AW: array of record sortieren
Das ist der Code aus deinem ersten Post. Habe ich mal umgemodelt. Einfach getippt. Nicht getestet.
Delphi-Quellcode:
procedure TSkinListView.SortItems(hListView: hWnd; ColumnIndex: Integer);
var i, j : Integer; lItemsInfoArray : array of TItemsInfo; StringList: TStringList; ItemCount: Integer; buf: array [0 .. 255] of Char; ItemText: PWideChar; begin ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert StringList := TStringList.Create; try ItemCount := ListView_GetItemCount(hListView); for i := 0 to ItemCount - 1 do begin ZeroMemory(@buf, sizeof(buf)); ListView_GetItemText(hListView, i, 1, buf, sizeof(buf)); ItemText := buf; StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen. end; //*************************************************************************************** // Das hier habe ich mal zugefügt ... 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] := 'Irgend ein Text, damit das Item nicht mehr gefunden wird. Ist ja schon zugewiesen'; end else begin // Hier ne Fehlerbehandlung rein end; end; // in lItemsInfoArray haben wir jetzt die korrekte Reihenfolge. Nun wieder zurück kopieren. for i := High(lItemsInfoArray) downto Low(lItemsInfoArray) do ItemsInfo[i] := lItemsInfoArray[i]; // und zwar bis hier hin zugefügt //*************************************************************************************** finally StringList.Free; end; end; |
AW: array of record sortieren
Danke dir für deine mühe.. werde es testen und mich dann nochmal melden ob es erfolgreich war.
|
AW: array of record sortieren
many thanks ;)
Hätte ich so nicht hinbekommen du hast mir den Tag gerettet. Danke nochmals. Funktioniert 1a nummeric und mit strings |
AW: array of record sortieren
100% geht es immer noch nicht.
Habe da immer noch einen Denkfehler.
Delphi-Quellcode:
Die liste wird anhand des ColumnIndex sortiert also abhängig davon welche column geklickt wurde.
procedure TSkinListView.SortItems(hListView: hWnd; ColumnIndex: Integer);
begin ListView_SortItems(hListView, @CompareFunc, ColumnIndex); //.. for i := 0 to ItemCount - 1 do begin ZeroMemory(@buf, sizeof(buf)); ListView_GetItemText(hListView, i, 1, buf, sizeof(buf)); ItemText := buf; StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen. end; end;
Delphi-Quellcode:
ListView_GetItemText(hListView, i, 1, buf, sizeof(buf));
Ist aber Hart gecodet füge ich jetzt dort den ColumnIndex anstell von "1" ein dann funktioniert es nur wenn ich auch tatsächlich die 1 klicke wo der IdentStr mit übergeben worden ist. Meine CompareFunc Funktion macht es richtig die sortiert nach Integer oder string. Aber ich weis nicht wie ich da die Icons noch mit einbinden kann. Mein Problem ist also wie übergeben ich die Icons damit diese immer mitwandern unabhängig davon welcher ColumnHeader geklickt wurde. Hmmm... mal wieder besonders schwierig. :lol: |
AW: array of record sortieren
Kannst Du nicht TArray nehmen und dann "einfach" die Methode Sort verwenden?
|
AW: array of record sortieren
Zitat:
|
AW: array of record sortieren
Wenn die Sortierung sich ändert, könnte das dann nicht der IComparer behandeln?
SoC wäre auf jeden Fall mal gut. ;-) |
AW: array of record sortieren
Wenn in TItemsInfo auch die Informationen aller Spalten, nach denen sortiert werden kann, vorhanden ist, dann ja. Aber das ist aus den bisherigen Posts nicht ersichtlich.
|
AW: array of record sortieren
Zitat:
Hier nochmal meine Compare function die entsprechend sortiert.
Delphi-Quellcode:
type
TSortType = (sortInt = 1, sortString = 2, sortFloat = 3, sortDateTime = 4);
Delphi-Quellcode:
Mein Problem ist wie analysiere ich bzw. nach welchen Kriterium teile ich der Listbox mit das diese Row ein Icon enthält und
function CompareFunc(lp1, lp2, SubItem: LParam): Integer; stdcall;
var buf1, buf2: WideString; a, b: Integer; begin SetLength(buf1, MAX_PATH); ZeroMemory(@buf1[1], MAX_PATH); SetLength(buf2, MAX_PATH); ZeroMemory(@buf2[2], MAX_PATH); ListView_GetItemText(LVHandle, lp1, SubItem, @buf1[1], MAX_PATH); ListView_GetItemText(LVHandle, lp2, SubItem, @buf2[1], MAX_PATH); case ColumnInfo[SubItem].SortType of // Dateigröße sortInt: begin // alles nach dem Leerzeichen entfernen (z.B. "12345 B") if (pos(#32, buf1) > 0) then delete(buf1, pos(#32, buf1), length(buf1)); if (pos(#32, buf2) > 0) then delete(buf2, pos(#32, buf2), length(buf2)); if UpDown then begin b := StrToIntDef(buf1, 0); a := StrToIntDef(buf2, 0); end else begin a := StrToIntDef(buf1, 0); b := StrToIntDef(buf2, 0); end; if (a > b) then Result := 1 else if (a < b) then Result := -1 else Result := 0; end // Name oder Typ else begin if UpDown then Result := lstrcmpi(@buf2[1], @buf1[1]) else Result := lstrcmpi(@buf1[1], @buf2[1]); end; end; end; an dieser position gehalten werden muss. Die feste Einstellung also "1" muss mit ColumnIndex ersetzt werden. Wenn ich das nicht tue funktionieren nur die ListBoxen welche column 1 Strings zugewiesen haben. Wenn ich dann jedoch Column "0" klicke dann funktioniert es natürlich wieder nicht. Ich muss das Bild\Icon irgendwie fest an die entsprechend Row binden, habe da aber noch keine entsprechende Idee. Es geht nicht um den Comparer oder <TArray>, den Comparer habe ich ja durch meine Funktion schon (sortiert auf integer und string). Zitat:
Das macht..
Delphi-Quellcode:
ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert
Aber. Bei deiner Sortierung geht es nicht darum ob Alphabetisch oder nicht, sondern dafür zu sorgen das Icon an der richtigen Position zu bringen und das tut sie ja anhand des übergebenen Identifizierungsstring. Funktioniert "1a" wenn denn die richtige Column geklickt wurde. |
AW: array of record sortieren
Zitat:
|
AW: array of record sortieren
Zitat:
Die Sortierung ist aber Column(Spalten) abhängig. :) |
AW: array of record sortieren
Versuchte schon mehrmals vergeblich rauszufinden was Du willst.
Ich habe den Eindruck Du willst nicht ein "array of record sortieren" sondern Einträge in einem Litview. Ich bin dann raus. |
AW: array of record sortieren
Zitat:
Das array of record soll so sortiert werden das der Index des records passend ist zu dem der über
Delphi-Quellcode:
ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert
sortiert wurde. Ich habe jetzt mal versucht die Bilder fest an das ListView zu binden über eine Imageliste!
Delphi-Quellcode:
// Imageliste initialisieren
if hLarge = 0 then begin hLarge := ImageList_Create(round(bw), round(bh), ILC_COLOR32, 1, 1); // 32 Bit Bitmap konvertiert zu Icon ListView_SetImageList(Handle, hLarge, LVSIL_NORMAL); end; // Icon zur Liste addieren ImageList_AddIcon(hLarge, hIconItem); SetLength(ItemsInfo, nItem + 1); ItemsInfo[nItem].Item := nItem; ItemsInfo[nItem].SubItem := nSubItem; ItemsInfo[nItem].Width := round(bw); ItemsInfo[nItem].Height := round(bh); ItemsInfo[nItem].ImgIcon := hIconItem; ItemsInfo[nItem].IdentStr := ImgIdent; // Icon freigeben // wird nicht mehr verwendet da in der ImageList enthalten DestroyIcon(hIconItem);
Delphi-Quellcode:
aber nein. Die Bitmaps werden nicht an der korrekten Position gezeichnet bleiben einfach da wo sie sind nach dem sortieren.
if assigned(ItemsInfo) then
begin if (HeaderItem = ItemsInfo[Item].SubItem) and (ItemsInfo[Item].ImgIcon <> 0) then begin GetWindowRect(HeaderHandle, HeaderWindowRect); TmpRect := ClientRect; TmpRect.Left := ClientRect.Left + ItemsInfo[Item].Width; TmpRect.Top := ClientRect.Top + ((ItemHeight - FPointSize) div 2); HeaderItemRect.Left := (HeaderWindowRect.Left - LvWindowRect.Left) + (ClientRect.Left + HeaderItemRect.Left); if ImageList_Draw(hLarge, Item, hTempDC, HeaderItemRect.Left, (ClientRect.Top + 4), ILD_TRANSPARENT) then //DrawIconEx(hTempDC, HeaderItemRect.Left, (ClientRect.Top + 4), // ItemsInfo[Item].ImgIcon, ItemsInfo[Item].Width, // ItemsInfo[Item].Height, 0, 0, DI_NORMAL); DrawItem(WinHandle, hTempDC, Item, HeaderItem, TmpRect, ItemText, nSelected); end else //.. Warum? Das Problem ist hier das gleiche. Ich addiere Icons in der Reihenfolge. Die Reihenfolge richtet sich aber nicht nach dem Index der Zeile sondern wird hintereinander in die ImageListe addiert und schon habe ich wieder das Problem das der Index nicht passend zur Zeile ist. Bsp. ListRows 1,2,3,4,5 (3 Zeile hat kein Bild) ImageListe addiert 1,2,3,4 (3 Ist ja leer) also -1 Bild wenn ich nun zeichne werden die Rows mit Bildern belegt von 1 > 4 die 3 sollte eigentlich leer sein und die 5 Belegt. Wie will man das prüfen. grrr.... |
AW: array of record sortieren
Ok. Habe eine vorläufig Lösung.
Ich übergebe ja in SetItemIcon das SubItem wo ich die Bilder zeichne.
Delphi-Quellcode:
ItemsInfo[nItem].SubItem := nSubItem;
Das verwende ich nun für SortItems das.
Delphi-Quellcode:
zu
for i := 0 to ItemCount - 1 do
begin ZeroMemory(@buf, sizeof(buf)); ListView_GetItemText(hListView, i, 1, buf, sizeof(buf)); ItemText := buf; StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen. end;
Delphi-Quellcode:
gut ist
for i := 0 to ItemCount - 1 do
begin ZeroMemory(@buf, sizeof(buf)); ListView_GetItemText(hListView, i, ItemsInfo[i].SubItem, buf, sizeof(buf)); ItemText := buf; StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen. end; |
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 11:38 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