Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Array Zeile löschen (https://www.delphipraxis.net/166862-array-zeile-loeschen.html)

Popov 6. Mär 2012 09:20

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.

DeddyH 6. Mär 2012 09:27

AW: Array Zeile löschen
 
Zitat:

Zitat von Popov (Beitrag 1154707)
Mit Array zu arbeiten ist für Anfänger einfacher, da man die Vorgänge logisch nachvollziehen kann.

Bei dynamischen Arrays würde ich das aber nicht unterschreiben, da spielen Listen IMO alle Trümpfe aus (Add, Delete etc. gegenüber SetLength, Move usw.).

Breager 6. Mär 2012 19:09

AW: Array Zeile löschen
 
Zitat:

Zitat von himitsu
Das Ändern einzelner Werte eines Records ist nicht (sehr unpraktsich) änderbar.

Was spricht gegen folgendes?
Delphi-Quellcode:
begin
...
TGegnerRecord(Gegnerliste[i]^).Name:='Neuer Gegner';
TGegnerRecord(Gegnerliste[i]^).PosX:=10;
...
end;
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.

VkPenguin 7. Mär 2012 14:28

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

himitsu 7. Mär 2012 15:11

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:
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;
Vorteil ist zwar, daß hier delphi die komplette Speicherverwaltung übernimmt, innerhalb der Liste und auch für die Einzelrecords.

Bummi 7. Mär 2012 15:19

AW: Array Zeile löschen
 
das Ändern ist aber nicht wirklich problematisch
Delphi-Quellcode:
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;
benötigt generics.collections in den uses.

himitsu 7. Mär 2012 15:28

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.

Breager 7. Mär 2012 17:16

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:
procedure TForm1.Button3Click(Sender: TObject);
begin
 TGegnerRecord(Gegnerliste[0]^).Name:='Neuer Gegner';
 TGegnerRecord(GegnerListe[0]^).PosX:=100;
end;
Oder spricht etwas dagegen?

himitsu 7. Mär 2012 18:30

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:
procedure TForm1.Button3Click(Sender: TObject);
begin
  PGegnerRecord(Gegnerliste[0])^.Name:='Neuer Gegner';
  PGegnerRecord(GegnerListe[0])^.PosX:=100;
end;
Nur muß man hier eben überall selber noch das New und Dispose aufrufen.

DeddyH 7. Mär 2012 18:45

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 04:45 Uhr.
Seite 2 von 3     12 3      

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