TabPages



  • Hallo Miteinander,

    Diese !!TabPages!! bringen mich noch unter den Boden! Mein Problem ist folgendes:

    Form1 = MDIContainer
    Form2 = MDIChild

    Wenn ich ein TabControl mit einer TabPage in Form1 deklariere und diese anschliessend der Form2 sende, werden diese auch wunderbar hinzugefügt und Form2 wird geladen.

    Problem:

    Wenn ich jetzt eine weitere TabPage hinzufügen möchte, wird entweder die Form2 ein 2. Mal angezeigt, oder die TabPage2 wird nicht sichtbar hinzugefügt.

    ich probierte es mit TabControl->Update();
    oder TabControl->Refresh();

    Es gibt mir dann nur ein Flackern zurück, aber keine 2. TabPage!

    Wie muss ich dieses wohl anstellen, damit auch wenn die Form2 bereits angezeigt wird, eine 2. TabPage hinzugefügt werden kann?

    Mein Code in Form1:

    Form2^ to = gcnew Form2();
    to->MdiParent = this;
    to->Show();
    
    if(dlgNeu->lblIndex->Text->Equals("7"))
    {
    if(this->lbl1->Text->Equals("0"))
    {					
    kla^ oe = gcnew kla();
    oe->tabPage7->Text = dlgNeu->txt1->Text->ToString();
    to->tabControl->TabPages->Add(oe->tabPage7);
    }
    if(this->lbl1->Text->Equals("1"))
    {
    kla^ oe1 = gcnew kla();
    oe1->tabPage7->Text = dlgNeu->txt1->Text->ToString();
    to->tabControl->TabPages->Add(oe1->tabPage7);
    }
    
    }
    

    Danke für Eure Hilfe schon im Voraus 🙂

    Gruss Phil74



  • Wen Dein Codeausschnitt jedesmal exakt so ausgeführt wird wie Du zeigst, ist das verhalten richtig. Du legst die Form immer wieder an.



  • Wo im Code wird mittgeteilt, dass er die 2. Form jedesmal neu laden soll?

    Wie kann ich dies umgehen?

    Gruss und Danke für Deine wertvolle Antwort 🙂



  • Form2^ to = gcnew Form2();
    

    Ganz einfach: Nur einmal aufrufen.



  • Kurz:

    diese Steuerung wird von Form1 über eine Form3 und Form2 ausgeführt.

    Vor meinem Codeauschnitt habe ich folgende CodeZeilen:

    if(dlgNeu->DialogResult == ::DialogResult::OK)
    {
    Bla bla;
    
    Form2^ to = gcnew Form2();
    to->MdiParent = this;
    to->Show();
    
    if(dlgNeu->lblIndex->Text->Equals("7"))
    {
    if(this->lbl1->Text->Equals("0"))
    {                    
    kla^ oe = gcnew kla();
    oe->tabPage7->Text = dlgNeu->txt1->Text->ToString();
    to->tabControl->TabPages->Add(oe->tabPage7);
    }
    if(this->lbl1->Text->Equals("1"))
    {
    kla^ oe1 = gcnew kla();
    oe1->tabPage7->Text = dlgNeu->txt1->Text->ToString();
    to->tabControl->TabPages->Add(oe1->tabPage7);
    }
    
    }
    

    Wie soll ich dieses Problem am besten umgehen? Meiner Ansicht nach muss ich ja mitteilen, was nach "dlgNeu->DialogResult == ::DialogResult::OK" passieren muss. D.h. ich muss der beim ersten ::DialogResult::OK die Form2 Laden. Beim 2. Klick auf ::DialogResult::OK soll lediglich eine weitere TabPage hinzugefügt werden.

    Wie kann ich abrufen, ob die Form2 schon angezeigt wird?

    Vielleicht steckt ja das Problem da?

    Danke für Deine Antwort



  • Eine Möglichkeit von mehreren:

    Mach das to zu einem Member der Klasse in der Du die Methode geschrieben hast.
    Setze to auf null und prüfe beim 2. Klick auf != nullptr.

    if(to == nullptr)
    {
       to = gcnew Form2();
       to->MdiParent = this;
       to->Show();
    }
    
    if(dlgNeu->DialogResult != ::DialogResult::OK)
    		return;
    
    	Bla bla;
    
    	if(to == nullptr)
    	{
    		Form2^ to = gcnew Form2();
    		to->MdiParent = this;
    		to->Show();
    	}   
    
    	if(!dlgNeu->lblIndex->Text->Equals("7"))
    		return;
    
    	if(this->lbl1->Text->Equals("0") || this->lbl1->Text->Equals("1"))
    	{                    
    		kla^ oe = gcnew kla();
    		oe->tabPage7->Text = dlgNeu->txt1->Text->ToString();
    		to->tabControl->TabPages->Add(oe->tabPage7);
    	}
    


  • Was bedeutet "!dlgNeu" und "nullptr" ?

    Die Form2 wird so nie angezeigt 🙄

    Dieser Codeausschnitt ist bei mir in Form1; dlgNeu ist Form3, bei der ich Einstellungen vornehmen kann und Form2 ist das MDIChild für MDIContainer(Form1)

    Gruss



  • ! ist eine Negierung des Ergebnisses von Equal.
    (Siehe C++ Operatoren)

    nullptr ist ein Zeiger mit dem Wert null (übertragen).

    Entspricht in Deinem C++ Lehrbuch einem

    zeiger == NULL;

    Der Code soll primär zeigen wie Du die Form abfragst, das andere ist ein Vorschlag wie man ein wenig von den verschachtelten Ifs wegkommt. Konzentriere Dich darauf nicht zu sehr, Dein Problem war ja die zweite Form.



  • Wenn ich richtig verstehe, könnte man ja auch die Abfrage, ob das Form angezeigt wird mit if(to) abfragen oder if(!to) ?



  • Damit kannst Du abfragen ob die Variable to einen Wert hat. Nicht ob eine Form angezeigt wird. to ist eine Instanz vom Typ Form2 - es kann noch weitere Instanzen von Form2 geben.

    Im C# Forum wurde mal Quellcode für das abfragen von "Form vom Typ x bereits geöffnet" . (Du könntest z.B. alle Childs durchgehen und den Typ prüfen. Ob das Sinnvoll ist kannst nur Du entscheiden.)



  • Die Abfrage if(to == nullptr) bedeutet, dass to NICHT angezeigt wird ? Ich übergebe ihr ja den Null-Wert !?



  • Bitte nimm Dir ein Grundlagenbuch und lies Dich im Thema Zeiger ein.


Anmelden zum Antworten