Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wie verwendet man "Unterklassen" am besten? (https://www.delphipraxis.net/154937-wie-verwendet-man-unterklassen-am-besten.html)

Chemiker 1. Okt 2010 21:39

AW: Wie verwendet man "Unterklassen" am besten?
 
Hallo Hansa,

die Records musst Du doch auch erstellen.

Bis bald Chemiker

Hansa 1. Okt 2010 22:14

AW: Wie verwendet man "Unterklassen" am besten?
 
Inwiefern muss ich die wo erstellen ? :shock: Oder gibts jetzt sogar so was wie Rec1.Create () ? Ich sage doch auch nicht Int1.Create oder Real2.Free.

implementation 1. Okt 2010 22:27

AW: Wie verwendet man "Unterklassen" am besten?
 
Delphi-Quellcode:
var
  rec: ^Recordtyp;
begin
  New(rec);
  ...
  rec^.Feld := ...;
  // evtl. geht auch: (zumindest beim FPC)
  rec.Feld := ...;
  ...
  Dispose(rec);
end;
Natürlich nur bei Zeigern nötig :wink:

xZise 1. Okt 2010 22:56

AW: Wie verwendet man "Unterklassen" am besten?
 
Zitat:

Zitat von Hansa (Beitrag 1053227)
Zitat:

Zitat von xZise (Beitrag 1053207)
Moin,
Aber nur dann auf true stelle, wenn danach die Elemente noch bestehen sollen.

Nein, nein, dann muss es auf false stehen. OwnsObjects = true heisst : Beim Freigeben der Liste wird alles enthaltene aufgeräumt/entfernt. Du schreibst das ja selber im nächsten Satz. :mrgreen: [...]

Öhr ja mist ... du hast recht da fehlt irgendwo eine Verneinung.

Und warum habe ich das mit Klassen gemacht? Ich frage mich nämlich wie du neue Einträge in die ObjectList bekommen willst:
Delphi-Quellcode:
var
  datei : TArtGrundDaten;
  list : TObjectList;

list := TObjectList.Create();
datei.name := 'foobar';
list.add(datei);
datei.name := 'Hallo Welt';
list.add(datei);
Das heißt irgendwo muss du Datei reinitialisieren. Das macht man i.d.R. mithilfe von new oder einer Methode (also wie bei bei der Methode Rect()). Ersteres hat den Nachteil: TObjectList wird das Objekt vermutlich nicht freigeben (korrigiert mich, wenn das nicht stimmt). Bei zweiteren, hast du ja ausgeführt, dass das ja eigentlich eine Methode der Datei ist, dann kann man das auch gleich zum Objekt machen.

UND inzwischen geht ja auch das:
Delphi-Quellcode:
type
  TFoo = record
    x : integer;
    function getXsqr() : Integer;
  end;
Und dann hatte ich auch erwähnt, dass man TFile von TMetaData erben lassen kann. Das geht bei records nicht.
Delphi-Quellcode:
type
  TMetaData = class;
  TFile = class(TMetaData)
    Data : TStream;
  end;
MfG
Fabian

samso 2. Okt 2010 09:45

AW: Wie verwendet man "Unterklassen" am besten?
 
Um das Typecasting komplett zu vermeiden, kann man generische Listen verwenden, aber die gibt es bei Delphi 7 nicht.
Ich benutze sowohl Records als auch Klassen. Die Entscheidung welches Konstrukt ich verwende, hängt vom Anwendungsfall ab. Dabei berücksichtige ich die Vorteile die die Strukturen jeweils bieten:
Vorteile Records:
  • 4 Byte weniger Speicherbedarf pro Instanz
  • Einzelne Instanzen können auf dem Stack angelegt werden (schneller)
  • Automatisch angelegte Instanzen werden auch automatisch freigegeben
Vorteile Klassen:
  • Vererbung möglich
  • Typeinformation zur Laufzeit vorhanden
Wenn ich also sehr viele Instanzen anlegen möchte (Hausnummer: mehr als 10000) und keine Vererbung benötige, dann benutze ich gerne auch Records. Um eine Liste von Records zu verwalten, verwende ich meist ein offenes Array, weil ich mich dann nicht um die Freigabe zu kümmern brauche. Dafür habe ich einen höheren Aufwand beim Hinzufügen der Instanzen. Aber man kann natürlich auch TList benutzen.
Zurück zur Ausgangsfrage: Um das Typcasting einzuschränken, würde ich bei TMyFile die Get-Funktion ändern. Etwa so:
Delphi-Quellcode:
   
type TMyFiles = class
  private
    FList: TList;
  public
  property Items[Index: Integer]: pFileRec read Get write Put; default;
end;
Das Typecasting ist dann nur einmal in "Get" bzw. "Put" notwendig. Der Zugriff sieht dann so aus:

Delphi-Quellcode:
var
  allFileList: TMyFiles;
...
if allFileList[i].ext='PAS' then
Der Klasse TMyFiles ist es jetzt egal, ob sie "Besitzer" der Records ist, oder ob sie nur Verweise auf die Records verwaltet. Beim Freigeben muss man natürlich unterscheiden, ober man nur die Verweise freigeben will, oder auch die Records. Das kann man dann so machen, wie TObjectlist (ein Boolean zeigt an, was freigeben werden soll) oder man kümmert sich in jedem Einzelfall selbst darum.
N.B. Die Add Funktion muss natürlich auch noch entsprechend geändert werden (statt TFileRec nun pFileRec), oder man erfindet eine neue Funktion AdRef(file: pFileRec) oder wie auch immer...

alzaimar 2. Okt 2010 12:00

AW: Wie verwendet man "Unterklassen" am besten?
 
Wieso verwendet man nicht:
Delphi-Quellcode:
MyFileList : Array Of TFileinfoRecord;
Typensicher, kein TypeCasting, kein Create, kein Free.

xZise 2. Okt 2010 14:52

AW: Wie verwendet man "Unterklassen" am besten?
 
Aber gerade das befüllen ist ziemlich langsam.

MfG
Fabian


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 Uhr.
Seite 2 von 2     12   

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