![]() |
Delphi-Version: 2005
Eigener Konstruktor
Hallo!
Ich eine Frage zur Verwendung eigener Konstruktoren. Allgemein:
Delphi-Quellcode:
Objektreferenz := Klasse.Create;
Konkret:
Delphi-Quellcode:
MeinAuto := TAuto.Create;
Ich möchte erreichen, dass zu dem Zeitpunkt wenn das Objekt erzeugt wird, einige Datenfelder des Objekts mit vorgegebenen Werten und nicht mit Standardwerten initialisiert werden. Standardwerte sind:
Hier die Unit mit der Beispielklassendefinition:
Delphi-Quellcode:
type
TAuto = class(TObject) private FFarbe: string; procedure SetFarbe(Farbe: string); constructor Create(col: string); public property Farbe: string read FFarbe write SetFarbe; end;
Delphi-Quellcode:
Und hier das Beispielprogramm in einer anderen Unit:
constructor TAuto.Create(col: string);
begin inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen FFarbe:='rosa'; end;
Delphi-Quellcode:
Leider funktioniert das so nicht.
var
LKW: TAuto; begin LKW:=TAuto.Create; LKW.Farbe:='rot'; Die Farbe wird erst mit der Zeile
Delphi-Quellcode:
gesetzt. Die Initialisierung des Feldes "Farbe" im Konstruktur
LKW.Farbe:='rot';
Delphi-Quellcode:
erfolgt nicht.
FFarbe:='rosa';
Was mache ich falsch? |
AW: Eigener Konstruktor
Moin,
was macht denn TAuto.SetFarbe()? Weil den rufst du ja nur im zweiten Fall auf. Abgesehen davon ist der Konstruktor privat? Wie soll er also aufgerufen werden? Und nebenbei rufst du den falschen Konstruktor auf, weil deiner will ein Parameter. MfG Fabian |
AW: Eigener Konstruktor
Delphi-Quellcode:
constructor TAuto.Create(col: string);
begin inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen FFarbe := col; end;
Delphi-Quellcode:
Du benutzt den Constructor ohne Parameter in deinem Beispiel. :)
var
LKW: TAuto; begin LKW:=TAuto.Create( 'rot'); |
AW: Eigener Konstruktor
Hi,
so wie es da steht, kann es doch gar nicht funktionieren (es sollte einen Compilerfehler geben) Option 1: Du übergibst dem Create die Farbe und setzt dementsprechend.
Delphi-Quellcode:
Option 2:
constructor TAuto.Create(col: string);
begin inherited Create; FFarbe:=col; end; procedure TForm1.btnClick(Sender: TObject); var LKW: TAuto; begin LKW:=TAuto.Create('rot'); end; Du übergibst keine Farbe und nimmst "rosa"
Delphi-Quellcode:
vielleicht in dem Zusammenhang auch für dich interessant sind folgende Stichwörter:
constructor TAuto.Create;
begin inherited Create; FFarbe:='rosa'; end; procedure TForm1.btnClick(Sender: TObject); var LKW: TAuto; begin LKW:=TAuto.Create; LKW.Farbe:='rot'; end; overload override reintroduze Gruß angos |
AW: Eigener Konstruktor
Zitat:
Da hat sich ein "copy and paste"-Fehler eingeschlichen. Ich habe da ein weng experimentiert (mit und ohne Parameter). Wenn die Methode mit Parameter deklariert und implementiert wurde, muss sie natürlich auch mit Parameter aufgerufen werden. Das soll aber nicht so sein. Bei der Erzeugung des Objekts, soll diesem sofort und ohne weiteres Zutun, die Farbe "rosa" zugewiesen werden. So sollte es aussehen:
Delphi-Quellcode:
constructor TAuto.Create;
begin inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen FFarbe:='rosa'; end;
Delphi-Quellcode:
Funktioniert aber nicht.
var
LKW: TAuto; begin LKW:=TAuto.Create; |
AW: Eigener Konstruktor
Funktioniert schon, könnte oder hat mit großer Wahrscheinlichkeit Seiteneffekte und führt nicht zum gewünschten Ergebnis
|
AW: Eigener Konstruktor
Zitat:
Die "Option 2" war gemeint. War ein "copyandpaste"-Fehler von mir (siehe auch meine Antwort an freak4fun). Nur funktioniert das leider nicht. |
AW: Eigener Konstruktor
Hast du mal einen Breakpoint gesetzt und bist da durchgestept? Was bedeutet "Nur funktioniert das leider nicht." Welche Farbe ist gesetzt? Wie prüfst du ob es "funktioniert"?
|
AW: Eigener Konstruktor
Zitat:
Folgender Effekt: Wenn ich den Quellcode komplett, also Klassendefinition und die Verwendung der Klasse in eine Unit schreibe, dann kann ich einen Breakpoint im Konstruktor setzen und dieser wird auch durchlaufen. Wenn ich, wie von mir bevorzugt, die Klasse in einer eigenen Unit definiere und diese in einer anderen Unit nur verwenden will, dann nimmt der Compiler die Breakpoints im Konstruktor weg, so dass ich dort keinen mehr setzen kann. Um zu überprüfen welche Farbe gesetzt wurde, verwende ich einfach ein
Delphi-Quellcode:
.
ShowMessage(LKW.Farbe);
Das Feld ist aber immmer leer, also ''. Es sei denn, ich verwende
Delphi-Quellcode:
.
LKW.Farbe:='rot';
Dann wird die Farbe "rot" gesetzt. |
AW: Eigener Konstruktor
Befindet sich die Unit (bzw. deren Pfad) im Suchpfad?
|
AW: Eigener Konstruktor
Zitat:
|
AW: Eigener Konstruktor
Hallo,
ich bin mir nicht sicher, aber in einer anderen Unit kann es nicht gehen, weil der constructor Privat ist...
Delphi-Quellcode:
EDIT... Zu spät...
type
TAuto = class(TObject) private FFarbe: string; procedure SetFarbe(Farbe: string); constructor Create(col: string);//hier eventuell mal schauen. public property Farbe: string read FFarbe write SetFarbe; end; Gruß Jens |
AW: Eigener Konstruktor
Zitat:
Der Compiler meckert nicht. Die Unit wird also gefunden. |
AW: Eigener Konstruktor
Zitat:
|
AW: Eigener Konstruktor
Ok. Das war's.
Der Konstruktor muss public sein. Ist das denn so "richtiger" Quellcode? Ich meine gelesen zu haben, dass man das so nicht machen soll, oder? |
AW: Eigener Konstruktor
Was soll man wie nicht machen? Vordefinierte Werte im Konstruktor zuweisen? Dafür ist der doch u.a. da.
|
AW: Eigener Konstruktor
Zitat:
und wenn beim Create der hinterlegte Code ausgeführt werden soll, dann muss der constructor public sein. |
AW: Eigener Konstruktor
Hallo,
z.B. privat, ist nur in der eigenen Unit sichtbar. public im gesamten Projekt. Man sollte also als privat deklarieren, was nach außen hin nicht sichtbar sein soll, z.B. Methoden, die in der Klasse selbst benötigt werden. Da du den Constructor ja außen benötigen tust, muss er public sein. Eine Aufstellung dieser Deklarationen findest du in der Hilfe von Delphi... Gruß Jens |
AW: Eigener Konstruktor
Ein constructor sollte immer public sein. Soll die Klasse nur in einer Unit verwendbar sein dann deklariert man sie halt unter Implementation
|
AW: Eigener Konstruktor
Und falls SetFarbe irgendwas "wichtiges" macht, dann würde ich einfach auch im Constructor SetFarbe('rosa') bzw. Farbe := 'rosa' aufrufen statt nur das Feld FFarbe zu setzen.
Grüsse, Dirk |
AW: Eigener Konstruktor
Jepp, es kommt eben darauf an, ob ein evtl. Setter durchlaufen werden soll (dann weist man der Property einen Wert zu) oder nicht (dann greift man direkt auf das Feld zu).
|
AW: Eigener Konstruktor
GGf noch eine Konstruktor mit entsprechendem Parameter
|
AW: Eigener Konstruktor
Naja ich bin mir da jetzt nicht sicher, deshalb ist das hier auch eine halbe Frage: aber er setzt doch
Delphi-Quellcode:
. Kann er dann im Konstruktor überhaubt Farbe := .... benutzen? Muss hier jetzt nicht auch die gerade deklarierte Setfarbe Methode genutzt werden? Oder geht das im Konstruktor noch gar nicht?
Farbe: string read FFarbe write Setfarbe
|
AW: Eigener Konstruktor
Hmmm kommt mir irgendwie bekannt vor...
[edit]Wegen Roten Kasten (falls man den so nennen darf): Du kannst ja darauf zugreifen, wenn der ursprüngliche Konstruktor bereits ausgeführt wurde. Also sowas wie inherited Create[/edit] MfG Fabian |
AW: Eigener Konstruktor
Auf private Felder kann man innerhalb der Unit zugreifen bzw. bei strict private nur innerhalb der Klasse. Bei beidem wäre hier die Bedingung erfüllt
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz