[vc++ 2005]

the incredible Leitman

Erfahrenes Mitglied
Hallo erstmal liebe Tutorials.de user ^^

Ich bins mal wieder, bei einem Problem mit meiner Multi TabControl Form ;(
Hoffe jemand von euch hat Zeit um mir da etwas weiter zuhelfen

Also,
eine Form, die wenn sie startet die Anzahl der am System angeschlossenen Bildschirme ermittelt und dann genausoviele TabControls erstellt und auf die Form added

Jedes dieser TabControls hat 12 Page,

auf der ersten Page sind einige Button...

Die Erstellung und Positionierung gelingt mir bereits,
aber jetzt möchte ich, diesen Buttons Aktionen zuweisen, also das Click Event handlen

prinzipiell mache ich das folgendermaßen:
C++:
//
// Pseudocode
//
...
array<tabControls ^ > ^tabControls;
array<tabPages ^ > ^tabPages;
Button ^button;
...
this->m_tabControls = gcnew array<System::Windows::Forms::TabControl ^>(Screen::AllScreens->Length);

for each(TabControl ^tabCtrl in this->tabControls)
{  
    tabCtrl = gcnew array<System::Windows::Forms::TabPage ^>(12);

    for each(TabPage ^tabPg in this->tabPages)
    {
        tabPg = gcnew System::Windows::Forms::TabPage();
        createStatusschirm(tabPg);
    }
}
    
void createStatusschirm(TabPage ^ tabpage)
{
    this->button = gcnew Button();
    this->button->Click += gcnew System::EventHandler(this, &ZLSClient::ZLSClientApplication::StatusschirmButton_Click);
    tabpage->Controls->Add(this->button);
}

void StatusschirmButton_Click(System::Object^  sender, System::EventArgs^  e) 
{
   MessageBox::Show(" Button clicked ");
}
prizipell halt so... ^^

Naja, mein Problem ist jetzt, dass ich nur, wenn ich auf dem letzten TabControl den Button klicke, eine Meldung erscheint :(

Scheinbar wird die Abonnierung des Events überschrieben und somit gilt nur der letzte Button... aber wie kann ich das übergehen? / anders lösen?

bitte Hilfe ^^
 
Würde ich auch behaupten.
Du hast als Member nur einen Button. Den instanzierst du zwar x-mal und fügst ihn deiner Form hinzu, bringt dir aber nix, da er als Member nur ein mal vorhanden ist. Du brauchst also für jeden Button einen Member oder alternativ wie von Cosmo vorgeschlagen:
in der Methode "createStatusshirm"
C++:
Button^ btt = gcnew Button();
ausführen.
 
*lol* :D

Danke erstmal ^^ kurz, pregnant und precise *gg*

aber wo soll ich einen Button deklarieren und gleich initialisieren?
direkt in den TabPages?
Oder ganz am Anfang in ner Init Methode?

EDIT:
Ach du Shice bin ich doof :(
*Kopfgreif*
C++:
void createStatusschirm(TabPage ^ tabpage)
{
    Button ^button = gcnew Button();
    button->Click += gcnew System::EventHandler(this, &StatusschirmButton_Click);
    tabpage->Controls->Add(button);
}

hm.... keine Ahnung, aber aus irgendeinem Grund hab ich das extra so verschachtelt gemacht und nicht wie so (normal halt) deklariert...
Fällt mir nur grade nicht mehr ein ^^
war aber sicher kompletter Unfug XD *lol*

Gut... also so gehts... Danke wieder einmal Cosmo... mein Meister XD

Wenn ich nun aber mehr dieser Buttons habe,
also z.B. button1, button2, button3 usw... wie kann ich dann ne Unterscheidung dieser Knöpfe machen? Also wer das Event aktiviert hat?

zuerst konnte ichs so machen:
C++:
	if (sender == this->m_button1)
	{
		MessageBox::Show(" 1 ");
	}
	else if (sender == this->m_button2)
	{
		MessageBox::Show(" 2 ");
	}
usw...

(hm...vielleicht hab ichs ja deshalb in der anderen Weise gemacht o_O :confused:)

Aber wie regel ich das jetzt?

sender->ToString()

oder Typeid ne, damit kann ich doch nur den Typ überprüfen oder?

EDIT:
Auch danke Niggo ^^
 
Zuletzt bearbeitet:
In der Ereignisbehandlung den sender zu einem Button casten? Wenn der Button direkt auf der TabPage liegt kannst Control.Parent (button.Parent) verwenden. Ansonsten kannst die TabPage auch zu dem Control.Tag (button.Tag) Property hinzufügen, um den Button der entsprechenden TabPage zuordnen zu können. Wie Du willst. ;)
 
Danke, sehr hilfreich:

C++:
void StatusschirmButton_Click(System::Object^  sender, System::EventArgs^  e) 
{
	if (((System::Windows::Forms::Button ^)sender)->Name == "Betriebsende")
	{
		MessageBox::Show(" Betriebsende! ");
	}
	else if (((System::Windows::Forms::Button ^)sender)->Name == "Schichtwechsel")
	{
		MessageBox::Show(" Schichtwechsel! ");
	}
	...
}

so passts perfekt

Danke

HAKERL ,/
 
Was währe nun wenn das eine multilanguage App ist? ;)

//Edit: Hier hast mal ein Beispiel wie Du mittels einer Rekursion die TabPage des Controls herraus finden kannst:
C#:
TabPage findTabPage( Control control ) {
        if ( control.Parent is TabPage )
                return control.Parent;

        if ( control.Parent != null )
                return findTabPage( control.Parent );
        else
                return null;
}
 
Zuletzt bearbeitet:
Egal....den Namen vergebe ich doch oder?
könnte den Button auch Button1 nennen, nur so tue ich mir leichter

Und der Text ist eine andere Geschichte ^^
den kann ich zuweisen wie es grade gebraucht wird

ok, nein, wenn es mehrsprachig ist, muss ich das natürlich anders machen...
aber kP wie X-(
 
:D
Ach vergiss es. Ich habe warum auch immer Text anstatt Name gelesen. Aber mit der Funktion kannst trotzedem die TabPage herraus finden und musst nicht unsauber mit dem Namen hantieren. ;)
 
Zuletzt bearbeitet:
kk, thx :D

Das kann ich sicher noch mal brauchen...

habs in C++ Style umgeschrieben:
(da es in C++ keine is Anweisung gibt -.-
C++:
	TabPage ^ FindTabPage( Control ^control )
	{
		if (control->Parent->GetType() == TabPage::typeid)
		{
			return (TabPage ^ )control->Parent;
		}
		if (control->Parent != nullptr)
		{
			return FindTabPage(control->Parent);
		}
		else
		{
			return nullptr;
		}
	}
 

Neue Beiträge

Zurück