none
Globale Klasse RRS feed

  • Frage

  • Hallo zusammen,

    war nicht ganz einfach das neue Forum zu finden. Ich hatte zuerst noch bei den "alten" newsgroups geschaut.

    Die letzte Programmierung liegt schon ganz viele Monate zurück.

    Mein Problem:

    Ich habe zwei Formulare entworfen. In Form1 habe ich eine Klasse eingefügt.

    public ref class Form1 : public System::Windows::Forms::Form
    {
    static BETON	^beton   = gcnew BETON();
    usw.

    Form2 wird von Form1 aufgerufen.

    Wie kann ich jetzt in Form2 auf den Daten der Klasse beton in Form1 zugreifen ?

    Grüsse

    Carsten

     

     

    Donnerstag, 20. Oktober 2011 11:13

Antworten

Alle Antworten

  • Übergib das Handle an das zweite Form....


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 20. Oktober 2011 11:25
    Moderator
  • Hallo Martin,

    das klingt einfach.  Nur wie ?

    Aus Form1 rufe ich Form2 auf.

    System::Void dehnungToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
    	MessageBox::Show("mal schauen 2");
    	eingabedaten(this);
    	form_2->ShowDialog();
    }

    In Form2 drücke ich einen Button

    System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        MessageBox::Show("jetzt kann gerechnet werden");
        listBox1->Items->Add( "test test" );
    
        double x;
        x = beton->alpha;
    }
    


    Wie und wo muss ich Handle ( Form1 oder Beton ???) an Form 2 übergeben,

    damit ich an der Wert beton->alpha heran komme ?

    Grüsse

    Carsten

    Donnerstag, 20. Oktober 2011 12:22
  • Erzeuge einen member in Form2 und übergib das Objekt an dieses...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 20. Oktober 2011 12:56
    Moderator
  • Verstehe heute nur Bahnhof. Sorry.

    Ein einzelner Member ist nicht das Problem.

    Ich benötige in Form2 die Klasse beton, welche in Form1 definiert ist.

    Ich mache jetzt mal eine kurze Frischluftpause. Vielleicht hilft es.

     

    Donnerstag, 20. Oktober 2011 14:48
  • Ja und!
    1. Du hast keine Klasse definiert sondern nur einen statischen Member:

    static BETON    ^beton;
    

    2. Da er statisch ist könntest Du wenn er public ist, direkt darauf zugreifen mit Form1::beton, und das geht eigentlich von überall.
    3. Was ich meine ist es einen Member BETON ^beton; in Klasse Form2 zu definieren und diesen auch zu füllen wenn Form1 es benötigt.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 21. Oktober 2011 05:34
    Moderator
  • Da hab ich auch lange gebraucht, bis das endlich funktionierte. Im Folgenden mal eine funktionierende Variante:

    //in Form2.h
    //1.Form1 referenzieren
    ref	class Form1; 
    public ref class Form2 : public System::Windows::Forms::Form
    	{
    	...
    //2. ein Objekt von Form1 in deiner Form2 erzeugen 
      public: Form1^ form1;
    	...
    	
    //3. einen Konstruktor von Form2 erstellen, der einen Verweis auf deine Form1 bekommt  
      Form2(Form1 ^_form1)
    	{
    		InitializeComponent();
    		form1 = _form1;
    		...
    //4. an beliebiger Stelle kann nun auf Form1 aus Form2 zugegriffen werden		
      IrgendEineFunktion()
      {
      form1->label1->Text = "Hallo";
      ...
      }
      
    //in Form1.h
    //5. Erstellen eines Objekts von Form2 in Form1.h
    ...  
      Form2 ^form2 = gcnew Form2(this);


    Zusätzlich habe ich noch die Standard-Header Datei aufgeteilt in *.h und *.c Teil (wie früher in C++ üblich). Kann sein dass du das auch machen musst, damit das funktioniert... aber probiere es erst einmal so.

    Falls jemand einen besseren Weg kennt, so nenne er/sie ihn bitte :)


    Freitag, 21. Oktober 2011 05:51
  • > Falls jemand einen besseren Weg kennt, so nenne er/sie ihn bitte :)

    Warum ein ganzes Form übergeben, wenn nur einige Daten übergeben werden müssen?

    Vom Kapselungsgedanken wird Form1 von Form1 abhängig, obwohl eigentlich nur einige Daten übergeben werden müssen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 21. Oktober 2011 06:48
    Moderator
  • Hallo,

    war eigentlich ganz einfach.

    In Form 1

    static BETON	^beton   = gcnew BETON();
    
    usw........
    
    
    private: System::Void spannungsDehnungslinieBild23ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { form_2->listBox1->Items->Clear(); form_2>mybeton = beton; form_2->ShowDialog(); }

    Nach dem in Form2 ein Button dedrückt wird, benötige ich Daten aus beton;

    In Form 2

    public:  BETON ^mybeton;

    usw ..................

    // ******************************** // *** Bild22 : Button "Berechnung" // ******************************** private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { mybeton->bild22(listBox1,textBox1->Text); } }

    Somit sind die Daten aus "beton" (aus Form1)  nach dem Drücken des Buttons in Form2 verfügbar.

    Das geht bestimmt viel schöner.

     

     

     

     

    Freitag, 21. Oktober 2011 12:51
  • > war eigentlich ganz einfach.

    Eben! Wie schrieb. Einfach das Handle übergeben und benutzen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 21. Oktober 2011 13:34
    Moderator