AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigener Konstruktor

Ein Thema von FriendOfDelphi · begonnen am 7. Jun 2010 · letzter Beitrag vom 7. Jun 2010
Antwort Antwort
Seite 1 von 3  1 23      
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#1

Eigener Konstruktor

  Alt 7. Jun 2010, 13:41
Delphi-Version: 2005
Hallo!

Ich eine Frage zur Verwendung eigener Konstruktoren.

Allgemein:
Objektreferenz := Klasse.Create;
Konkret:
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:
  • Datenfelder mit einem ganzzahligen Datentyp (z.B. Integer) werden mit 0 initialisiert
  • Datenfelder mit einem String-Typ werden durch eine leere Zeichenkette initialisiert
Wie gesagt, wenn "MeinAuto" erzeugt wird, sollen eigene Werte über einen eigenen Konstruktor in die Datenfelder des Objekts geschrieben werden.

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:
constructor TAuto.Create(col: string);
begin
  inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
  FFarbe:='rosa';
end;
Und hier das Beispielprogramm in einer anderen Unit:
Delphi-Quellcode:
var
  LKW: TAuto;
begin
  LKW:=TAuto.Create;
  LKW.Farbe:='rot';
Leider funktioniert das so nicht.
Die Farbe wird erst mit der Zeile LKW.Farbe:='rot'; gesetzt. Die Initialisierung des Feldes "Farbe" im Konstruktur FFarbe:='rosa'; erfolgt nicht.
Was mache ich falsch?
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 13:47
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 13:47
Delphi-Quellcode:
constructor TAuto.Create(col: string);
begin
  inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
  FFarbe := col;
end;
Delphi-Quellcode:
var
  LKW: TAuto;
begin
  LKW:=TAuto.Create( 'rot');
Du benutzt den Constructor ohne Parameter in deinem Beispiel.
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 13:51
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:
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;
Option 2:
Du übergibst keine Farbe und nimmst "rosa"

Delphi-Quellcode:
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;
vielleicht in dem Zusammenhang auch für dich interessant sind folgende Stichwörter:
overload
override
reintroduze


Gruß
angos
Ansgar

Geändert von angos ( 7. Jun 2010 um 13:54 Uhr)
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#5

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 14:13
Delphi-Quellcode:
constructor TAuto.Create(col: string);
begin
  inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
  FFarbe := col;
end;
Delphi-Quellcode:
var
  LKW: TAuto;
begin
  LKW:=TAuto.Create( 'rot');
Du benutzt den Constructor ohne Parameter in deinem Beispiel.
Du hast natürlich recht.
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:
var
  LKW: TAuto;
begin
  LKW:=TAuto.Create;
Funktioniert aber nicht.
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 14:15
Funktioniert schon, könnte oder hat mit großer Wahrscheinlichkeit Seiteneffekte und führt nicht zum gewünschten Ergebnis
Markus Kinzler
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#7

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 14:18
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:
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;
Option 2:
Du übergibst keine Farbe und nimmst "rosa"

Delphi-Quellcode:
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;
vielleicht in dem Zusammenhang auch für dich interessant sind folgende Stichwörter:
overload
override
reintroduze


Gruß
angos
Hallo!
Die "Option 2" war gemeint.
War ein "copyandpaste"-Fehler von mir (siehe auch meine Antwort an freak4fun).
Nur funktioniert das leider nicht.
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 14:25
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"?
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#9

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 14:44
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"?
Ja, habe ich.
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 ShowMessage(LKW.Farbe); .
Das Feld ist aber immmer leer, also ''.
Es sei denn, ich verwende LKW.Farbe:='rot'; .
Dann wird die Farbe "rot" gesetzt.
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Eigener Konstruktor

  Alt 7. Jun 2010, 14:46
Befindet sich die Unit (bzw. deren Pfad) im Suchpfad?
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz