![]() |
Array aus Record löschen
Löschen des Array
Delphi-Quellcode:
packe ich das ganze jetzt in eine procedure macht das Teil Ärger ;)
if gS[K].h_Bitmap = 0 then
begin for Index := (K + 1) to (Length(gs) - 1) do gs[Index - 1] := gs[Index]; Setlength(gs, length(gs) - 1); dec(Count); if gp.RecycleBin = K then gp.RecycleBin := 0; end; Manchmal hat man echt ein Brett vorm Kopf.
Delphi-Quellcode:
Aufruf
procedure Delete(var SrcArray: Array of TSprite; Index: Integer);
var I: Integer begin for I := (Index + 1) to (Length(SrcArray) - 1) do SrcArray[I- 1] := SrcArray[I]; Setlength(SrcArray, length(SrcArray) - 1); //<< inkompatible Typen end;
Delphi-Quellcode:
Delete(gs, K);
verwende ich jetzt hier direkt gs dann funktioniert das ganze. Warum?
Delphi-Quellcode:
Setlength(gs, length(SrcArray) - 1); //<< inkompatible Typen
es ist unabhängig vom var Parameter. Auch dann geht es nicht. gruss |
AW: Array aus Record löschen
Zitat:
![]() Lösung: TArray<TSprite> |
AW: Array aus Record löschen
Zitat:
Das Problem ist nur das ich einen Var Parameter übergebe.. eventuell entfernen? Müsste eigentlich auch ohne gehen. Ich kann es im Moment nicht testen da das nur eine Vorsichtsmaßnahme ist falls das HBitmap einmal 0 sein sollte. EDIT: Ich weiß jetzt nicht welche Auswirkungen es hat wenn ich
Delphi-Quellcode:
zu
gs: Array of TSprite;
Delphi-Quellcode:
ändere.
gs: TArray<TSprite>;
gruss |
AW: Array aus Record löschen
Das Warum wurde da auch erklärt ... Stichwort "Open Array" vs. "dynamisches Array".
![]() |
AW: Array aus Record löschen
Var ist schon in Ordnung.
|
AW: Array aus Record löschen
Zitat:
Wird das Teil langsamer oder zu irgendwelchen Einstellungen inkompatibel? Zitat:
Es geht mir um mein EDIT: im vorherigen Beitrag.. gruss |
AW: Array aus Record löschen
Ich hab auch ein EDIT im Post. :angle:
|
AW: Array aus Record löschen
Zitat:
Nur welchen vor oder Nachteil bringt das für mich. Habe keinen Bock den Code deshalb jetzt komplett umschreiben zu müssen. Dann mache ich es lieber ohne Procedure. gruss |
AW: Array aus Record löschen
Es ist schneller? (das Open Array kopiert praktisch die Daten/Zeiger, die von außen rein kommen, in seine eigene Struktur rein)
Und vorallem "es funktioniert". |
AW: Array aus Record löschen
Zitat:
Danke für eure Hilfe. gruss |
AW: Array aus Record löschen
Kleine Anschluss frage
Delphi-Quellcode:
Ist das schnell genug oder sollte ich hier das Array mit Move verschieben ?
procedure Delete(var SrcArray: TArray<TSprite>; Index: Integer);
var I: Integer; begin for I := (Index + 1) to (Length(SrcArray) - 1) do SrcArray[I- 1] := SrcArray[I]; Setlength(SrcArray, length(SrcArray) - 1); end; gruss |
AW: Array aus Record löschen
Da ja keine Delphi-Verison angeeben wurde ....
Delphi kann inzwischen auch endlich Insert/Delete für dynamische Arrays (k.A. warum das so viele Jahre gedauert hat) und es hat eine nette statische Klasse TArray in System.Generics.Collections . Move ... nur wenn du weißt was du machst und dabei nicht z.B. eine Speicherverwaltung/Referenzzählung der Felder zerschrottest. |
AW: Array aus Record löschen
Zitat:
Sorry! Ok denke mal dann ist das so in Ordnung mehr als 200 Icons(Verknüpfungen liegen eh nicht auf dem Desktop) Und es ist auch nur eine Sicherheitsmaßnahme damit ich kein leeres Icon auf der Bar zu sehen bekomme.
Delphi-Quellcode:
gruss
// Prüfen ob wir einige der Verknüpfungen deaktivieren (verstecken) müssen.
for K := High(gs) downto ID_FIRST do //ID_FIRST = 6 erster Icon Eintrag im Array 0 > 6 reserviert für die Grafische Oberfläche begin if gS[K].h_Bitmap = 0 then begin Delete(gs, K); dec(Count); if gp.RecycleBin = K then gp.RecycleBin := 0; end; //Das RecycleBin-Array entsprechend ändern if gp.RecycleBin > Count then gp.RecycleBin := Count; end; |
AW: Array aus Record löschen
Zitat:
|
AW: Array aus Record löschen
Zitat:
gruss |
AW: Array aus Record löschen
Leider nicht fündig geworden. Ich finde nur Sort aber weder Delete noch Insert.
|
AW: Array aus Record löschen
Zitat:
gruss |
AW: Array aus Record löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Anhang 47409
Alt und "Neu".
Delphi-Quellcode:
oder
B := Copy(A)
Delphi-Quellcode:
geht ja auch schon längere Zeit ... nur Delete und Insert fehlte halt.
B := Copy(A, 1, 3)
Weiß nicht genau seit wann es mit DynArrays geht, aber seit XE7 kann man noch ganz andere Dinge, wie "string like"-Operationen ala
Delphi-Quellcode:
var A, B, C: array of Byte; // TArray<Byte> oder TBytes
A := B + C; A := [1, 2, 3]; A := B + [1, 2, 3]; |
AW: Array aus Record löschen
Delete, Insert, Copy für dynamische Arrays. Vereinfacht mein Leben bestimmt sehr in Zukunft. Danke für den Tipp :thumb:
|
AW: Array aus Record löschen
Zitat:
Die Frage nur ob das sinnvoll ist für einen einzigen Aufruf die Generics mit einzubinden. Das bauscht den Code wieder um einige KB auf. (Wäre in meinem Fall also unnötig) Wenn man viel mit Arrays unterwegs ist. Warum nicht! Dann wird sich das lohnen. gruss |
AW: Array aus Record löschen
Diese Funktionen verstecken sich in der System.pas und arbeiten mit der guten alten RTTI/TypeInfo, welche auch schon in SetLength/Copy verwendet wurden.
In der Generics-Unit versteckt sich nur eine fertige und halbwegs schlanke Implementation für "binäre" Suchen in sortierten Arrays, welche auch überall in der RTL, VCL und den RTTI-Klassen Verwendung findet. Das Delete/Insert macht ein "Move" für die verschobenen Items, aber beachtet dabei die Speicherverwaltung bei den gelöschten/eingefügten Items, welche sich im Berech de Verschiebung befinden, anhand der TypeInfo. |
AW: Array aus Record löschen
Zitat:
:gruebel: frage mich nur warum ich diese dann nicht bekommen habe als ich Delete eigegeben habe.. LOL. Hat sich erledigt geht mit D2010 nicht da ist die alte Version drin. Das geht nicht.
Delphi-Quellcode:
Delete(gs, K, Lenght(gs)); // string wird erwartet
gruss |
AW: Array aus Record löschen
In XE och noch nicht, da war der eine Screenshot her. (von XE3 bis X7 hat sich da schon so Einiges getan, wovon ich früher Vieles immer wieder selber gebaut hab, aber wenn die mir nun meinen Code "klauen", dann kann ich den auch direkt von da verwenden :angle: und zusätzlich ist er Code kürzer und vorallem fehlerunanfälliger)
Für das selber Kopieren kann man sich auch ein paar Funktionen aus der System-Unit mopsen. FinalizeRecord, InitializeRecord, CopyRecord, FinalizeArray, InitializeArray, CopyArray, FillChar, Move Allgemeiner Code für Arrays mit Records/Variants/Interfaces/DynArrays/Strings drin.
Delphi-Quellcode:
oder
FinalizeArray(@A[3], TypInfo(A), 1);
Move(@A[3], @A[3 + 1], (High(A) - 4) * SizeOf(A[0])); FillChar(@A[High(A)], SizeOf(A[0]), 0); SetLength(A, Length(A) - 1);
Delphi-Quellcode:
bzw.
Move(@Temp, A[3], SizeOf(A[0]));
Move(@A[3], @A[3 + 1], (High(A) - 4) * SizeOf(A[0])); Move(@A[High(A)], @Temp, SizeOf(A[0])); //FillChar(@Temp, SizeOf(A[0]), 0); wenn Temp nicht als statisches Byte-Array deklariert wäre SetLength(A, Length(A) - 1);
Delphi-Quellcode:
Falls ich jetzt nichts falsch gemacht hab, dann entspricht das einem
Temp := A[3];
Move(@A[3], @A[3 + 1], (High(A) - 4) * SizeOf(A[0])); FillChar(@A[High(A)], SizeOf(A[0]), 0); //A[High(A)] := Temp; kann man auch weglassen ... ist nur für den vergleichbaren vorherrigen Code SetLength(A, Length(A) - 1);
Delphi-Quellcode:
, btw. einem
Delete(A, 3, 1);
Delphi-Quellcode:
, was ich mir im Jahre 2009 gebaut hatte.
TArrayHelper.Delete<TAaa>(A, 3, 1);
|
AW: Array aus Record löschen
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz