Steuerelemente wie Felder???



  • dritte Möglichkeit:

    Die Steuerelementfelder aus VisualBasic Uhrzeiten benutzen.
    Diese sind in der Assembly Microsoft.VisualBasic.Compatibility bzw.
    im Namespace Microsoft.VisualBasic.Compatibility.VB6.



  • Wie funktioniert denn die Möglichkeit 1 und 2 denn genau?

    Hab zwar danach gegoogelt aber leider keine Antwort darauf bekommen!!!



  • Zweite Möglichkeit:
    Du gehst alle Controls eines Container-Controls durch

    (for each Schleife)

    und schaust ob es das passende Control ist.

    (if...)

    😃



  • Varinate 2:

    void GetAllCheckBoxes()
    {
      System::Collections::Generic::List<CheckBox^> checkBoxes;
      RecurseControls(this, %checkBoxes);
    
      System::Text::StringBuilder sb;
      for each(CheckBox ^cb in checkBoxes)
      {
        sb.Append(cb->Name);
        sb.Append("\r\n");
      }
      MessageBox::Show(sb.ToString());
    }
    
    void RecurseControls(System::Windows::Forms::Control ^ctrl, System::Collections::Generic::List<CheckBox^> ^list)
    {
      for each(Control ^c in ctrl->Controls)
      {
        CheckBox^ cb = dynamic_cast<CheckBox^>(c);
        if (cb != nullptr)
          list->Add(cb);
        else
        {
          if (c->Controls->Count > 0) RecurseControls(c, list);
        }
      }
    }
    

    Aber Achtung: In dieser Version findest Du *alle* CheckBoxen! Auch welche von irgendwelchen untergeordneten Controls! Wenn Du keine Rekursion willst, dann musst Du diese rausnehmen!



  • Danke schön!

    Aber wie kann ich denn jetzt die Checkboxes einzeln verwalten?

    Ich will halt nicht allen Checkboxes (in meinem Fall PictureBoxes) das gleiche Zuweisen, sondern zum Beispiel:

    char Feld[3];

    Feld[0].Text = "Hallo"
    Feld[1].Text = "Welt"
    Feld[2].Text = "!!!"

    CheckBox1.Text = Feld[0].Text
    CheckBox2.Text = Feld[1].Text
    CheckBox3.Text = Feld[2].Text

    Und genau diese Anweisungen will ich über eine Schleife automatisieren!

    PS: Ich will Blackjack und hab eine Liste aus Zeigern, die die ganzen Karten beinhalten und will halt immer das oberste Element dann der nächsten Picturebox zuweisen!
    Da ich 22 PictureBoxen habe ist das einfach zu viel Code und zu unübersichtlich!



  • for (int=0; i<3; i++)
    {
      checkBoxes[i].Text = Feld[i].Text;
    }
    


  • Aber dafür brauch ich doch noch den Code dazu, den du vorher gepostet hast, oder?

    Hab jetzt noch ein Problem:

    Ich habe ein Steuerelement in der Form1.h als public definiert, aber hab irgendwie keinen Zugriff darauf in einer cpp:

    Das Steurelement "Text1" ist ein Textfeld und als public definiert

    void test()
    {
        Text1->Text = "Hallo Welt";
    }
    

    Da kommt aber immer eine Fehlermeldung, dass links von "->" ein Zeiger usw stehen müsste...

    Wie bekomme ich denn auf die Eigenschaften zugriff?



  • Noch eine kleine Frage:

    Wie kann ich die Variable checkBoxes global definieren, so dass ich in jeder Funktion auf die Variable zugriff habe?



  • Globale Variablen sind ein Relikt aus prozeduralen Zeiten. In OO-Zeiten gibt es sowas nicht mehr.



  • Und wie kann ich dann extern auf die Steuerelemente in der Klasse zugreifen?

    Kann ich eigentlich auch über die Ressourcen-IDs der einzelnen Steuerelemente auf die Eigenschaften zugreifen?
    Wenn ja wie und wie kann ich die Ressourcen-IDs festlegen?



  • Warum willst Du von Extern darafu zugreifen? Was ist der "auslöser" dass Du dies tun wills?
    Arbeite doch mit Events/Delegates und übergib das Control, welcher Du dann extern benötigst. Oder gibt dem externen ein Verweis auf das Form, welches dann bestimmte public-Methoden hat, die auch von extern aufgerufen werden können.



  • Ich bin ein absoluter Anfänger auf dem Gebiet der C++ Programmierung und bin es gewöhnt in .cpps zu programmieren!

    Aber ich würde gern die Felder, die die Steuerelemente beinhalten, als public definieren, so dass ich in jeder anderen Funktion innerhalb der Form1. darauf zugreifen kann! Wie geht das?



  • Innerhalb der Form1 kannst Du doch überall auf alles zugreifen! Was geht denn nicht?
    Du musst nur eine *Member-Funktion* haben!

    Also

    ref class Form1 : Form
    {
      void Test()
      {
        // Dies ist eine Member-Funktion und kann auf alles in der Form1-Klasse zugreifen...
      }
    };
    


  • Das heißt auch auf die Felder, die mit den Eigenschaften der Steuerelemente belegt werden?

    Kann ich dann auch meine Funktion Test als Member der Klasse zuweisen und dann in einer cpp auf alles was in der Form1 steht zugreifen?



  • Thorsten2605 schrieb:

    Das heißt auch auf die Felder, die mit den Eigenschaften der Steuerelemente belegt werden?

    Kann ich dann auch meine Funktion Test als Member der Klasse zuweisen und dann in einer cpp auf alles was in der Form1 steht zugreifen?

    Was? (jaja, wie bitte... blabla )

    Es geht hier um nichts besonderes. Alles, was in der Klasse public ist kann auch von nicht-Klassemitgliedern angesprochen werden, alles, was private ist nicht.
    Es ist scheiß egal, ob es ein int ist oder ein Verweiß auf etwas, was ein Stuerelement ist.

    ref class Foo {
    public:
       Steuerelement ^ xyz;
    
    private:
       Steuerelement ^ abc;
    
    };
    
    // andere.cpp
    
    void funktion()
    {
       Foo ^ foo = gcnew Foo();
       foo->xyz->ToString() ; // OK, xyz ist öffentlich
       foo->abc->ToString() ; // Fehler, abc ist privat
    }
    

    Natürlich solltest du niemals die Steuerelemente selbst veröffentlichen. Statdessen baust du dir eine öffentliche Schnittstelle, die die gewünschte Funktionalität bereitstellt:

    ref class Form1 : System::Windows::Forms::Form
    {
    public:
    
       void changeLableText(String ^ newText)
       {
          labelFoo->Text = newText;  
       }
    
    private:
       System::Windows::Forms::Label^  labelFoo;
    };
    
    // andere.cpp
    
    void whatever ()
    {
        Form1 ^ eineForm = gcnew From1();
    
        eineForm->ShowDialog();
    
        eineForm->changeLableText(L"neuerText");
    }
    


  • Das veröffentlichen von Steuerelementen ist bei mir auch gar nicht möglich?!?

    Zumindest kann ich wenn ich es public mache nicht von einer .cpp-Datei darauf zugreifen:

    Habe es so probiert:

    PictureBox1->Image = ...
    Form1::PictureBox1->Image = ...
    Form1->PictureBox1->Image = ...

    Aber er nimmt mir dann nichts an!



  • Thorsten2605 schrieb:

    Das veröffentlichen von Steuerelementen ist bei mir auch gar nicht möglich?!?

    Zumindest kann ich wenn ich es public mache nicht von einer .cpp-Datei darauf zugreifen:

    Habe es so probiert:

    PictureBox1->Image = ...
    Form1::PictureBox1->Image = ...
    Form1->PictureBox1->Image = ...

    Aber er nimmt mir dann nichts an!

    Du hast ja auch gar kein Objekt!

    Form1 ist kein Fenster. Form1 ist die Beschreibung eines Fensters.

    Gib deiner Form mal einen Button. In den OnClickHndler schreibst du folgenden Code:

    Form1 ^ tmp = gcnew Form1();
    tmp->ShowDialog();
    

    Was passiert? Wir erstellen eine weitere Instanz von "Form1" und lassen sie darstellen. Und zack ist das fenster zwei mal da. In diesem Fenster kannst du wieder auf den Button klicken un bekommst noch eins. Und dort nochmal und so kannst du dann unendlich viele Instanzen von Form1 erzeugen.

    Du machst jetzt aber folgendes: du hast gar keine Instanz. Nicht eine einzige. Und dennoch veruschst du irgendwie etwas mit einer Instanz zu machen (nämlich auf darin enthalltene Steuerelemente zuzugreifen). Das kann doch gar nciht gehen.
    Das hat auch nichts mit öffentlich oder nicht öffentlich zu tun.

    Falls das unverständlich war hier das, was du gerade machst mal extrem versimpelt.

    class Foo {
    public:
       int bar;
    };
    
    int main() 
    {
       Foo::bar = 42;  // Fehler
       Foo->bar = 42;  // Fehler
    }
    

    Dein Kommentar zu dem Fehler ist, dass der Compiler dich ints nicht veröffentlichen lässt (ist natürlich Quatsch).

    Du brauchst eben eine Instanz.

    class Foo {
    public:
       int bar;
    };
    
    int main() 
    {
       Foo foo;
       foo.bar = 42;  // Ah :)
    }
    


  • Du solltest auch zuerst mal eine Instanz anlegen, bevor Du auf irgedendwelche (nicht statischen) Member zugreifen kannst...

    C++/CLI:

    ref class Foo {
    public:
       int bar;
    };
    
    int main() 
    {
      Foo ^f = gcnew Foo();
      f->bar = 42;
    }
    

    C++:

    class Foo {
    public:
       int bar;
    };
    
    int main() 
    {
      Foo *f = new Foo();
      f->bar = 42;
    }
    


  • Danke schön!

    Und auch Danke für eure Geduld!

    Hatte bisher nur die DOS-Programmierung in meinem Studium, aber wollte schon immer in Windows programmieren!

    Gibt es vielleicht ein gutes Buch gerade über die Programmierung mit Windows-Forms unter c++ .net?

    Aber bitte eins auf Deutsch *g*


Anmelden zum Antworten