AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wie verwendet man "Unterklassen" am besten?

Ein Thema von p80286 · begonnen am 1. Okt 2010 · letzter Beitrag vom 2. Okt 2010
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 15:00
Hallo zusammen,

ich habe bisher eine mit einer Tlist einige Dateiinformationen verwaltet
Delphi-Quellcode:
type
  tFileRec=record
             name : string;
             ext : string;
             path : string;
             size : cardinal;
             lastrd : tdatetime;
             lastwr : tdatetime;
           end;
  pFileRec = ^tFilerec;
Um mir das ewige Typecasting zu erparen hab ich daraus eine Klasse(TMyFiles) gemacht, wobei
.Add und .Items[i] jeweils tFileRec erwartet bzw. liefert, aber FileList[i] gibt einen Pointer zurück.

Wenn ich bisher z.B. mit allen .PAS Dateien etwas machen wollte ging das so ganz gut:
Delphi-Quellcode:
pasFileList:=TList.Create;
if tFileRec(allFileList[i]^).ext='PASthen
     pasFileList.add(allFileList[i])
....
 { machwas }
  tFileRec(pasFileList[i]^).Name.....
 { machwas Ende} 
 pasFileList.Free;
    {
Danach waren noch alle (Datei)Daten in der allFileList vorhanden, und ich konnte ohne erneutes Einlesen z.B. alle XLS-Dateien verarbeiten.

Kann ich das auch mit TMyFiles erreichen ohne die Krücke Typecasting und Tlist zu nutzen?
Bräuchte ich ggf. zwei Free-Methoden?
eine um die Nutzdaten (records) frei zu geben und eine um die Pointer in den Orcus zu schicken?

Könntet Ihr mir hier auf die Sprünge helfen?
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 15:19
Wird ein Record nicht automatisch freigegeben? Natürlich nicht, wenn du einen Pointer da was mit New zugewiesen hast.

Und ich verstehe dein aktuelles Problem nicht so ganz: Du hast ein TMyFiles was intern eine TList speichert, und du greifst munter mit add und so drauf zu? Dann kannst du doch alles so lassen oder nicht?

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 15:40
Aus dem Record eine Klasse machen und statt einem Array oder TList die Klasse TObjectList verwenden.
Delphi-Quellcode:
tFileObj=class(TPersistent)
public
  name : string;
  ext : string;
  path : string;
  size : cardinal;
  lastrd : tdatetime;
  lastwr : tdatetime;
  function Filename:string; // liefert name + ext
  function FullFilename:string; // liefert path + Filename
  procedure LoadFromSearchRec(const sr:TSearchRec); // kopiert Werte aus sr auf name,exe,size,...
  procedure Assign(Source: TPersistent);override; // sollte man implementieren
end;
Leider gibt es viele Delphi-Programierer die den Schritt vom Record zur Klasse nicht vollziehen.
Ich vermute, dass es unter anderem daran liegt, dass man Objekt explizit freigeben muss.
Wobei hier aber TObjectList zur Hilfe kommt und die Sache angenehmer macht.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 16:55
Das mit der TObjectlist muß ich mir mal anschauen.

Trotzdem hab ich da immer noch ein Verständnisproblem.
Ich habe eine Klasse die Verwaltungsdaten und die eigentlichen Daten enthält,
und eine zweite Klasse, die nur die Verwaltungsdaten enthält (enthalten soll). So etwas ähnliches wie ein View oder ein Filter. Nach aussen hin sollen sich beide gleich verhalten, wobei die zweite Klasse die erste zwangsläufig vorraussetzt. wenn ich die zweite Klasse "in den Orcus jage" muß die erste allerdings vollständig erhalten bleiben.
Tut mir leid, das ich es nicht besser beschreiben kann . Mir fehlt das richtige Vokabular.

Gruß
K-H

PPs
Ich schlepp noch ein paar Felder mehr mit mir herum, und da stecken noch einige Methoden in der Klasse.

P.S.
Ich vermute, dass es unter anderem daran liegt, dass man Objekt explizit freigeben muss.
sobald ich New(pMyRec) verwende, muß ich im Gegenzug Dispose verwenden, das ist nicht das Problem. Für mich ist es eher, warum ein TObject verwenden wenn ein Record bzw. eine Pointer/Record Kombination alles bietet was ich brauche. Glaub ich jedenfalls.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 1. Okt 2010 um 16:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 17:01
Du willst doch das TypeCast loswerden ... oder irre ich mich da?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 17:08
Du willst doch das TypeCast loswerden ... oder irre ich mich da?
Äh, ja! warum?

K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 17:37
Du bist mit der TList vermutlich wirklich etwas zu kurz gesprungen. Wie gesagt : TobjectList und OwnsObjects sollte auf true stehen.

@Daniel : wäre gut, wenn man beim Schreiben sehen könnte, welche Delphi-Version eingesetzt wird.

So, der ganze Krempel, den man in die TObjectList packt, wird dann beim free der Liste auch komplettt weggeräumt. Das ist minimaler Aufwand. Du kannst ja sogar auch die Records komplett in die ObjectList packen. Die schluckt fast alles.

Hier mal noch, wie das ganze ungefähr aussieht :

Delphi-Quellcode:
TArtGrundDaten = record
  ID,
  nr : Integer;
  bez : string;
// stark verkürzt !!
end;

TDatenObjekt = class(TObject)
  GrundDaten : TArtGrundDaten;
end;

DatenObjektListe : TObjectList; // nimmt spezif. Daten von TDatenObjekt auf

for i := 0 to DatenObjektListe.Count - 1 do
  ArtAusgObjekt := TArtAusgObjekt (AusgObjektListe.Items[i]);
Ist das Letzte ein Typecast ? Die Nomenklatur ist da etwas ungenau. Nenne man das Konstukt, wie man will. Mir ists egal, weil es einwandfrei funktioniert ohne Nachteile.

Am Beispiel sieht man jedenfalls, wie man starre Records und Klassen kombinieren kann. Die Klassen, die den Record enthalten, werden an anderen Stellen jedenfalls noch OOP-mässig erweitert.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 1. Okt 2010, 18:42
Moin,
Du bist mit der TList vermutlich wirklich etwas zu kurz gesprungen. Wie gesagt : TobjectList und OwnsObjects sollte auf true stehen.[...]
Aber nur dann auf true stelle, wenn danach die Elemente nicht mehr bestehen sollen. Und das ist doch bei ihm nicht der Fall: Also OwnObjects auf false, dann werden die Objekte nicht automatisch freigegeben. Ansonsten werden sie beim entfernen aus der Liste (z.B. mit Delete oder Clear) freigegeben. Also auch, wenn du die Liste freigibst. Du kannst OwnObjects jederzeit via property setzen und beim TObjectList.Create. Standardmäßig steht OwnObjects auf true.

@Daniel : wäre gut, wenn man beim Schreiben sehen könnte, welche Delphi-Version eingesetzt wird. [...]
So ich habe mal ein Eintrag erstellt.

Übrigens wenn ich das richtig verstehe würde ich das so in der Art machen:
Delphi-Quellcode:
TMetaData = class(TObject)
  Name : string;
  [...]
end;

TFile = class(TObject)
  MetaData : TMetaData;
  Data : TStream; // Oder TMemoryStream
end;
Alternativ könnte man auch TFile von TMetaData erben lassen. Dürfte glaub ich besser sein.

MfG
Fabian

PS: Ich würde das letzte als Typecast ansehen. Weil was ist, wenn du irgendwas anderes reinkloppst. Deshalb würde ich entweder Generics verwenden (gibts leider nicht für D7) oder halt das Kapseln.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise ( 1. Okt 2010 um 21:58 Uhr) Grund: *korrigierter erster Satz (Dank an Hansa);
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#9

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 2. Okt 2010, 08:45
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='PASthen
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...
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

AW: Wie verwendet man "Unterklassen" am besten?

  Alt 2. Okt 2010, 11:00
Wieso verwendet man nicht:
MyFileList : Array Of TFileinfoRecord; Typensicher, kein TypeCasting, kein Create, kein Free.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 20:04 Uhr.
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