Thema: Delphi Constructor verbergen

Einzelnen Beitrag anzeigen

s-off
(Gast)

n/a Beiträge
 
#5

Re: Constructor verbergen

  Alt 30. Jan 2008, 10:31
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);
  Mit Zitat antworten Zitat