AGB  ·  Datenschutz  ·  Impressum  







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

Konstruktoren in Delphi

Ein Thema von Int3g3r · begonnen am 18. Sep 2019 · letzter Beitrag vom 22. Sep 2020
Antwort Antwort
Seite 1 von 2  1 2      
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#1

Konstruktoren in Delphi

  Alt 18. Sep 2019, 09:51
Guten Tag,

Kann mir jemand erklären wie die ganze Konstruktoren Geschichte in Delphi funktioniert ?
Ich blicke da einfach nicht durch.

Ich habe ein neues VCL-Form erstellt und möchte nun einen eigenen Konstruktor erstellen:

Delphi-Quellcode:
public
   { Public-Deklarationen }
   Constructor Create(_pnlColor:TColor;_pnlTitle:String;_memoContent:TStringList);

//....

constructor TFehler.Create(_pnlColor: TColor; _pnlTitle: String;
   _memoContent: TStringList);
begin
   Inherited Create(self); //1
   setPanelTitle(_pnlTitle);
   setPanelTitleColor(_pnlColor);
   fillMemo(_memoContent);
end;
1. Warum muss hier Create(self) angegeben werden ? Warum reicht Inherited; nicht aus ?

Ich verstehe das so: Inherited muss benutzt werden damit der Standard-Konstruktor aufgerufen wird. Wenn ich Inherited nicht verwenden würde, dann würde mein VLC-Formular nicht erstellt werden.

2. Wann werden folgende Schlüsselwörter benötigt.
  • override
  • overload
  • reintroduce
  • virtual

3. Wie erstelle ich einen eigenen Konstruktor ohne Parameter ?
Ich möchte noch bestimmte Werte setzten, wenn das Objekt erstellt wird.

Im Beispiel hier wird ein overload; angegeben.
Dies begreife ich nicht. Ein override; würde für mich mehr Sinn ergeben. Ich möchte ja einen eigenen Standard-Constructor erstellen sonst würden ja zwei gleiche exisieren:

Delphi-Quellcode:
type
  // Define a parent class, base on TObject by default
  TFruit = class
  public
    name : string;
    Constructor Create; overload; // This constructor uses defaults
    Constructor Create(name : string); overload;
  end;

constructor TFruit.Create;
begin
   Inherited;
        //Setze Initial-Werte...
end;
Somit existiert hier ja:
Delphi-Quellcode:
Create; //Standard-Konstruktor
Create; //Überladener-Konstruktor
Create(name:String); overload; //Überladener-Konstruktor was ok ist weil durch die parameter kann der Konstruktor vom anderen unterschieden werden
Wie weis Delphi nun welchen Create; Konstruktor genommen werden soll ?

Danke für die Hilfe.
Gruss Int3g3r
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#2

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 09:57
Ich empfehle dringend ein Tutorial zur OOP mit Delphi.
Zur Detailfrage zum Thema Überladen:
Delphi erkennt die korrekte Methode anhand der Parametersignatur des Aufrufs. Das merkt man spätestens dann, wenn man mit zwei identischen Signaturen überladen möchte. Signatur ist hier übrigens eine vornehmes Wort für Parameterliste. Daraus folgt übrigens, daß die beiden Create-Aufrufe ohne Parameter nicht zwei verschiedene Methoden aufrufen werden, sondern beide die gleiche, das was da steht ist also falsch.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 10:08
1. Wen TFehler ein Formular ist, dann gibst du mit inherited Create(...) den Owner an. Also die Komponente/Formular, was dieses Formular wieder freigeben soll.
Hier Self mitzugeben ist Quark.

2. Es gilt:
override - Überschreiben einer virtuellen Methode/Konstruktor/Destruktor;
overload - Ich habe mehrere gleichnamige Methoden, die sich anhand ihrer Parameter unterscheiden (keine, ein Parameter, bis N-Parameter).
reintroduce - Ich möchte, dass meine Klasse und seine Ableitungen diese Methode nehmen und nicht die gleiche Methode aus der Elternklasse.
virtual - Nachkommenklassen sollen diese Methode überschreiben (override) können und weiteres Verhalten ergänzen.

3. Genau so wie, wie du es im verlinkten Beispiel siehst:
Delphi-Quellcode:
type
  // Define a parent class, base on TObject by default
  TFruit = class
  public
    name : string;
    Constructor Create; overload; // This constructor uses defaults
    Constructor Create(name : string); overload;
  end;

...

