AGB  ·  Datenschutz  ·  Impressum  







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

Constructor überschreiben

Ein Thema von Sugar · begonnen am 29. Mai 2015 · letzter Beitrag vom 29. Mai 2015
Antwort Antwort
Sugar

Registriert seit: 23. Jul 2012
83 Beiträge
 
#1

Constructor überschreiben

  Alt 29. Mai 2015, 14:26
Delphi-Version: 7
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
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#2

AW: Constructor überschreiben

  Alt 29. Mai 2015, 14:32
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#3

AW: Constructor überschreiben

  Alt 29. Mai 2015, 14:34
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 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 class function GibMitFormInstanz(DeinErsterParameter: string): TDeineForm; , welche das "Alternativ"e intern macht und zum Schluß die Instanz ausliefert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Mai 2015 um 14:41 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: Constructor überschreiben

  Alt 29. Mai 2015, 15:47
Das von BadenPower ist eine 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;
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#5

AW: Constructor überschreiben

  Alt 29. Mai 2015, 16:34
Oh, fast falsch verstanden, na dann isses eben die "Erstellen und dann Übergeben"-Variante.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Constructor überschreiben

  Alt 29. Mai 2015, 16:45
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;

Geändert von Popov (29. Mai 2015 um 16:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:34 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