Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TIntegerList nach Vorbild TStringList, richtig übernommen? (https://www.delphipraxis.net/55629-tintegerlist-nach-vorbild-tstringlist-richtig-uebernommen.html)

Nogge 24. Okt 2005 16:51


TIntegerList nach Vorbild TStringList, richtig übernommen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Community,
Ich habe mir eine TIntegerList Klasse erstellt, die nur von TObject abgeleitet ist. Ich habe wirklich nur das (aller) wichtigste in diese Klasse implementiert (für meine Zwecke halt). Könnte sich das ein gescheiter DPler mal anschauen (s. Anhang) und mir Verbesserungsvorschläge/Bugfixes mitteilen? Wäre sehr nett.
(P.S. Ich denke, Begin- und EndUpdate usw. sind nciht nötig bei der Klasse, da sie ja keine visuelle Anzeige hat. Da bräuchte ich jetzt nur ne Bestätigung für, dann löschen ich diesen Teil aus meiner Klasse)
Ich möchte diese Liste allerdings ein wiederholtes Mal verändern, indem ich ein record mit ca. 10 (anstatt 1-2) Einträgen hinzufüge. Um nun auf alle Einträge mittels property zugreifen zu können, möchte ich gern nur eine einzige property <record> deklarieren.
Beispiel:
Delphi-Quellcode:
type
  TRecord = record
    i: Integer;
    s: String;
    d: TDateTime;
  end;
[...]
property Items[Index: Integer]: TRecord read Get write Put; default;
Bisher hat diese Variante leider immer zu einem "Index out of bounds"-Fehler geführt.Delphi weigert sich Items[Index] auszulesen, selbst wenn der Index im Count-Bereich ist (mit Breakpoints getestet).

shmia 24. Okt 2005 17:12

Re: TIntegerList nach Vorbild TStringList, richtig übernomme
 
Zitat:

Zitat von Nogge
Ich habe mir eine TIntegerList Klasse erstellt, die nur von TObject abgeleitet ist. Ich habe wirklich nur das (aller) wichtigste in diese Klasse implementiert (für meine Zwecke halt). Könnte sich das ein gescheiter DPler mal anschauen (s. Anhang) und mir Verbesserungsvorschläge/Bugfixes mitteilen?

Besser wäre es, deine Klasse von TList abzuleiten und die vorgefertigten Methoden von TList
zu verwenden.
Dazu müssen einige Methoden neu geschrieben werden.
Wie das geht, kannst du in der Unit Contnrs am Beispiel von TObjectList abschauen.

Nogge 24. Okt 2005 18:49

Re: TIntegerList nach Vorbild TStringList, richtig übernomme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe deinen Rat befolgt und meine IntegerList von TList abgeleitet. Könntest du Dir diese Variante auch noch mal anschauen?
Wenn ich jetzt einen ganzen record als Ausgabewert für Items[Index] deklarieren möchte, sollte ich dann wohl stattdessen eine Klasse benutzen, richtig?

axelf98 24. Okt 2005 18:56

Re: TIntegerList nach Vorbild TStringList, richtig übernomme
 
Zitat:

Zitat von Nogge
Wenn ich jetzt einen ganzen record als Ausgabewert für Items[Index] deklarieren möchte, sollte ich dann wohl stattdessen eine Klasse benutzen, richtig?

Oder einen Pointer auf den Record:
Delphi-Quellcode:
Type TRecord = Record
  //...
end;

Type pTRecord = ^TRecord;

shmia 24. Okt 2005 19:09

Re: TIntegerList nach Vorbild TStringList, richtig übernomme
 
Zitat:

Zitat von Nogge
Ich habe deinen Rat befolgt und meine IntegerList von TList abgeleitet. Könntest du Dir diese Variante auch noch mal anschauen?

Sieht soweit ganz ok aus.
2 Dinge:
* RecordPointer: PRecord würde ich wo nötig als lokale Variable führen; nicht als Variable im Objekt
* Im Destruktor würde ich rückwärts löschen: for i:=Count-1 downto 0 do
Zitat:

Zitat von Nogge
Wenn ich jetzt einen ganzen record als Ausgabewert für Items[Index] deklarieren möchte, sollte ich dann wohl stattdessen eine Klasse benutzen, richtig?

Da kommt drauf an.
In den meisten Fällen ist es günstig, aus einem Record eine Klasse zu machen und dann in einer TObjectList zu speichern.
In ganz seltenen Fällen (z.B. Speichern von 3D-Punkten) kann ein Record Sinn machen, da der Overhead
von Objekten vermieden wird.

Nogge 24. Okt 2005 20:01

Re: TIntegerList nach Vorbild TStringList, richtig übernomme
 
Gut, vielen Dank shmia und axelf98! Ich werde jetzt versuchen, alles umzusetzen bzw. zu verbessern. Bei Fragen melde ich mich einfach noch mal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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 by Thomas Breitkreuz