// Create a fruit object - parameterless version
constructor TFruit.Create;
begin
  // Execute the parent (TObject) constructor first
  inherited; // Call the parent Create method

  // Now set a default fruit name
  self.name := 'Fruit'; <--------------------------- Da kommt dein "Ich möchte noch bestimmte Werte setzten, wenn das Objekt erstellt wird."
end;
4. Ohne Argumente wird der überladene Konstruktor der Klasse .genommen
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 10:30
Zitat:
1. Wen TFehler ein Formular ist, dann gibst du mit inherited Create(...) den Owner an. Also die Komponente/Formular, was dieses Formular wieder freigeben soll.
Hier Self mitzugeben ist Quark.
Ja, TFehler ist eine VLC-Formular. Mir ist einfach nicht klar was ich beim Owner angeben soll.
Dies ist ein eigenständiges Formular, also es hat keinen Owner.

Danke für die Hilfe
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 10:49
Wenn es keinen Owner hat, dann ist der Owner wohl nil .
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 11:18
Vielen Dank an alle.

Ich habe jetzt meine Konstruktoren wie im Beispiel erstellt. Lässt sich aber nicht kompillieren.
Wo liegt mein Fehler ?

Delphi-Quellcode:
public
      { Public-Deklarationen }
      Constructor Create; overload;
      Constructor Create(_pnlColor:TColor;_pnlTitle:String;_memoContent:TStringList); overload;
   end;

//.......

constructor TFehler.Create(_pnlColor: TColor; _pnlTitle: String;_memoContent: TStringList);
begin
   Inherited Create(nil);
   setPanelTitle(_pnlTitle);
   setPanelTitleColor(_pnlColor);
   fillMemo(_memoContent);
end;

constructor TFehler.Create;
begin
   Inherited; // Fehler E2008
end;
Meldungen/Fehler beim kompilieren:
[dcc32 Warnung] form_CSVException.pas(24): W1010 Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TCustomForm'
[dcc32 Warnung] form_CSVException.pas(25): W1010 Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TCustomForm'
[dcc32 Fehler] form_CSVException.pas(53): E2008 Inkompatible Typen

- Warum erhalte ich den Fehler E2008 ? Wie lässt sich dieser beheben ?
- Wie lassen sich die Warungen beheben ?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 11:22
Probier es mal so
Delphi-Quellcode:
public
      { Public-Deklarationen }
      Constructor Create; reintroduce; overload;
      Constructor Create(_pnlColor:TColor;_pnlTitle:String;_memoContent:TStringList); reintroduce; overload;
   end;

//.......

constructor TFehler.Create;
begin
   Inherited Create(nil);
end;

constructor TFehler.Create(_pnlColor: TColor; _pnlTitle: String;_memoContent: TStringList);
begin
   Create(); // ruft TFehler.Create() auf
   setPanelTitle(_pnlTitle);
   setPanelTitleColor(_pnlColor);
   fillMemo(_memoContent);
end;

Geändert von Schokohase (18. Sep 2019 um 11:25 Uhr)
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 11:28
Probier es mal so
... So funktioniert es!

Warum funktioniert es nicht wie es im Beispiel steht ?
Was ist mit den Warnugen ?

Danke!
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#9

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 11:33
Es funktioniert so wie im Beispiel, soweit das Beispiel hier auch zutrifft.
Welche Warnungen? Es dürften keine Warnungen mehr da sein.
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Konstruktoren in Delphi

  Alt 18. Sep 2019, 11:47
Zitat:
1. Wen TFehler ein Formular ist, dann gibst du mit inherited Create(...) den Owner an. Also die Komponente/Formular, was dieses Formular wieder freigeben soll.
Hier Self mitzugeben ist Quark.
Ja, TFehler ist eine VLC-Formular. Mir ist einfach nicht klar was ich beim Owner angeben soll.
Dies ist ein eigenständiges Formular, also es hat keinen Owner.
Den Parameter AOwner wegzulassen halte ich für keine gute Idee.
Du musst dich dann zwingend selbst um die Freigabe kümmern.
Nur wenn dein Form (TFehler) immer modal in einen try finally mit Freigabe aufgerufen wird, könnte man es akzeptieren.
Machen würde ich es dennoch nicht. Bei mir haben alle Konstruktoren eines TForms alse ersten Parameter AOwner...
Der Aufruf zum Erzeugen kann dann TFehler.Create(Nil, Color...) oder TFehler.Create(Application, Color...) etc. sein.

Frank
Frank Reim
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:29 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