![]() |
AW: Record-Variable in Klasseninstanz setzen
Zitat:
Übrigens: ein recht bekanntes Beispiel ist die Methode Free, die man auch aufrufen kann, wenn die entsprechende Instanzvariable nil ist. |
AW: Record-Variable in Klasseninstanz setzen
Zum Testen:
Delphi-Quellcode:
type
TFoo = class private FData : string; function GetData : string; public property Data : string read GetData; end; function TFoo.GetData : string; begin if Self = nil then Result := 'keine Instanz vorhanden' else Result := FData; end; procedure Test; var LFoo : TFoo; begin ShowMessage( LFoo.Data ); end; |
AW: Record-Variable in Klasseninstanz setzen
Mann ist das ein Kuddelmuddel in dem Sourcecode!
Ich versuche mal Ordnung zu schaffen. Wir beginnen mit dem Record:
Delphi-Quellcode:
und stellen die wichtigste Frage:
TTab_User = RECORD
Titel_Index : Integer; Titel_SortIndex : Integer; Titel_SortOrder : Boolean; Titel_SortText : String; END; Könnte es nicht sein, dass TTab_User nicht eine Klasse statt einen Records sein sollte? Eine Klasse ist im Prinzip ein Record + Methoden. Antwort: Ja, es gibt potentielle Methoden für die Klasse TTab_User:
Delphi-Quellcode:
Und damit sieht die Klasse im 1. Entwurf so aus:
// Filmtitel - Initialisierung von User_Tab
DatMod.User_Tab.Titel_Index := DatMod.Aset_UserTabs.FieldByName('Titel_Index').AsInteger; DatMod.User_Tab.Titel_SortIndex := DatMod.Aset_UserTabs.FieldByName('Titel_SortIndex').AsInteger; DatMod.User_Tab.Titel_SortOrder := NOT DatMod.Aset_UserTabs.FieldByName('Titel_SortOrder').AsBoolean; DatMod.User_Tab.Titel_SortText := DatMod.Aset_UserTabs.FieldByName('Titel_SortText').AsString;
Delphi-Quellcode:
Der Anfang ist gemacht.
TTab_User = class(TObject)
public TitelIndex : Integer; SortIndex : Integer; SortOrder : Boolean; SortText : String; procedure LoadFromDataset(ds:TDataset); procedure SaveToDataset(ds:TDataset); procedure Clear; END; procedure TTab_User.LoadFromDataset(ds:TDataset); begin TitelIndex:= ds.FieldByName('Titel_Index').AsInteger; SortIndex := ds.FieldByName('Titel_SortIndex').AsInteger; SortOrder := NOT ds.FieldByName('Titel_SortOrder').AsBoolean; SortText := ds.FieldByName('Titel_SortText').AsString; end; Die weiteren Schritte sehen so aus: * aus den public Variablen werden Properties gemacht * weitere Methoden (z.B. procedure Clear oder SaveToDataset)entdecken und zur Klasse hinzufügen * überprüfen ob die Klasse vollständig ist (gibt es noch weitere Felder aus der Tabelle "User_Tab"?) * den Sourcecode der Klasse in eine eigene Unit verschieben * Ein Objekt der neuen Klasse TTab_User in die Klasse TMain_Zugriff einbauen * überlegen ob ein Objekt von TTab_User ausreicht oder ob man nicht eine Liste von diesen Objekten braucht * müssen TTab_User-Objekte kopiert werden können? Fall ja, von TPersistent ableiten und die Methode Assign überschreiben |
AW: Record-Variable in Klasseninstanz setzen
Zitat:
Hier mal ein bisschen mehr zum Spielen:
Delphi-Quellcode:
Der Class-Constructor könnte zur Zeit noch entfallen, da der Compiler auch Klassen-Variablen initialisiert, aber das muss ja nicht immer so bleiben.
type
TFoo = class private class var FCount: Integer; private FData : string; class constructor Create; function GetData : string; public constructor Create; property Data : string read GetData; end; constructor TFoo.Create; begin inherited; Inc(FCount); FData := 'Instanz: ' + IntToStr(FCount); end; class constructor TFoo.Create; begin FCount := 0; end; function TFoo.GetData : string; begin if Self = nil then Result := 'keine Instanz vorhanden' else Result := FData; end; procedure Test(init, nilit: Boolean); var LFoo : TFoo; begin if init then LFoo := TFoo.Create else if nilit then LFoo := nil; ShowMessage( LFoo.Data ); end; begin Test(false, true); Test(true, false); Test(false, false); end. |
AW: Record-Variable in Klasseninstanz setzen
Zitat:
Das kann doch kein Mensch lesen. (Lesen ist was anderes als "mit Mühe Entziffern" :!:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 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-2025 by Thomas Breitkreuz