[wxMac] Problem mit wxGrid & wxStaticBoxSizer

  1. der_Kay

    der_Kay Thread StarterMacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    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)
    
     
    der_Kay, 02.05.2006
  2. Morfio

    MorfioMacUser Mitglied

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

    der_Kay Thread StarterMacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    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
     
    der_Kay, 02.05.2006
  4. Morfio

    MorfioMacUser Mitglied

    Mitglied seit:
    25.10.2002
    Beiträge:
    215
    Zustimmungen:
    1
    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 ...
     
    Morfio, 02.05.2006
Die Seite wird geladen...
Ähnliche Themen - [wxMac] Problem wxGrid
  1. Dylans Ghost
    Antworten:
    5
    Aufrufe:
    259
    xentric
    08.04.2017
  2. fkmac
    Antworten:
    2
    Aufrufe:
    432
  3. Dylans Ghost
    Antworten:
    4
    Aufrufe:
    310
    Dylans Ghost
    22.11.2016
  4. Dylans Ghost
    Antworten:
    2
    Aufrufe:
    307
    Dylans Ghost
    28.10.2016
  5. slackfr
    Antworten:
    5
    Aufrufe:
    1.260
    Relampago
    18.09.2006