[VC++.NET] Werteübergabe in Parent / Owner

the incredible Leitman

Erfahrenes Mitglied
Hallo Leute ^^

Jetzt bin ich schon ziemlich lange alleine zurechtgekommen und mein Projekt wächst und gedeiht :D

Doch nun stehe ich wieder vor einem Problem, bei dem ich nicht weiß, wie ich es lösen kann :(

Also, ich habe eine Windows Form (ZLSClientApplication),
diese enthält einen Haufen TabControls inklusive TabPage.
Eine dieser Pages verfügt über ein Panel, in dem sich CustomControls befinden.
Ein Butten eines dieser Controls löst bei Click ein Event aus, das einen Dialog aufruft...

...hoffe, das war einigermaßen verständlich erklärt...

Nun möchte ich, wenn dieses Event ausgelöst wird, (also der Dialog geöffnet wird)
das gesamte TabPage inactive machen...

Dazu habe ich eine Methode geschrieben, die alle Controls in der Page deaktiviert...
Doch leider kann ich in einem Control nicht auf diese Funktion zugreifen...

Ich bäuchte also irgendetwas, womit ich in die übergeordneten Instanzen zugreifen könnte...

also von der Überlegung her wie folgt:
this->Parent oder this->Parentform oder this->Owner->IsActive(false)

vl zu näheren Erklärung: (in wirklich seeeeehr einfach gehaltenem Pseudocode)
C++:
namespace ZLSClient
{
    public ref class ZLSClientApplication : public System::Windows::Forms::Form
    {
        array<TabControl ^> ^m_tabControls;
        array<TabPages ^>  ^m_tabPages;

        m_tabControls = gcnew array<TabControl ^>(4);

        for (int i = 0; i <= m_tabControls->Length; ++i)
        {
            m_tabControls[i] = gcnew TabControl();

            m_tabPages = gcnew array<TabPage ^>(8);

            for (int ix = 0; ix <= m_tabPages->Length; ++ix)
            {
                m_tabPages[ix] = gcnew TabPage();

                switch(ix)
                {
                    case 0:
                        Statusschirm ^stat = gcnew Statusschirm();
                        this->m_tabPage[ix]->Controls->Add(Statusschirm);
                }
            }
        }
    };
}

Somit erstelle ich 4 TabControls mit jeweils 8 TabPages in denen sich in der ersten Page immer ein Statusschirm Control befindet..

weiter:
C++:
namespace ClientTabPages
{
    public ref class ClientTabPagesBase : public System::Windows::Forms::UserControl
    {
        public:
             property bool IsActive
             {
                 void set (bool i_value)
                 {
                      for each(Control ^ctrl in this->Controls)
                      {
                          ctrl->enabled = i_value;
                      }
                 }
             }
    }

    public ref class Statusschirm : public ClientTabPages::ClientTabPageBase
    {
         ButtonControl ^ctrl = gcnew ButtonControl();
         this->Controls->add(ctrl);
    }
}

Soweit sogut, nun habe ich den Statusschirm mit einem Custom Control, das wie folgt aussieht:

C++:
namespace UtilityControls
{
    public ref class ButtonControl : public System::Windows::Forms::UserControl
    {
        Button ^m_Button1;
        Button ^m_Button2;
        Button ^m_Button3;
        Button ^m_Button4;

        m_Button1->Click += gcnew System::EventHandler(this, &UtilityControls::ButtonControl::Button_click);

        void Button_Click(System::Object ^sender, System::EventArgs ^e)
        {
            Dialog1 ^dial = gcnew Dialog1();
            // Während dieser Dialog offen ist, soll die TabPage Inactiv sein
            // Aber ich kann:
            // ClientTabPages::ClientTabPagesBaseClass::IsActive = false 
            // nicht aufrufen, das sich ich den namespace nicht includieren kann
            // weil sich sonst eine ewige Dependency einstellen würde -.-
            dial->Show();
            // hier sollte die Tab Page wieder aktiv geschalten werden
        }
    }

    public ref class Dialog1
    {
        // blablabla
    }
}
Ich komm langsam nicht mehr zurecht,
vl auch, weil ich mich schon so darin verfangen hab, dass ich nicht mehr durchseh *lol*

Aber wie könnte ich mein Problem umgehen?

Also wegen der Abhängigkeiten wäre
ZLSClient::ZLSClientApplication abhängig von
ClientTabPages::Statusschirm, da ich ja die Controls brauche...
welcher wiederum Abhängigkeit von UtilityControls::ButtonControl hat
was die Klasse Dialog1 verwendet :-O

Aber (wie?) kann ich auf Properties oder Methoden zugreifen, die in einer oder mehreren übergeordneten Klassen in ganz anderen Namespaces sind? :confused:

Vielleicht ist das für euch nun richtig einfach und ich steh jetzt voll blöd da,
aber ich habe grade so echt meine Probleme mit dem Dateisystem von C++
das inkludieren von namespaces, Headern und cpp files, Aufrufen von Funktionen oder Properties in anderen Klassen in anderen Namespaces, über Projektgrenzen hinaus usw... :-O
Mein Kopf raucht schon, werde mal noch etwas googlen

hoffe vl kann mir in der Zwischenzeit jemand weiterhelfen...

nur ein bisschen ^^
Biiiiitte

thx
mfG

der Leitman
 
Deine Posts sind immer ewig lang und danach weiss ich von deinem Problem genauso viel wie vorher ...

Versuch doch mal eine konkrete Frage zu stellen in 2-3 Sätzen...

Du hast eine Form, darauf ist eine TabControl und auf dieser ein Button? Und wenn du den Button klickst, soll die untere Form inaktiv werden?

Wenn du die neue Form mit ShowDialog() öffnest ist sie das sowieso?
Oder du machst einfach VOR dem ShowDialog() ein "name".visible = false; ?

Versteh net ganz auf was du raus willst .... Geht aber wahrscheinlich nicht nur mir so.

PS: Unter Pseudocode versteht man KEINEN richtigen Code !
Pseude Code ähnelt viel eher:
"Wenn Buttonklick
Diese Form unsichtbar"
 
Deine Posts sind immer ewig lang und danach weiss ich von deinem Problem genauso viel wie vorher ...
-.- sry :(

Du hast eine Form, darauf ist eine TabControl und auf dieser ein Button? Und wenn du den Button klickst, soll die untere Form inaktiv werden?
naja, so ähnlich....
Das Problem ist nur, dass der Button die Form nicht kennt, weil eigene Klasse on überall verwendbar :(
Deshalb müsste ich z.B. das Property "Parent" verwenden...

Aber wenn ich versuche ein Property, dass ich selbst erstellt habe mittels Parent-> aufzurufen, wird es nicht erkannt, da ja kein member von Windows Forms ist...

Werde einfach das Enabled-Property missbrauchen ^^

PS: Unter Pseudocode versteht man KEINEN richtigen Code !
Pseude Code ähnelt viel eher:
"Wenn Buttonklick Diese Form unsichtbar"
Ich weiß, ich weiß... aber das ist mir so unsympathisch und erinnert mich immer an VB :(
Dann war das halt eben Pseudo-Pseudo-Code XD


EDIT:
Moment... habe noch eine Idee:

Wenn ich einfach den Parent caste o_O

also
C++:
Statusschirm ^stat = gcnew Statusschirm();
stat = (Statusschirm ^ )this->Parent;
So und nun kann ich auf alle Properties ohne Probleme zugreifen....

auf das hätte ich eigentlich kommen müssen :eek:
 
EDIT:
Moment... habe noch eine Idee:

Wenn ich einfach den Parent caste o_O

also
C++:
Statusschirm ^stat = gcnew Statusschirm();
stat = (Statusschirm ^ )this->Parent;
So und nun kann ich auf alle Properties ohne Probleme zugreifen....

auf das hätte ich eigentlich kommen müssen :eek:

richtig, hättest du ;)

Ist das Problem nun erledigt oder nicht? Wenn ja, dann bitte auf "Erledigt" setzen ;)
 
so fedisch... geht ^^

Und was ich da alles schon probiert habe.....tztztz....
C++:
if(this->Owner->Parrent->Parrent->Parrent != nulltptr && this->Owner->Parrent->Parrent->Parrent->GetType() == System::Windows::Forms::typeid)
war mein geilster Ansatz XD :suspekt:

und ich schäme mich dafür -.-

Aber passt0rt, jetzt weiß ich wies funktioniert...Memo an mich selbst "öfter mal ans casten denken"

Danke
Leitman
 

Neue Beiträge

Zurück