Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Formalparameter für TForm.create


Ruachel - Fr 27.02.09 15:41
Titel: Formalparameter für TForm.create
Hallo zusammen,

Ich möchte gerne aus meiner Hauptform(frmMain) ein weiteres Formular(frmDetail) aufrufen, dabei aber Parameter übergeben.

Dazu habe ich folgendes gemacht(in vereinfachter Form):


in der aufrufenden unit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
//unit frmMain
.
.
.


procedure TNavigation.LookOutButton22Click(Sender: TObject);
var
KomponenteEdit:TKomponente_Detail; //die unit frmDetail
begin

KomponenteEdit:=TKomponente_Detail.Create(self,'neu',''); 

//also eine leere Maske (self,'edit','4') wäre zum Editieren eines Datensatzes

KomponenteEdit.Visible:=false;
KomponenteEdit.ShowModal;


end;


in der aufgerufenen unit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
type
     TKomponente_Detail    = class(TForm)
        Edit1:TEdit;
        ButtonSpeichern:TButton
        procedure ButtonSpeichernClick(Sender: TObject);
        procedure InsertKomp;
     public

        constructor create(aOwner : tComponent;mode:string;UID:string); virtual;
    end;

var
Komponente_Detail:TKomponente_Detail;

   implementation

...
    constructor myForm.create(AOwner:TComponent,parm:string;UID:string);
    begin
       inherited create(AOwner);
       
    end;


...

...

   procedure TKomponente_Detail.ButtonSpeichernClick(Sender: TObject);
   begin
   showmessage(Komponente_Detail.Edit1.Text);  //<----- hier knallts

   end;


Die Programmierhilfe springt darauf an, der Compiler meckert auch nicht, aber
zur Laufzeit krieg ich eine Access violation, wenn ich auf Buttonspeichern klicke..


Nun der Hintergrund ist, dass ich an einer kleinen Datenbankanwendung (Absolute Database) schreibe und in mein Hauptfenster wie eine Webseite aufgebaut habe.

Also links die Navigation, rechts der Inhalt.

Bei oben angeführtem Konstrukt geht es darum, eine Eingabemaske (modal) für einen Datensatz aufzurufen.
Je nach gedrücktem Button soll entweder eine leere Maske angezeigt werden, oder eine mit bereits gefüllten Werten aus der Datenbank (zum editieren).

Ich habe das mittlerweile mit 2 Globalen Variablen gelöst, finde das aber nicht sehr schön und vermute, dass das Mißlingen auf diesem Weg an meinen mangelnden OOP_Kenntnissen liegt.

Deswegen: Kann mir da wer auf die Sprünge helfen ?

Wäre für Hinweise sehr dankbar.

greetz


Ruachel


Ruachel - Fr 27.02.09 18:01

Hallo,

Das Problem hat sich erledigt.

Nach einer Antwort in einem anderen Forum hab ich den Code nochmal versucht, und
es gab kein Problem mehr...

Ich kann nicht sagen worans lag, vielleicht hatte mein Delphi gestern seine Tage..


EDIT sagt:

Nun, es gab aber doch ein Problem:

Der Aufruf:

Delphi-Quelltext
1:
showmessage(Komponente_Detail.Edit1.Text);  //<----- hier knallts                    


geht ins Leere, weil so eine Instanz nicht existiert (Formular wird nicht automatisch erzeugt und der Aufruf aus der Hauptunit erzeugt KomponenteEdit.Edit1.TXT).

Die Programmierhilfe und der Compiler merken das natürlich nicht.

Also so:


Delphi-Quelltext
1:
showmessage(Edit1.Text);  //<----- hier knallts nicht                    


eigentlich eine einfache Sache, ich dachte es liegt irgenwie am neuen constructor.


greetz


Ruachel


Xentar - Fr 27.02.09 18:18

user profile iconRuachel hat folgendes geschrieben Zum zitierten Posting springen:
Ich einer Antwort in einem anderen Forum...

Wenn du die Frage in mehreren Foren stellst, solltest du das mit angeben, damit sich nicht alle Leute den Kopf zerbrechen, obwohl das Problem (im anderen Forum) schon gelöst wurde...


Ruachel - Fr 27.02.09 20:15

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:

Wenn du die Frage in mehreren Foren stellst, solltest du das mit angeben, damit sich nicht alle Leute den Kopf zerbrechen, obwohl das Problem (im anderen Forum) schon gelöst wurde...


Deswegen hab ich auch sofort hier den grünen Haken ans Thema gemacht und
die "Lösung" gepostet ;-)

greetz

Ruachel


jaenicke - Fr 27.02.09 20:19

Besser ist es gleich die Crossposts beim Fragen zu verlinken, dann kann man auch selbst schauen, ob das was man schreiben will vielleicht schon an anderer Stelle diskutiert wurde.
In manchen Foren wird dir, wenn du das unterlässt, dein Thema auch gleich ganz geschlossen. Gern gesehen ist es jedenfalls nie, auch wenn hier nicht gleich das Thema geschlossen wird. ;-)