Hallo,
vielen Dank für Eure Tipps.
Bezüglich der 'strict private'-Variante habe ich es nun auf zweierlei Art und Weise probiert:
Delphi-Quellcode:
TMeinMemoObject = Class(TObject)
strict private
Constructor Create; overload;
private
FValue: String;
Procedure CreateMeinMemoObject(oMemo: TMeinMemo);
public
Property Value: String read FValue;
end;
TMeinMemo = Class(TMemo)
private
Function GetMeinMemoObject: TMeinMemoObject;
public
Property MeinMemoObject : TMeinMemoObject read GetMeinMemoObject;
end;
Aufruf dann per
Delphi-Quellcode:
Procedure TMeinMemo.BaueMemoObject;
var
oMemoObject: TMeinMemoObject;
Begin
oMemoObject := TMeinMemoObject.CreateMeinMemoObject(Self);
End;
Diese Variante hat mehrere Compilermeldungen zur Folge:
Zitat:
[Pascal Fehler] uMeinMemo.pas(563): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt
[Pascal Fehler] uMeinMemo.pas(731): E2075 Diese Form des Methodenaufrufs ist nur in Methoden von abgeleiteten Typen erlaubt
Die zweite Variante sieht so aus:
Delphi-Quellcode:
TMeinMemoObject = Class(TObject)
strict private
Constructor Create; overload;
private
FValue: String;
protected
Constructor Create(oMemo: TMeinMemo); overload;
public
Property Value: String read FValue;
end;
TMeinMemo = Class(TMemo)
private
Function GetMeinMemoObject: TMeinMemoObject;
public
Property MeinMemoObject : TMeinMemoObject read GetMeinMemoObject;
end;
Aufruf dann per
Delphi-Quellcode:
Procedure TMeinMemo.BaueMemoObject;
var
oMemoObject: TMeinMemoObject;
Begin
oMemoObject := TMeinMemoObject.Create(Self);
End;
Diese Variante hat nur einen Hinweis zur Folge, der nicht weiter stört
Zitat:
[Pascal Hinweis] uTSplitCellStringGrid.pas(96): H2219 Das private-Symbol 'Create' wurde deklariert, aber nie verwendet
Alles weitere Funktioniert so weit.
Wenn ich nun aber versuche, von außen auf den Constructor zuzugreifen, dann wird mir dieser auch nicht mehr in der CodeVervollständigung angezeigt, aufrufen kann ich ihn aber trotzdem, was dann zu einer
Exception führt
Wo liegt der Fehler?
Edit:
@xaromz
Zitat von
xaromz:
sMeinString := oMeinMemo.MeinMemoObject.Value;
Damit erzeugst Du
IMHO kein neues Objekt, sondern rufst den Konstruktor eines bestehenden Objekts als normale Methode auf.
damit möchte ich ja auch gar kein neues Objekt erzeugen, sondern nur Zeigen, wie ich auf Felder dieser Klasse von außen zugreife - das Beispiel mit dem Erzeugen des Objektes war etwas weiter unten
Zitat:
oMeinMemo.MeinMemoObject.Create(oMeinMemo);