Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [erledigt] Formalparameter für TForm.create (https://www.delphipraxis.net/129902-%5Berledigt%5D-formalparameter-fuer-tform-create.html)

Ruachel 27. Feb 2009 15:10


[erledigt] Formalparameter für TForm.create
 
Hallo zusammen,

Ich bin neu hier und beschäftige mich seit ca 2 Monaten wieder intensiver mit Delphi.

Vor ca 2 Jahren hab ich schon mal ein wenig was damit gemacht (serielle Schnittstelle),
bin aber keineswegs ein Profi, meine Hauptbetätigung liegt in der SPS-Programmierung.

Aber zu meinem aktuellen Problem:

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-Quellcode:

//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-Quellcode:

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 TKomponente_Detail.create(AOwner:TComponent,mode: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

PS: Übrigens ich verwendet D7 pro.

Morphie 27. Feb 2009 15:16

Re: Formalparameter für TForm.create
 
ersetze mal
Delphi-Quellcode:
showmessage(Komponente_Detail.Edit1.Text); //<----- hier knallts
durch
Delphi-Quellcode:
showmessage(Edit1.Text); //<----- hier knallts nicht
du befindest dich ja bereits in einem Komponente_detail-Fenster...

Ruachel 27. Feb 2009 15:50

Re: Formalparameter für TForm.create
 
Danke für die Antwort,


Also ich weiss nicht was los ist...

Ich habe den Code gestern verworfen, weil ich weiterkommen wollte.

Auf deine Antwort hin, hab ich das jetzt noch mal so gemacht, und jetzt klappt das,

sowohl mit "Komponente_Detail.Edit1.text" als auch mit "Edit1.text" .

Da brat mir einer einen Storch... :wall: :wall: :wall:

Der Fehler muss wohl woanders gelegen haben :gruebel:

Danke jedenfalls..

greetz

Ruachel

Bernhard Geyer 27. Feb 2009 17:12

Re: Formalparameter für TForm.create
 
Zitat:

Zitat von Ruachel
Der Fehler muss wohl woanders gelegen haben :gruebel:

Nein. Du greifst auf die globale Variable Komponente_Detail zu die nicht unbedingt initalisiert sein muß und nicht der Formularinstanz entsprichst in der du dich gerade bewegst. Komponente_Detail ist nur initialisiert wenn die autmatische Formular-Erstellung das macht.

Ich gehe meistens dahin um diese Art von Fehler zu vermeiden das ich die globale Variable einfach lösche.

Ruachel 27. Feb 2009 20:28

Re: Formalparameter für TForm.create
 
Ahhhh

Jetzt kapier ichs (glaub ich).

Die Instanz, die ich aus der aufrufenden Unit erzeuge heisst ja "KomponenteEdit.Edit1.Text".

Wenn ich zur Laufzeit mit "Komponente_Detail.Edit1.Text" zugreife, knallt das,
weil diese Instanz ja gar nicht existiert, für die Prgrammierhilfe und den Compiler
spielt das aber keine Rolle.

So klingts für mich zumindest logisch, wie gesagt in OOP hab ich noch Schwächen :lol:

Warum das nach dem letzten Versuch (mein letztes Posting) sowohl so als auch so geklappt hat,
kann ich nicht sagen, möglicherweise hab ich die Instanz die ich erzeugte zufällig auch "Komponente_Detail" genannt.

Danke jedenfalls Bernhard, sehr schön erklärt..

greetz


Ruachel

xZise 27. Feb 2009 20:39

Re: Formalparameter für TForm.create
 
Also dein Gedanke ist richtig.

Und das es jetzt funktioniert, kann daran liegen, dass du das Formular automatisch beim Programmstart erstellst.

MfG
xZise

Ruachel 27. Feb 2009 22:35

Re: Formalparameter für TForm.create
 
Zitat:

Zitat von xZise

Und das es jetzt funktioniert, kann daran liegen, dass du das Formular automatisch beim Programmstart erstellst.

MfG
xZise


Yoooo,

Hatte mir nach der ersten Antwort von Morphie mal
schnell ein Testformular zusammengeklickt (da ich den Code ja schon gelöscht hatte),
und das wurde automatischerweise in den Projectoptionen als Automatisch erzeugen eingetragen.

Ich hab dann meinen Originalcode wieder umgemodelt (is um einiges mehr) und konnte
das dann reproduzieren.

Jetzt ist mir das völlig klar :coder:

Danke Euch allen


Greetz

Ruachel


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