PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wxWidgets: Event eines Fensters in einer anderen Klasse registrieren



tommy@linux
11-10-2004, 12:28
Hallo,

ich habe 2 Klassen mit jeweils eigen verwalteten Events.
Ich möchte nun gerne den CLOSE-Event der einen FensterKlasse der anderen mitteilen, um damit gewisse Einstellungen zu speichern.
Hat jemand eine Idee?

Der Event ist der EVT_CLOSE, das Problem ist, das dieser jeweils als Listener im aktuellen Fenster hängt, und ich diesen Event von dem anderen Fesnter benötige.

KLasse 1




BEGIN_EVENT_TABLE(MyFrame, wxFrame)

//viele andere Events ....

/*********************************/
/* Attribute Settings Events */
/*********************************/
EVT_CLOSE( MyFrame::OnUpdateAttributes)

END_EVENT_TABLE()



Klasse 2



BEGIN_EVENT_TABLE( PrefAttribute, wxFrame)
EVT_BUTTON(ID_BUTTON_OK, PrefAttribute::OnButtonOk)
EVT_BUTTON(ID_BUTTON_CANCEL, PrefAttribute::OnButtonCancel)
END_EVENT_TABLE()


Also in der Klasse 1 möchte ich gerne den CLose-Event der Klasse 2 registrieren.

Stanislaus
11-10-2004, 13:46
Moin, moin!

Ich denke das wird so nicht funktionieren.
Das Problem ist ja, daß Klasse 1 evtl. Klasse 2 kennt aber damit noch lange nicht weiß welche Instanz von Klasse 2 angesprochen werden muss.
Dazu müsstest Du die Instanz von Klasse 2 an die Instanz von Klasse 1 übergeben und könntest dann auch gleich über eine platte public Funktion von Klasse 2 Deinen Aufruf machen.

Bis neulich ...

tommy@linux
12-10-2004, 11:32
Klasse 1, kennt die Instanz von Klasse 2.

Der Close_Event muss in der Klasse 2 registriert sein, also

Klasse 2



BEGIN_EVENT_TABLE( PrefAttribute, wxFrame)
EVT_CLOSE( PrefAttribute::OnWindowClose)
END_EVENT_TABLE()


In der Funktion von OnWindowClose() wollte ich einfach eine public Funktion, der Klasse 1 aufrufen. Das Problem besteht aber darin, das ich die Klasse 2 in der Klasse 1 include, da ich eine Instanz dort brauche. Um nun in der Klasse 2 eine public Methode der Klasse 1 aufzurufen, müsste ich diese auch wieder includen -> SO kommt es zum rekursiven Aufruf der Includierungen...

Vorschläge?

Stanislaus
15-10-2004, 18:15
...Das Problem besteht aber darin, das ich die Klasse 2 in der Klasse 1 include, da ich eine Instanz dort brauche.
Also sind 1 bis n Instanzen von Klasse 2 Member von Klasse 1?!


Um nun in der Klasse 2 eine public Methode der Klasse 1 aufzurufen, müsste ich diese auch wieder includen -> SO kommt es zum rekursiven Aufruf der Includierungen...
Übergib die Instanz der Klasse 1 beim erzeugen einer Instanz von Klasse 2 als Parent und ruf dann aus der Instanz von K 2 die gewünschte Funktion des parent auf.
Alternativ kannst Du eine CallBack Funktion bauen. Oder Du implementierst in K 2 eigene wxEvents (die nix anderes als Callback Funktionen sind), die von K 1 behandelt werden.
Wie man wxEvents implementiert ist in der Doku bestens beschrieben.

Bis neulich ...

tommy@linux
23-10-2004, 14:51
First.cpp
#include Second;

First.hpp
//forward declaration
class second;

class First
{
Second *second;
}

--------------------------------------------

Second.cpp
#include First;

Second.hpp
class First;
class Second
{
First *first;
}



Mit der Vorwärtsdeklaration funktioniert es... .