[wxMac] Problem mit wxGrid & wxStaticBoxSizer

der_Kay

der_Kay

Aktives Mitglied
Thread Starter
Dabei seit
02.09.2004
Beiträge
1.765
Reaktionspunkte
25
Hallo zusammen,

Ich habe ein ärgerliches Problem mit wxMac 2.6.2 (aus Darwin Ports): Wenn ich ein wxGrid in einen wxStaticBoxSizer einbette, hört das Grid auf, mit der Maus zu interagieren. Die Scrollbars scrollen nicht mehr und man kann keine Tabellenzellen mehr anklicken. Keyboard-Navigation/-Interaktion ist noch möglich.

Innerhalb "normaler" BoxSizer funktioniert alles wie gewohnt. Würde mich sehr freuen, wenn jemand versuchen könnte, das nachzuvollziehen und rückmeldet, ob das vielleicht mit anderen builds von wxWidgets auch passiert. Und vielleicht weiss auch jemand, ob und was ich verkehrt mache... ;)

Unten ist etwas Copy&Paste-fähiger Code, der den Fehler bei mir auslöst.


viele Grüße und Dank im voraus,

Kay

Code:
//
// file: strange.cpp 
// 
#include "wx/wx.h" 
#include <wx/grid.h> 

#define GRID_WINDOW_ID  200 

// 
// #define 1 for using wxStaticBoxSizer, 0 for using BoxSizer 
// 
#define USE_STATIC_BOX_SIZER_AND_GRID_IS_DEAD 1 

class StrangeFrame : public wxFrame 
{ 
public: 
    StrangeFrame( ) 
        : wxFrame ( (wxWindow*)NULL, wxID_ANY, wxT("strange...")) 
    { 
            wxGrid* grid = new wxGrid(this, GRID_WINDOW_ID); 

            grid->CreateGrid( 5, 5); 
                
            wxBoxSizer* mainsizer = new wxBoxSizer(wxVERTICAL); 
                
#if USE_STATIC_BOX_SIZER_AND_GRID_IS_DEAD               
            wxStaticBoxSizer* stboxsizer 
                    = new wxStaticBoxSizer ( wxVERTICAL, this, 
                                      wxT("this frame kills the grid")); 
                
            stboxsizer->Add ( grid, wxSizerFlags(1).Expand()); 

            mainsizer->Add ( stboxsizer, 
                        wxSizerFlags( 1 ).Expand().Border(wxALL, 3)); 
#else 
            mainsizer->Add ( grid, wxSizerFlags(1).Expand() ); 
#endif    
            SetSizer( mainsizer ); 
            SetAutoLayout( true ); 
    } 
}; 

class MyApp: public wxApp 
{ 
    bool OnInit() 
    { 
           StrangeFrame* frame = new StrangeFrame(); 
           frame->Show(  ); 
           SetTopWindow( frame ); 
           return true; 
    } 
}; 

IMPLEMENT_APP(MyApp)
 
Hi,

den Fehler sehe ich auch nicht, bei mir kommt das selbe Resultat. Ich hab's dann mal flott selbst geschrieben, und da geht's. Ist mit wxWidgets 2.6.3 auf Mac OS X 10.4 kompiliert, wxWidgets habe ich selbst kompiliert:

Code:
#include <wx/wx.h>
#include <wx/grid.h>

class myApp : public wxApp {

	public:
		bool OnInit();

};

class myFrame : public wxFrame {

	public:
		myFrame();
		
		wxPanel *pMain;
		wxBoxSizer *bsMain;
		wxStaticBox *sbMain;
		wxStaticBoxSizer *sbsMain;
		wxGrid *gContent;

};


IMPLEMENT_APP(myApp)

bool myApp::OnInit() {
	myFrame *frame = new myFrame;
	frame->Show();
	SetTopWindow(frame);

	return true;
}


myFrame::myFrame() : wxFrame(NULL, -1, _("Testgridanwendung")) {
	pMain = new wxPanel(this, -1);
	bsMain = new wxBoxSizer(wxVERTICAL);

	sbMain = new wxStaticBox(pMain, -1, _("Mein Grid"));
	sbsMain = new wxStaticBoxSizer(sbMain, wxVERTICAL);

	gContent = new wxGrid(pMain, -1);
	gContent->CreateGrid(10, 10);

	sbsMain->Add(gContent, 1, wxEXPAND | wxALL, 5);
	
	bsMain->Add(sbsMain, 1, wxEXPAND | wxALL, 15);

	pMain->SetSizer(bsMain);
	bsMain->SetSizeHints(this);
}

Vielleicht kannst du daraus deinen Fehler ersehen :) ...

Viele Grüße,

Morfio ...
 
Hi Morfio,

vielen Dank, dass Du Dir den Code angeschaut und eine Alternativlösung gecodet hast! Dank Deines zusätzlichen Codes habe ich ein verrücktes Phänomen ausgemacht: Das "Funktionieren" des Grids scheint davon abzuhängen, zu welchem Zeitpunkt der (wxStaticBox-)Sizer erzeugt wird, in den das Grid zu einem späteren Zeitpunkt(!) eingefügt wird. Einfaches vertauschen von Zeilen bewirkt/unterdrückt das Verhalten:

Sizer zuerst alloziieren, dann gehts:
Code:
sbsMain = new wxStaticBoxSizer(wxVERTICAL, pMain, _("Mein Grid"));

gContent = new wxGrid(pMain, -1);
gContent->CreateGrid(10, 10);

Grid zuerst alloziieren, dann gehts nicht:
Code:
gContent = new wxGrid(pMain, -1);
gContent->CreateGrid(10, 10);
	
sbsMain = new wxStaticBoxSizer(wxVERTICAL, pMain, _("Mein Grid"));

Ich habe den verkürzten Konstruktor für wxStaticBoxSizer verwendet; ich weiss nicht ob das einen Unterschied macht. Es scheint auch unerheblich, ob das ganze in ein wxPanel eingebettet ist, oder nicht... :rolleyes:

Ob mir da was bei der Dokumentation entgangen ist? Ich hab nirgendwo einen Hinweis auf dieses Verhalten ge-/übersehen. Jetzt hab ich wenigstens einen Workaround und die Anwendung sieht konsistent aus.

Grüße,

Kay
 
Ich habe den verkürzten Konstruktor für wxStaticBoxSizer verwendet; ich weiss nicht ob das einen Unterschied macht. Es scheint auch unerheblich, ob das ganze in ein wxPanel eingebettet ist, oder nicht...

Das sollte normal nichts ausmachen. Das Panel ist die saubere Art und Weise. Unter Carbon und GTK+ fällt das zwar nicht groß ins Gewicht, allerdings unter Windows sollte man es verwenden, da ansonsten hinter den Widgets "nichts" ist (sieht ziemlich übel aus).

Ob mir da was bei der Dokumentation entgangen ist? Ich hab nirgendwo einen Hinweis auf dieses Verhalten ge-/übersehen. Jetzt hab ich wenigstens einen Workaround und die Anwendung sieht konsistent aus.

Ich sehe da auch nichts. Ist die Frage, ob es unter anderen Betriebssystemen das selbe Verhalten gibt, oder ob es ein Mac-Problem ist. Das ist übrigens so eine Sache mit den hauseigenen Widgets von wxWidgets ... die funktionieren zumeist eher schlecht als recht (s. DatePickerCtrl sowie CalendarCtrl).

Viele Grüße,

Morfio ...
 
Zurück
Oben Unten