Hier habe ich eine schwierige Situation, denke ich. Ich muss in der Lage sein, ein Objekt zu befreien, das ein Feld einer Aufzeichnung ist. Ich würde normalerweise den Bereinigungscode im Destruktor schreiben, wenn es eine Klasse wäre. Aber da Datensatztypen keinen "Destruktor" einführen können, wie wäre es möglich, TObject (Field) .Free;?Wie man ein Objekt, das in einem Datensatz ist, freigibt?
Es werden zwei Arten von Nutzungs sein Ich sage voraus:
den Datensatz durch einen neuen zu ersetzen.
Ich denke, diese Verwendung wäre einfach zu implementieren. Da Datensätze Werttypen sind und daher bei der Zuweisung kopiert werden, kann ich den Zuweisungsoperator überlasten und die Objekte freigeben, die dem alten Datensatz gehören.
(Edit: Zuordnung Überlastung war nicht in der Lage Das ist eine neue Infos zu mir ...)
Verlassen des Umfangs, wo Record-Variable definiert.
Ich kann an eine private Methode denken, die die Objekte freigibt, und diese Methode könnte bei der Bereichsanregung manuell aufgerufen werden. ABER, hier ist die gleiche Frage: Wie man es mehr macht recordly? Dieses Verhalten Art fühlt sich wie eine Klasse ...
Hier ist ein Beispiel (und offensichtlich nicht die beabsichtigte Verwendung):
TProperties = record
... some other spesific typed fields: Integers, pointers etc..
FBaseData: Pointer;
FAdditionalData: TList<Pointer>;
//FAdditionalData: array of Pointer; this was the first intended definition
end;
Angenommen,
FAdditionalData:=TList<Pointer>.Crete;
genannt im Datensatzkonstruktor oder manuell im Datensatzvariablenbereich, indem auf das Feld öffentlich zugegriffen wird wie
procedure TFormX.ButtonXClick(Sender: TObject);
var
rec: TProperties;
begin
//rec:=TProperties.Create(with some parameters);
rec.FAdditionalData:=TList<Pointer>.Create;
//do some work with rec
end;
Nach dem Button Umfang der rec ist nicht mehr, aber ein TList noch hält seine Existenz verlässt, die Speicherlecks verursacht ...
Datensatzzuordnung kann nicht überladen werden. – kludg
Ich war mir dessen nicht bewusst (nie zuvor gebraucht), aber ich habe es jetzt gelernt :) Ja, es konnte nicht überlastet werden ... –