Parameter an Formular



  • Hallo Leute,
    ich habe mir einen eigene Class geschrieben. Aus dieser Klasse heraus möchte ich jetzt mein Formular frm_showParam aufrufen. In diesem Aufruf möchte ich auch ein Parameter übergeben, wie mache ich das? Mit

    frm_showParam->showModal();
    

    geht das dann ja naicht.

    MfG
    Muecke



  • hola

    entweder uebergibst du dem formular vor dem 'showModal' schon die notwendigen parameter oder bei der erzeugung des formulars. haengt von deinem code ab.
    bei ersterem ne methode dafuer schreiben bei zweiterem nen neuen konstruktor.

    Meep Meep



  • Danke für deine Hilfe.
    Köänntest du mir vielleicht ein Beispiel schreiben. ICh möchte an das Formular enfach nur ein Integer übergeben. Und je nach dem was übergeben wurde, soll er was anderes anzeigen...

    MfG
    Muecke



  • re

    Muecke schrieb:

    Danke für deine Hilfe.
    Köänntest du mir vielleicht ein Beispiel schreiben. ICh möchte an das Formular enfach nur ein Integer übergeben. Und je nach dem was übergeben wurde, soll er was anderes anzeigen...

    ein beispiel worueber?
    zu erstens:
    du legst in deiner form noch ne methode an, der du einen integer uebergibst.
    damit du dann beim aufruf von 'showModal' noch weißt was da uebergeben worden war, brauchst auch ne variable dafuer wo das abgespeichert war: z.b. int param.
    ueber das 'onShow'-event kannst dir dann die variable 'param' auslesen und demnach dann deine form zu darstellen wie du willst

    void MyForm::SetParam(int t_param) { param = t_param; } 
    ...
    void MyForm::OnShowMyForm(/* weiß grad net welche parameter uebergeben werden*/)
    {
       /* hier greifst du dann auf 'param' zu als wenn dir dir variable
       uebergeben worden waere und kannst damit deine anzeige oder so steuern. */
    }
    

    bei zweiterem nen eigenen konstruktor:
    in der header:

    TMyForm(TComponent *Owner, int t_param);
    

    in der cpp:

    TMyForm::TMyForm(TComponent *Owner, int t_param) : Form(Owner), param(t_param)
    {
       /* dein konstruktor */
    }
    

    beim erzeugen des Forms musst du dann den 'param' mit uebergeben

    TMyForm *my_form = new TMyForm(this, 1234);
    my_form->showModal();
    

    auch hier musst du 'param' in der header deklarieren und dann ueber onShow abrufen.

    zweite variante kannst halt nur anwenden wenn du den 'param' nicht mehr waehrend der lebenszeit des forms aendern willst. ansonsten mit der ersten variante.

    hab hier leider keinen BCB installiert, weshalb ich net weiß ob das nun komplett korrekt ist. aber von der funktionsweise sollte es so klar sein. hoff ich mal

    Meep Meep



  • Danke dir. Das ist sehr nett, dass du dir hier soviel Mühe gibst. Ich werde dass dann mal ausprobieren. Das wird dann schon klappen.

    DANKE nochmal

    Muecke



  • Nochmal ne Frage.
    Habe das jetzt mit dem Konstruktor versucht. Hier mal die wichtigen Sachen, die man braucht:

    In meiner header-Datei:

    private: 
             int paramsatz;
    
    public:
             __fastcall Tfrm_showParam(TComponent *Owner, int what);
    

    In der Cpp:

    __fastcall Tfrm_showParam::Tfrm_showParam(TComponent *Owner, int what)
            : TForm(Owner),paramsatz(what)
    {
            paramsatz = what;
    }
    

    Und so rufe ich die dann aus meiner selbstgebauten Klaase zweitor auf:

    void zweitor::show_Y()
    {
            Tfrm_showParam *b = new Tfrm_showParam(this,0);
            b->ShowModal();
    }
    

    Jetzt bekomme ich aber beim Compilieren einen Fehler in der Zeile:

    Tfrm_showParam *b = new Tfrm_showParam(this,0);
    

    Fehler: E2285 Keine Übereinstimmung für 'Tfrm_showParam::Tfrm_showParam(zweitor* const,int)' gefunden.

    Was muss ich denn jetzt anstatt this einsetzten??? Ich denke, daran wird das ja liegen, oder nicht???

    MfG
    Muecke



  • Hallo

    offenbar ist die Klasse zweitor nicht von TComponent abgeleitet, deshalb kannst du nicht als this übergeben. Du kannst aber auch einfach NULL übergeben

    void zweitor::show_Y()
    {
      Tfrm_showParam *b = new Tfrm_showParam(NULL,0);
      b->ShowModal();
      delete b;
    }
    


  • re

    __fastcall Tfrm_showParam::Tfrm_showParam(TComponent *Owner, int what)
            : TForm(Owner),paramsatz(what)
    {
            paramsatz = what;
    }
    

    hier zeigt sich jedoch, das Tfrm_showParam von TForm abegeleitet wird. oder ?

    paramsatz = what;
    

    kannst weglassen. paramsart bekommt ja schon mit paramsatz(what) den wert zugeteilt. is zwar so gesehen nicht falsch, aber doppelt gemoppelt.

    Meep Meep



  • Wenn ich da NULL eingebe bekomme ich immer einen Exception EAccessViolation.

    Woran liegt das?

    MfG
    Muecke



  • re

    ich schaetze mal, das bei dir dann im code irgendwo auf das parentform zugegriffen wird. nachdem du da jetzt 0 einsetzt, gibt es keinen parent mehr. deshalb die fehlermeldung.

    Meep Meep



  • Also hier mal meine header und die cpp-datei von dem Formular, an dass was übergeben werden soll:

    Header:

    //----------------------------------------------------------------------------
    #ifndef showParamH
    #define showParamH
    //----------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Windows.hpp>
    #include <Messages.hpp>
    #include <Classes.hpp>
    #include <Graphics.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <ExtCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    //----------------------------------------------------------------------------
    class Tfrm_showParam : public TForm
    {
    __published:
            TButton *cmd_ok;
            TTreeView *tv_params;
            void __fastcall FormShow(TObject *Sender);
    private:
            int paramsatz;
    public:
    	virtual __fastcall Tfrm_showParam(TComponent *Owner);
            void set_paramsatz(int p){paramsatz = p;}
    };
    //----------------------------------------------------------------------------
    extern Tfrm_showParam *frm_showParam;
    //----------------------------------------------------------------------------
    #endif
    

    cpp:

    //----------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "showParam.h"
    //----------------------------------------------------------------------------
    #pragma resource "*.dfm"
    Tfrm_showParam *frm_showParam;
    //----------------------------------------------------------------------------
    __fastcall Tfrm_showParam::Tfrm_showParam(TComponent *Owner)
    	: TForm(Owner)
    {
    }
    //----------------------------------------------------------------------------
    
    void __fastcall Tfrm_showParam::FormShow(TObject *Sender)
    {
            switch(paramsatz)
            {
                    ...
            }
    }
    

    Und so versuche ich darauf zuzugreifen:

    Tfrm_showParam *b = new Tfrm_showParam(NULL);
           b->set_paramsatz(0);
           b->Show();
    

    Da bekomme ich jetzt immer bei der Zeile mit dem new ein EAccessViolation.
    Ich versteh das nicht und komme da nicht hinter...



  • re

    warum ist dein konstruktor 'virtual' ??
    tu das mal weg.

    Edit: ist das eine MDI anwendung ?

    Meep Meep



  • Das virtual hat mir Borland da hin gemacht. Habe das jetzt wreg gemacht. Läuft aber immer noch nicht.
    Ich habe das Projekt erzeugt, mit Neu->Anwendung Also keine MDI-Anwendung, oder doch???

    MfG
    Muecke



  • re

    akari schrieb:

    Hallo

    offenbar ist die Klasse zweitor nicht von TComponent abgeleitet, deshalb kannst du nicht als this übergeben. Du kannst aber auch einfach NULL übergeben

    void zweitor::show_Y()
    {
      Tfrm_showParam *b = new Tfrm_showParam(NULL,0);
      b->ShowModal();
      delete b;
    }
    

    das gilt halt nur solange du kein ShowModal() aufrufst, oder die form sonstig von einer parent-form abhaengig ist, bzw diese braucht. kannn auch von den objekten abhaengig sein, die du auf deiner form hast.
    ich kann mich grad nicht erinnern, das ich fuer den konstruktor einer form jemals '0' uebergeben haette, deshalb weiß ich das jetzt nicht wie das sich auswirkt.
    vielleicht kann sowas auch schon vom objektinspektor kommen, wenn man z.B. fuer schirften oder so, den parent als quelle benutzt.

    folgendes sollte auf jeden fall richtig sein:

    Tfrm_showParam *b = new Tfrm_showParam(this); // hier wird der parent gesetzt
           b->set_paramsatz(0);
           b->Show();
    

    vielleicht bringt es auch etwas wenn du den bcb schliesst und das projekt bereinigst (.tds;.obj dateien loeschen). hat bei mir auch schon wunder gewirkt.

    Meep Meep



  • Hallo

    @ Meep Meep : Schau dir doch mal die Fehlermeldung nochmal an

    Fehler: E2285 Keine Übereinstimmung für 'Tfrm_showParam::Tfrm_showParam(zweitor* const,int)' gefunden.

    Dieser Fehler kommt in einer Methode von zweitor.
    Da der zweite Parameter eindeutig int ist, ist also der erste falsch.
    Das bedeutet das zweitor nicht von TComponent abgeleitet ist. Deshalb kommt der Compilerfehler, den als Parameter für Owner muß eine Instanz der Klasse TComponent übergebem werden.
    Das mit dem NULL nun zur Laufzeit eine Exception kommt, hat ganz andere Ursachen.
    Und ShowModal ist es grundsätzlich egal, ob Owner NULL ist oder nicht.

    Desweiteren ist Owner != Parent. Wenn also wirklich ein Owner-Objekt übergeben werden soll, muß die Klasse zweitor ein solches bereitstellen. Aber in diesem Fall sollte das nicht nötig sein.

    bis bald
    akari



  • hoi akari

    das mit dem zweitor hab ich schon gesehen gehabt. aber bei dem geposteten source von Muecke, (ganz oben auf Seite 2) sieht man eindeutig das 'Tfrm_showParam' von TForm abgeleitet ist und darauf bezog sich mein letztes posting. bin mal davon ausgegangen, das er in seinem source wieder einiges geaendert hatte.
    bei seinem ersten source-posting hatte der konstruktor in der header auch noch kein 'virtual' davor. davon abgesehen haben wir auch noch keinen quellcode von zweitor gesehen. oder hab ich ihn uebersehen?

    Meep Meep



  • Hallo

    rede ich eingentlich mit einer Wand? Es geht nicht darum das Tfrm_showParam von TForm abgeleitet ist. Das habe ich nie angezweifelt.
    Sondern es geht darum

    akari schrieb:

    das zweitor nicht von TComponent abgeleitet ist

    Deshalb kannn aus einer Methode von zweitor aus this nicht an eine Funktion oder Konstruktor übergeben werden, die als Paremeter ein TComponent erwartet.

    bis bald
    akari



  • ah jetzt hats geklickt. jetzt weiß ich was du meintest. hatte den text falsch interpretiert.

    Meep Meep


Log in to reply