[wxMac] Problem mit wxGrid & wxStaticBoxSizer

Dieses Thema im Forum "Mac OS X Entwickler, Programmierer" wurde erstellt von der_Kay, 02.05.2006.

  1. der_Kay

    der_Kay Thread Starter MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    MacUser seit:
    02.09.2004
    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)
    
     
  2. Morfio

    Morfio MacUser Mitglied

    Beiträge:
    215
    Zustimmungen:
    1
    MacUser seit:
    25.10.2002
    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 ...
     
  3. der_Kay

    der_Kay Thread Starter MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    MacUser seit:
    02.09.2004
    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
     
  4. Morfio

    Morfio MacUser Mitglied

    Beiträge:
    215
    Zustimmungen:
    1
    MacUser seit:
    25.10.2002
    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).

    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 ...
     
Die Seite wird geladen...

Diese Seite empfehlen