Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Constructor überschreiben (https://www.delphipraxis.net/185308-constructor-ueberschreiben.html)

Sugar 29. Mai 2015 14:26

Delphi-Version: 7

Constructor überschreiben
 
Hallo,

ich programmiere aus Hobby ein versuche so mir etwas Kenntnisse anzueignen.

Im Moment versuche ich (ausnahmsweise) Mal ein Projekt zu vollenden das auch tatsächlich schon einen Einsatzzweck haben wird.

Nun zu meinem Problem oder meiner Absicht. In meinem Programm soll ein weiteres Formular geöffnet werden und zwar über eine Tastatureingabe. Das zu öffnende Formular dient der Suche, es enthält ein DBGri und ein Eingabefeld. Nun möchte ich den Buchstaben der im Hauptformular gedrückt wurde in das Eingabefeld des zu öffnenden Fensters übernehmen. Kein Akt mit einer globalen Variable. Ein ehemaliger Kollege von mir hat mir das vor Jahren mal anhand eines überschriebenen Constructors gezeigt. Mein zweites Fenster wurde dann nicht wi üblich mit Form2.Show aufgerufen, sondern mit einem Parameter den ich im 2. Formular auswerten konnte. Ich weiß nur nicht mehr wie das funktioniert. Es scheint mir der elegantere Weg.

Kann mir jemand erklären wie ich den Constructor des 2.Formulars überschreibe sodass ich im SHow oder ShowModal einen Stringparameter übergeben kann den ich dann dort weiter benutze?

Gruß
Sugar

BadenPower 29. Mai 2015 14:32

AW: Constructor überschreiben
 
Zitat:

Zitat von Sugar (Beitrag 1303538)
Kann mir jemand erklären wie ich den Constructor des 2.Formulars überschreibe sodass ich im SHow oder ShowModal einen Stringparameter übergeben kann den ich dann dort weiter benutze?

Dazu brauchst Du aber nicht den Constructor überschreiben, sondern nur eine weitere Procedure im Public-Bereich der Form zu deklarieren und diese dann aufrufen.

himitsu 29. Mai 2015 14:34

AW: Constructor überschreiben
 
Wenn du Parameter hinzufügen willst, dann geht das nicht mit überschreiben, denn dabei muß die Signatur (die Parametertypen) übereinstimmen.

Du kannst aber den Contructor überladen (overload) oder den alten verdecken (ohne overload).

Delphi-Quellcode:
constructor Create(AOwner: TComponent; DeinErsterParameter: string); {virtual;} {overload}
// da drin dann als erstes via "inherited Create(AOwner);" den "alten" Constructor aufrufen
virtual: wenn du vorhanben solltest deine Form nochmal abzuleiten und du dann wirklich deinen Constructor überschreiben willst (override)
overload: wenn man auch die alten Constructoren aufrufen können soll. Ohne overload, wenn nur noch dein Constructor gehen soll.


Globale Variablen sind böse!
Man könnte zwar Class-Variablen in der Formklasse verwenden, aber auch die sind quasi golobal (aber wenigstens weggekapselt und nur über
Delphi-Quellcode:
TDeineForm.DeineClassVar := '123';
benutzbar)



Alternativ den Constructor so lassen, und stattdessen die Form-Instanz erst erstellen, dann danach die Daten via Property oder an Methoden übergeben und danach anzeigen (Show/ShowModal).


Das von BadenPower ist eine
Delphi-Quellcode:
class function GibMitFormInstanz(DeinErsterParameter: string): TDeineForm;
, welche das "Alternativ"e intern macht und zum Schluß die Instanz ausliefert.

BadenPower 29. Mai 2015 15:47

AW: Constructor überschreiben
 
Zitat:

Zitat von himitsu (Beitrag 1303540)
Das von BadenPower ist eine
Delphi-Quellcode:
class function GibMitFormInstanz(DeinErsterParameter: string): TDeineForm;
, welche das "Alternativ"e intern macht und zum Schluß die Instanz ausliefert.

So weit wäre ich in diesem Fall nicht gegangen.

Ich denke ein simples

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure ShowWithParam(AValue: String);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.ShowWithParam(AValue: String);
begin
  Caption := AValue;
  Show;
end;
genügt.

Aufruf dann mit:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.ShowWithParam(Caption);
end;

himitsu 29. Mai 2015 16:34

AW: Constructor überschreiben
 
Oh, fast falsch verstanden, na dann isses eben die "Erstellen und dann Übergeben"-Variante. :)

Popov 29. Mai 2015 16:45

AW: Constructor überschreiben
 
Ich bin jetzt kein großer Klassenschreiber, ich mache es nur ab und zu, deshalb sollte das nur als Diskusionsgrundlage dienen.

Das zweite Formular müsste als Klasse erweitert werden. Letztendlich ist TForm2 auch nur eine Klasse die von der TForm abgeleitet wird. Dabei wird das ShowModal von TForm überschrieben überladen.
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function ShowModal: Integer; overload;
    function ShowModal(S: string): Integer; overload;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

function TForm2.ShowModal: Integer;
begin
  inherited ShowModal;
end;

function TForm2.ShowModal(S: string): Integer;
begin
  Caption := S;

  inherited ShowModal;
end;

end.
In der TForm1 kann man ShowModal nun so oder so aufrufen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.ShowModal('Hallo Welt!');
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 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