Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 20:54
Moin Stift,

probiers's doch mal so:
(Ich hoffe, die Kommentare helfen Dir weiter)

Delphi-Quellcode:
type
  // Wenn man von TObject ableitet ist es zwar nicht erforderlich das direkt mit anzugeben,
  // ich empfinde es aber als angenehmer die Basisklasse immer explizit anzugeben
  // TTest, da ein neuer Typ immer mit grossem T anfangen sollte
  TTest = class(TObject)

  // Interne Felder als private deklarieren, da sie nicht ausserhalb der Unit in der die
  // Klasse deklariert wurde sichtbar sein sollten (eben intern)
  // Diese sollten immer mit einem grossen F beginnen
  private
    FAll : TStringList;
    FMale : TStringList;
    FFemale : TStringList;

  // Was von aussen zugänglich sein soll, mit der Sichtbarkeit public versehen, damit
  // sie überall zugänglich sind, wo die Klasse instanziert wird.
  public

    // Der Konstruktor sollte auch immer so benannt werden, auch wenn es sich
    // eigentlich um eine Funktion handelt.
    constructor Create;

    // Da im Konstruktor Resourcen belegt werden müssen diese auch wieder freigegeben werden,
    // deshalb wird ein Destruktor benötigt
    destructor Destroy; override;

    // Die internen Felder nur als Eigenschaften zugänglich machen
    // Wenn es sich um Objekte handelt, die von der Klasse selber verwaltet werden, wie in
    // diesem Falle sollte man keinesfalls Schreibzugriff ermöglichen, deshalb kein write.
    property All : TStringList read FAll;
    property Male : TStringList read FMale;
    property Female : TStringList read FFemale;
  end;

  implementation

  constructor TTest.Create;
  begin
    // inherited ist bei der Ableitung von TObject zwar nicht notwendig, würde ich aber
    // sicherheitshalber auch hier mit angeben, falls der Constructor von TObject mal
    // mit Inhalt gefüllt wird.
    inherited;
    FAll := TStringList.Create;
    FMale := TStringList.Create;
    FFemale := TStringList.Create;
  end;

  destructor TTest.Destroy;
  begin
    // Auf das ansonsten meist zu empfehlende FreeAndNil kann man hier verzichten, da
    // die internen Felder nach Abarbeitung des Destruktors in keinem Falle mehr
    // angesprochen werden.
    FAll.Free;
    FMale.Free;
    FFemale.Free;
    // Für das inherited bei Destruktor gilt hier das gleiche wie beim Konstruktor
    inherited;
  end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat