Variable/Array an andere Form übergeben



  • hallo,
    ich bin nicht wirklich ein programmierer, deswegen sorry für die vielleicht ungeschickte frage....

    und zwar will ich bei borland von der einen Form Variablen bzw. Arrays an eine andere Form übergeben......
    jetzt hab ich hier im forum gesucht und das gefunden:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39242.html

    schön, aber wenn ich das so wie ich es mag abaendere geht nichts...
    schaut mal her:

    // die UNIT1.cpp file
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    int x[4];   // hier der Array den ich übergeben will
    
    x[0] = 1;
    x[1] = 2;
    x[2] = 3;
    x[3] = 4;
    }
    //---------------------------------------------------------------------------
    

    so hier dazu die headder file........

    // hier die UNIT1.h file
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            TButton *Button1;
            void __fastcall Button1Click(TObject *Sender);
    private:	// User declarations
      int x[4];
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    und von der form 2:

    // hier die Form2.cpp
    
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
            : TForm(Owner)
    {
    Form2->Label1->Text = IntToStr(x[2]);
    }
    

    und zum schluss:

    //hier die Unit2.h File
    
    //---------------------------------------------------------------------------
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm2 : public TForm
    {
    __published:	// IDE-managed Components
            TLabel *Label1;
    private:	// User declarations
    public:		// User declarations
            __fastcall TForm2(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm2 *Form2;
    //---------------------------------------------------------------------------
    #endif
    

    das leichteste beispiel das es gibt wahrscheinlich.....
    trotzdem, wenn das jemand wüßte waers auf jeden fall sehr cool.....

    danke schonmal

    tommes



  • Punkt 1: Du weißt aber schon dass dein Array im Konstruktor (Zeile 15 Unit1.cpp) nicht dasselbe ist wie in deiner Klasse (Zeile 17 Unit1.h), oder?

    Punkt 2: Außerdem hast du das in der Klasse in private gesetzt und kannst dann nicht von anderen Klassen darauf zugreifen.

    Punkt 3: du brauchst in Form2 nicht den Formularnamen verwenden um auf Elemente zuzugreifen:

    Label1->Text = IntToStr(x[2]);
    //statt
    Form2->Label1->Text = IntToStr(x[2]);
    

    Punkt 4: den Beitrag aus den FAQ hast du anscheinend auch nicht richtig gelesen oder verstanden: der Zugriff auf Form2 erfolgt hier von Form1 aus, wenn du aus deinem Form2 auf Form1 zugreifen möchtest geht das so:

    Label1->Text = IntToStr(Form1->x[2]);
    

    wobei hier wieder Punkt 2 zu beachten ist

    Punkt 5: die Zuweisungen erfolgen alle im Konstruktor, was heißt, dass dein Form1 auf jeden Fall vor Form2 erstellt werden muß, da es sonst eh eine Zugriffsverletzung gibt



  • hi,

    merci erstmal.........

    das hilf schon ein bisschen.....aber so ganz check ichs immer noch net....

    das großte Fragezeichen bezieht sich auf Punkt 1:

    warum ist das nicht das selbe ???????

    Punkt1:

    da steht doch beidesmal das:

    int x[4];
    

    verwirrt mich schon sehr........einmal wird dem array halt noch werte

    zugewießen....... sonst ists meiner meinung nach das gleiche....

    Aber wie gesagt....ich bin maschinenbauer, kein programmierer......

    Punkt2
    wo soll ich es sonst hinschreiben damit x[4] in Form2 bekannt ist ???????

    Punkt3
    Ok, stimmt......

    Punkt4
    Wenn ich so auf x[4] zugreifen koennte wär das ok, am besten wäre allerdings

    wenn ich ganz klassich mit

    x[1] = 3;
    //statt
    Form1->x[1] = 3;
    

    zugreifen könnte......

    Punkt4

    Die Reihenfolge ist garantiert....Form1 ist IMMER vor Form2......

    Also zusammenfassend: Was muss ich ändern damit in der Form2 mein Array bekannt ist??????????????

    besten Dank soweit.....

    tommes



  • tommes13 schrieb:

    das großte Fragezeichen bezieht sich auf Punkt 1:

    warum ist das nicht das selbe ???????

    Punkt1:

    da steht doch beidesmal das:

    int x[4];
    

    verwirrt mich schon sehr........einmal wird dem array halt noch werte

    zugewießen

    Ja, das ist das Problem, da steht beides Mal das gleiche. Einmal definierst Du im Header ein Array namens x und im Konstruktor nochmal. Das führt dazu, dass im Konstruktor nur die das lokale Array sichtbar ist und nicht das aus dem Header. Das Array, dem Du die Werte zuweist existiert nur im Konstruktor. Sobald der Konstruktor verlassen wird, wird dieses Array automatisch gelöscht.

    tommes13 schrieb:

    Punkt2
    wo soll ich es sonst hinschreiben damit x[4] in Form2 bekannt ist ???????

    private = privat = nur innerhalb der Klasse ansprechbar
    public = öffentlich = auch ausserhalb der Klasse ansprechbar

    Das sind allerdings grundlegende Dinge, die man beherrschen sollte, bevor man sich mit der GUI-Programmierung auseinander setzt. Maschinenbauer hin oder her, um die Grundlagen wirst Du nicht herum kommen. 😉



  • ok,

    hahah das zwischen public und privat...... da hätte man ja selber auch drauf kommen koennen.....

    auf jedenfall danke für deine hilfe.....das passt/funktioniert soweit.......

    werd mich wohl NOCH gründlicher damit auseinandersetzen müssen....

    also weiter so ! 👍 👍 👍 👍 👍

    mfg tommes



  • Ich würde mich da auch noch mit einer Frage anschließen......

    Dazu aber besser ein Bsp.....

    Ich frage auf einer Auswahlseite ab (per RadioBox) was der User wünscht.....
    Die Wünsche werden in einem Array gespeichert....
    Wenn der User sich dann entschieden hat gehts per "Weiter-Button" auf die eigentliche Form wo die Berechnungen statt finden.....
    So, kann ich dann die gewählten Zustände auf der Auswahlseite genau einer bestimmten "Form" weitergeben/übergeben......???????

    Alternativ könnte das auch über eine .txt Seite geschehen.....
    Nur so wärs halt irgendwie eleganter finde ich...
    Was ich halt NICHT möchte ist, diesen Array in dem Headder der Haupt Form zu definieren weil ich da nicht viele "globale Arrays" haben möchte....

    Danke schonmal für Antworten....



  • 1. Wieso speicherst du sie in einem Array ? Ist eigentlich gar nicht nötig.
    benutz am besten eine Radio Group und lese den Index aus.
    diesen Schreibst in ein Label und liest das aus.

    Oder Alternativ ginge eine Funktion in der FormX.h (X ist eine Zahl)

    header und public:

    int GetRadioIndex();
    

    cpp

    int Form2::GetRadioIndex()
    {
        return RadioGroup1->ItemIndex;
    }
    

    diese rufst du auf:

    int i = Form2->GetRadioIndex(); // darauf kannst du mit if reagieren
    

    oder was meinst du, hab ich dich falsch verstanden ?


Anmelden zum Antworten