Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Array aus Record löschen (https://www.delphipraxis.net/192825-array-aus-record-loeschen.html)

EWeiss 22. Mai 2017 17:38


Array aus Record löschen
 
Löschen des Array

Delphi-Quellcode:
    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;
packe ich das ganze jetzt in eine procedure macht das Teil Ärger ;)
Manchmal hat man echt ein Brett vorm Kopf.

Delphi-Quellcode:
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;
Aufruf

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

Olli73 22. Mai 2017 17:52

AW: Array aus Record löschen
 
Zitat:

Zitat von EWeiss (Beitrag 1372389)
Delphi-Quellcode:
procedure Delete(var SrcArray: Array of TSprite; Index: Integer);
var
  I: Integer
begin
  ...
  Setlength(SrcArray, length(SrcArray) - 1); //<< inkompatible Typen
end;

Das hatten wir heute schon mal: Siehe hier

Lösung: TArray<TSprite>

EWeiss 22. Mai 2017 17:57

AW: Array aus Record löschen
 
Zitat:

Zitat von Olli73 (Beitrag 1372396)
Zitat:

Zitat von EWeiss (Beitrag 1372389)
Delphi-Quellcode:
procedure Delete(var SrcArray: Array of TSprite; Index: Integer);
var
  I: Integer
begin
  ...
  Setlength(SrcArray, length(SrcArray) - 1); //<< inkompatible Typen
end;

Das hatten wir heute schon mal: Siehe hier

Lösung: TArray<TSprite>

Würde eventuell gehen. Danke.
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:
gs: Array of TSprite;
zu
Delphi-Quellcode:
  gs: TArray<TSprite>;
ändere.

gruss

himitsu 22. Mai 2017 18:06

AW: Array aus Record löschen
 
Das Warum wurde da auch erklärt ... Stichwort "Open Array" vs. "dynamisches Array".
http://www.delphipraxis.net/192817-s...parameter.html

Olli73 22. Mai 2017 18:06

AW: Array aus Record löschen
 
Var ist schon in Ordnung.

EWeiss 22. Mai 2017 18:07

AW: Array aus Record löschen
 
Zitat:

Zitat von himitsu (Beitrag 1372402)

Hat das irgendwelche Auswirkungen ? Bitte siehe mein EDIT.
Wird das Teil langsamer oder zu irgendwelchen Einstellungen inkompatibel?

Zitat:

Var ist schon in Ordnung.
Ja danke Olli
Es geht mir um mein EDIT: im vorherigen Beitrag..

gruss

himitsu 22. Mai 2017 18:08

AW: Array aus Record löschen
 
Ich hab auch ein EDIT im Post. :angle:

EWeiss 22. Mai 2017 18:10

AW: Array aus Record löschen
 
Zitat:

Zitat von himitsu (Beitrag 1372405)
Ich hab auch ein EDIT im Post. :angle:

Ja habe schon verstanden es ist dann ein "Open Array" :)
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

himitsu 22. Mai 2017 18:12

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".

EWeiss 22. Mai 2017 18:14

AW: Array aus Record löschen
 
Zitat:

Zitat von himitsu (Beitrag 1372407)
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".

OK Danke.. Das reicht mir wenn ich sonst nichts tun muss ;)
Danke für eure Hilfe.

gruss

EWeiss 22. Mai 2017 18:16

AW: Array aus Record löschen
 
Kleine Anschluss frage

Delphi-Quellcode:
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;
Ist das schnell genug oder sollte ich hier das Array mit Move verschieben ?

gruss

himitsu 22. Mai 2017 18:18

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.

EWeiss 22. Mai 2017 18:19

AW: Array aus Record löschen
 
Zitat:

Zitat von himitsu (Beitrag 1372410)
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 .

D2010.. Ja muss das in mein Profil wieder addieren.
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:
  // 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;
gruss

SneakyBagels 22. Mai 2017 18:34

AW: Array aus Record löschen
 
Zitat:

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 .
Darf man fragen wo man das findet?

EWeiss 22. Mai 2017 18:37

AW: Array aus Record löschen
 
Zitat:

Zitat von SneakyBagels (Beitrag 1372416)
Zitat:

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 .
Darf man fragen wo man das findet?

Ich denke mal wenn du die uses Generics hinzufügst.

gruss

SneakyBagels 22. Mai 2017 18:38

AW: Array aus Record löschen
 
Leider nicht fündig geworden. Ich finde nur Sort aber weder Delete noch Insert.

EWeiss 22. Mai 2017 18:40

AW: Array aus Record löschen
 
Zitat:

Zitat von SneakyBagels (Beitrag 1372418)
Leider nicht fündig geworden. Ich finde nur Sort aber weder Delete noch Insert.

Ist wohl abhängig von der Delphi Version die du verwendest.

gruss

himitsu 22. Mai 2017 18:55

AW: Array aus Record löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anhang 47409
Alt und "Neu".

Delphi-Quellcode:
B := Copy(A)
oder
Delphi-Quellcode:
B := Copy(A, 1, 3)
geht ja auch schon längere Zeit ... nur Delete und Insert fehlte halt.



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];

SneakyBagels 22. Mai 2017 19:01

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:

EWeiss 22. Mai 2017 19:20

AW: Array aus Record löschen
 
Zitat:

Zitat von SneakyBagels (Beitrag 1372425)
Delete, Insert, Copy für dynamische Arrays. Vereinfacht mein Leben bestimmt sehr in Zukunft. Danke für den Tipp :thumb:

Bestimmt..
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

himitsu 22. Mai 2017 19:25

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.

EWeiss 22. Mai 2017 19:27

AW: Array aus Record löschen
 
Zitat:

Zitat von himitsu (Beitrag 1372430)
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 fetige/schlanke Implementation für "binäre" Suchen in sortierten Arrays, welche auch überall in der RTL, VCL, und den RTTI-Klassen Verwendung findet.

Ahh.. OK wusste ich gar nicht.
: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

himitsu 22. Mai 2017 19:47

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:
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);
oder
Delphi-Quellcode:
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);
bzw.
Delphi-Quellcode:
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);
Falls ich jetzt nichts falsch gemacht hab, dann entspricht das einem
Delphi-Quellcode:
Delete(A, 3, 1);
, btw. einem
Delphi-Quellcode:
TArrayHelper.Delete<TAaa>(A, 3, 1);
, was ich mir im Jahre 2009 gebaut hatte.

EWeiss 22. Mai 2017 19:54

AW: Array aus Record löschen
 
Zitat:

aber wenn die mir nun meinen Code "klauen",
Eine Bodenlose Frechheit oder?

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