![]() |
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?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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