![]() |
AW: Array Zeile löschen
Da Ganze ist ein Dilemma. Mit Array zu arbeiten ist für Anfänger einfacher, da man die Vorgänge logisch nachvollziehen kann. Oft wollte man am Anfang auch nur eine Kleinigkeit und plötzlich hat meine ein mächtiges Array-Record an der Backe. Die Verwaltung ist aber dann etwas komplexer. Eine Klasse ist von der Arbeit am Anfang ähnlich, bringt später unheimlich Vorteile, für einen Anfänger evtl. noch schwer nachvollziehbar.
|
AW: Array Zeile löschen
Zitat:
|
AW: Array Zeile löschen
Zitat:
Delphi-Quellcode:
Die Klasse muss man auch wieder sauber freigeben. Habe mal im Netz ein Beispiel (als Empfehlung) gefunden, mit einem wunderschönen Speicherleck. Leider weiss ich nicht mehr wo.
begin
... TGegnerRecord(Gegnerliste[i]^).Name:='Neuer Gegner'; TGegnerRecord(Gegnerliste[i]^).PosX:=10; ... end; |
AW: Array Zeile löschen
Hallo,
habe leider bisher keine Zeit gefunden, alle Beiträge zu lesen und zu überdenken; nur kurz als Antwort: Meine Version ist Delphi 2009, entschuldigt, wusste nicht, dass das wichtig ist |
AW: Array Zeile löschen
Hast du schonmal mit den Generics gearbeitet?
GegnerListe[0] liefert dort den Record, genauer eine Kopie des Records und keinen Zeiger.
Delphi-Quellcode:
Vorteil ist zwar, daß hier delphi die komplette Speicherverwaltung übernimmt, innerhalb der Liste und auch für die Einzelrecords.
type
TGegnerRecord = record Name:AnsiString; PosX:Integer; PosY:Integer; {...} end; var Gegner: TGegnerRecord; GegnerListe: TList<TGegnerRecord>; GegnerListe := TList<TGegnerRecord>.Create; Gegner.Name := 'ich'; Gegner.PosX := 123; ... GegnerListe.Add(Gegner); Label1.Caption := GegnerListe[0].Name: GegnerListe[0].PosX := 456; // geht nicht, auch wenn der Compiler, in älteren Delphi-Versionen, keine Warnung/Fehlermeldung anzeigt GegnerListe.Free; |
AW: Array Zeile löschen
das Ändern ist aber nicht wirklich problematisch
Delphi-Quellcode:
benötigt generics.collections in den uses.
var
i: Integer; begin GegnerListe := TList<TGegnerRecord>.Create; for i := 1 to 100 do begin Gegner.Name := 'ich' + IntToStr(i); Gegner.PosX := i; GegnerListe.Add(Gegner); end; Gegner := GegnerListe[10]; Gegner.PosX := 999; Gegner.Name := 'geändert'; GegnerListe[10] := Gegner; Showmessage(GegnerListe[10].Name + '-' + IntToStr(GegnerListe[10].PosX)); GegnerListe.Free; end; |
AW: Array Zeile löschen
Jupp, wenn man den Record vorher rausnimmt/rauskopiert und dann quasi "komplett" ersetzt.
Nur eben Einzeiler, zum Ändern eines klitzekleinen Wertes, sind standardmäßig nicht möglich. |
AW: Array Zeile löschen
Bei Generics muss ich leider aus Kompatibilitätsgründen passen.
Bei der von mir vorgeschlagenen Variante kann man jedoch, wie schon oben geschrieben, einzelne Werte ohne Probleme direkt ändern:
Delphi-Quellcode:
Oder spricht etwas dagegen?
procedure TForm1.Button3Click(Sender: TObject);
begin TGegnerRecord(Gegnerliste[0]^).Name:='Neuer Gegner'; TGegnerRecord(GegnerListe[0]^).PosX:=100; end; |
AW: Array Zeile löschen
Nein, das geht bei der generischen TList<T> nicht, welche direkt die Records enthält.
Wenn man eine TList mit Zeigern auf "Gegner"-Records oder mit einem Gegner-Objekten befüllt hat, dann geht es, so wie du sagst. Nur daß man andersrum wohl noch besser erkennt, warum es dort geht.
Delphi-Quellcode:
Nur muß man hier eben überall selber noch das New und Dispose aufrufen.
procedure TForm1.Button3Click(Sender: TObject);
begin PGegnerRecord(Gegnerliste[0])^.Name:='Neuer Gegner'; PGegnerRecord(GegnerListe[0])^.PosX:=100; end; |
AW: Array Zeile löschen
Oder man macht Klassen draus und... hatten wir das nicht schon? :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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