AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Array Zeile löschen

Ein Thema von VkPenguin · begonnen am 2. Mär 2012 · letzter Beitrag vom 7. Mär 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.409 Beiträge
 
Delphi 12 Athens
 
#1

AW: Array Zeile löschen

  Alt 7. Mär 2012, 15:28
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#2

AW: Array Zeile löschen

  Alt 7. Mär 2012, 17:16
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.409 Beiträge
 
Delphi 12 Athens
 
#3

AW: Array Zeile löschen

  Alt 7. Mär 2012, 18:30
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Mär 2012 um 18:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.663 Beiträge
 
Delphi 12 Athens
 
#4

AW: Array Zeile löschen

  Alt 7. Mär 2012, 18:45
Oder man macht Klassen draus und... hatten wir das nicht schon?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#5

AW: Array Zeile löschen

  Alt 7. Mär 2012, 20:01
Zitat von DeddyH:
Oder man macht Klassen draus und... hatten wir das nicht schon?
Es ging mir ja nur darum, dass es bei der von mir vorgeschlagenen Variante möglich ist, einzelne Werte des Records direkt zu ändern. Das New und Dispose brauche ich doch nur beim Hinzufügen (Add) oder Entfernen (Delete) von Items bzw. vor dem Freigeben (Free) der Liste, nicht jedoch beim Sortieren der Liste.

Ich glaube, im Endeffekt hat jede mögliche/hier genannte Lösung ihre Vor- und Nachteile. Jetzt muss man sich nur noch das rauspicken, was einem am meisten zusagt

Lg
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#6

AW: Array Zeile löschen

  Alt 7. Mär 2012, 21:09
... erst einmal vielen lieben Dank für eure Hilfe und Freundlichkeit - zuerst hab ich zwar nicht ganz verstanden, wovon ihr eigentlich redet, ich konnte mich aber dann gut anhand der Codebeispiele einfinden, danke noch einmal für die Mühe an dieser Stelle. Ich mach mich dann mal an den Umbau Melde mich, wenn es größere Probleme gibt oder wenn es geklappt hat.

*Edit* Funktioniert soweit wie ich gekommen bin gut; eine Frage hätte ich aber - wenn ich zwei Einheiten der Liste vergleichen will, also zwei gleichzeitig brauche, muss ich dann auch zwei temporäre "Gegner"-Variablen haben?
*Edit2* Hm, bekomme folgende Fehlermeldung:

---------------------------
Anwendungsfehler
---------------------------
Exception EArgumentOutOfRangeException in Modul SpaceInvaders042.exe bei 000B6205.

Argument out of range.
---------------------------
OK
---------------------------

Ich denke mal, dass bedeutet, dass die Liste nur sagen wir mal drei Einträge hat und ich nach dem vierten Frage..? Wir die Liste mit dem ".add"-Befehl nicht automatisch um eins erweitert? Das hatte ich so verstanden..
*Edit3* wenn ich es so "For I:=1 To Schussanzahl-1 Do" mache, geht es scheinbar. Fängt die Liste also schon bei 0 an zu zählen? Aber warum funktioniert dann der erste Schuss nicht?
*Edit4*...erst Denken.. mit For I:=0 To [...] geht es wunderbar. Werde mich am Wochenende weiter damit beschäftigen und (voraussichtlich) Rückmeldung geben. Danke nocheinmal!

Geändert von VkPenguin ( 7. Mär 2012 um 22:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.409 Beiträge
 
Delphi 12 Athens
 
#7

AW: Array Zeile löschen

  Alt 7. Mär 2012, 22:39
Das Freigeben macht eine TObjectList von selber, wenn man es ihr sagt.

Delphi-Quellcode:
type
  TSimpleObjectList<T: class> = class(TList<T>)
  protected
    procedure Notify(const Value: T; Action: TCollectionNotification); override;
  public
    function Add: T; overload;
    function Insert(Index: Integer): T; overload;
  end;

function TSimpleObjectList<T>.Add: T;
begin
  Result := T.Create;
  inherited Add(Result);
end;

function TSimpleObjectList<T>.Insert(Index: Integer): T;
begin
  if (Index < 0) or (Index > Count) then
    Items[Index];
  Result := T.Create;
  inherited Insert(Index, Result);
end;

procedure TSimpleObjectList<T>.Notify(const Value: T; Action: TCollectionNotification);
begin
  try
    inherited;
  finally
    if Action = cnRemoved then
      Value.Free;
  end;
end;
Nunja, eine kleine Erweiterung und schon läßt sich auch mit einer TObjectList<T> angenehm arbeiten.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 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