Opened 3 months ago

Closed 2 months ago

Last modified 2 months ago

#15919 closed defect (fixed)

wxShowEvent is called at startup for wxPanel that is declared hidden in XRC

Reported by: escamoteur Owned by:
Priority: low Milestone:
Component: XRC Version: 3.0.0
Keywords: wxPanel XRC wxShowEvent Cc:
Blocked By: Blocking:
Patch: no

Description

Hi,

I have an wxPanel that is declared hidden in my XRC-File:

<object class="wxPanel" name="ID_PAGE_CONNECT_INSERT_CARD" subclass="PagePlayerConnectInsertCard">
                        <style>wxSUNKEN_BORDER|wxTAB_TRAVERSAL</style>
                        <hidden>1</hidden>

So I would expect that the OnShow-Handler of the Panel is not called until I call Show() on the Panel. But what happens is that while loading the XRC-File and generating the GUI-Objects On Show is called with and IsShown says true. The Event is called a second time imidiatly after, then with IsShown = false.

As I would like to use the ShowEvent to initialize something just before the panel is shown and not earlier, I would consider this behaviour as wrong.

Attachments (3)

hiddentest.patch download (39.0 KB) - added by escamoteur 3 months ago.
hiddentest.2.patch download (7.0 KB) - added by escamoteur 3 months ago.
DialogWithPatch.PNG download (62.4 KB) - added by escamoteur 3 months ago.
Dialog with applied propoesed patch

Download all attachments as: .zip

Change History (25)

comment:1 Changed 3 months ago by vadz

  • Component changed from base to XRC
  • Patch set
  • Priority changed from normal to low
  • Status changed from new to confirmed

I think the following patch should fix this:

  • include/wx/xrc/xmlres.h

    diff --git a/include/wx/xrc/xmlres.h b/include/wx/xrc/xmlres.h
    index 8924bcc..ed0d980 100644
    a b class WXDLLIMPEXP_XRC wxXmlResourceHandlerImpl : public wxXmlResourceHandlerImpl 
    615615   if (m_instance) \ 
    616616       variable = wxStaticCast(m_instance, classname); \ 
    617617   if (!variable) \ 
    618        variable = new classname; 
     618   { \ 
     619       variable = new classname; \ 
     620       if (GetBool(wxT("hidden"), 0) == 1) \ 
     621           variable->Hide(); \ 
     622   } 
    619623 
    620624 
    621625// FIXME -- remove this $%^#$%#$@# as soon as Ron checks his changes in!! 
  • src/xrc/xmlres.cpp

    diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp
    index 49967c1..51810dc 100644
    a b void wxXmlResourceHandlerImpl::SetupWindow(wxWindow *wnd) 
    24182418        wnd->Enable(false); 
    24192419    if (GetBool(wxT("focused"), 0) == 1) 
    24202420        wnd->SetFocus(); 
    2421     if (GetBool(wxT("hidden"), 0) == 1) 
    2422         wnd->Show(false); 
    24232421#if wxUSE_TOOLTIPS 
    24242422    if (HasParam(wxT("tooltip"))) 
    24252423        wnd->SetToolTip(GetText(wxT("tooltip"))); 

Could you please test if it works for you?

comment:2 Changed 3 months ago by escamoteur

No, it does not work.

wxShowEvent is now called only once during initialisation but still with m_show = true.

Also afterwards the Panel that should be hidden isn't hidden but displayed.

This is the call stack where wxShowEvent is called:

>	CardPlayerApp.exe!PagePlayerConnectInsertCard::OnShow(wxShowEvent & event={...})  Line 169	C++
 	CardPlayerApp.exe!wxAppConsoleBase::HandleEvent(wxEvtHandler * handler=0x01250bb0, void (wxEvent &)* func=0x016d44b5, wxEvent & event={...})  Line 611 + 0xf bytes	C++
 	CardPlayerApp.exe!wxAppConsoleBase::CallEventHandler(wxEvtHandler * handler=0x01250bb0, wxEventFunctor & functor={...}, wxEvent & event={...})  Line 623 + 0x22 bytes	C++
 	CardPlayerApp.exe!wxEvtHandler::ProcessEventIfMatchesId(const wxEventTableEntryBase & entry={...}, wxEvtHandler * handler=0x01250bb0, wxEvent & event={...})  Line 1384 + 0x29 bytes	C++
 	CardPlayerApp.exe!wxEventHashTable::HandleEvent(wxEvent & event={...}, wxEvtHandler * self=0x01250bb0)  Line 990 + 0x11 bytes	C++
 	CardPlayerApp.exe!wxEvtHandler::TryHereOnly(wxEvent & event={...})  Line 1581 + 0x25 bytes	C++
 	CardPlayerApp.exe!wxEvtHandler::TryBeforeAndHere(wxEvent & event={...})  Line 3671 + 0x2d bytes	C++
 	CardPlayerApp.exe!wxEvtHandler::ProcessEventLocally(wxEvent & event={...})  Line 1514 + 0xc bytes	C++
 	CardPlayerApp.exe!wxEvtHandler::ProcessEvent(wxEvent & event={...})  Line 1487 + 0xc bytes	C++
 	CardPlayerApp.exe!wxEvtHandler::SafelyProcessEvent(wxEvent & event={...})  Line 1605 + 0x13 bytes	C++
 	CardPlayerApp.exe!wxWindowBase::HandleWindowEvent(wxEvent & event={...})  Line 1526	C++
 	CardPlayerApp.exe!wxWindow::HandleShow(bool show=true, int __formal=0)  Line 4135 + 0xc bytes	C++
 	CardPlayerApp.exe!wxWindow::MSWHandleMessage(long * result=0x002fc67c, unsigned int message=24, unsigned int wParam=1, long lParam=0)  Line 2880 + 0x17 bytes	C++
 	CardPlayerApp.exe!wxWindow::MSWWindowProc(unsigned int message=24, unsigned int wParam=1, long lParam=0)  Line 3628 + 0x22 bytes	C++
 	CardPlayerApp.exe!wxWndProc(HWND__ * hWnd=0x00090a28, unsigned int message=24, unsigned int wParam=1, long lParam=0)  Line 2717 + 0x1e bytes	C++
 	user32.dll!7613c4e7() 	
 	[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]	
 	user32.dll!7613c5e7() 	
 	user32.dll!7613c590() 	
 	user32.dll!76134f0e() 	
 	user32.dll!76134f7d() 	
 	ntdll.dll!7749702e() 	
 	user32.dll!76134ec3() 	
 	user32.dll!7612eb94() 	
 	user32.dll!7612eb28() 	
 	user32.dll!7612ec54() 	
 	user32.dll!7612ecaf() 	
 	CardPlayerApp.exe!wxWindow::MSWCreate(const wchar_t * wclass=0x01248710, const wchar_t * title=0x00000000, const wxPoint & pos={...}, const wxSize & size={...}, unsigned long style=1375731712, unsigned long extendedStyle=66048)  Line 3783 + 0x87 bytes	C++
 	CardPlayerApp.exe!wxWindow::Create(wxWindow * parent=0x01261b90, int id=-31988, const wxPoint & pos={...}, const wxSize & size={...}, long style=134742016, const wxString & name={...})  Line 546 + 0x20 bytes	C++
 	CardPlayerApp.exe!wxPanelBase::Create(wxWindow * parent=0x01261b90, int id=-31988, const wxPoint & pos={...}, const wxSize & size={...}, long style=134742016, const wxString & name={...})  Line 101 + 0x20 bytes	C++
 	CardPlayerApp.exe!wxPanelXmlHandler::DoCreateResource()  Line 47 + 0xc8 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateResource(wxXmlNode * node=0x0124d028, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 1467 + 0x23 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateResource(wxXmlNode * node=0x0124d028, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 161 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxXmlResource::DoCreateResFromNode(wxXmlNode & node={...}, wxObject * parent=0x01261b90, wxObject * instance=0x00000000, wxXmlResourceHandler * handlerToUse=0x00000000)  Line 1032 + 0x17 bytes	C++
 	CardPlayerApp.exe!wxXmlResource::CreateResFromNode(wxXmlNode * node=0x0124d028, wxObject * parent=0x01261b90, wxObject * instance=0x00000000, wxXmlResourceHandler * handlerToUse=0x00000000)  Line 353 + 0x1e bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateResFromNode(wxXmlNode * node=0x0124d028, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 1414	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateResFromNode(wxXmlNode * node=0x0124d028, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 346 + 0x29 bytes	C++
 	CardPlayerApp.exe!wxSizerXmlHandler::Handle_sizeritem()  Line 181 + 0x15 bytes	C++
 	CardPlayerApp.exe!wxSizerXmlHandler::DoCreateResource()  Line 108 + 0x8 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateResource(wxXmlNode * node=0x0124c3d8, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 1467 + 0x23 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateResource(wxXmlNode * node=0x0124c3d8, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 161 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxXmlResource::DoCreateResFromNode(wxXmlNode & node={...}, wxObject * parent=0x01261b90, wxObject * instance=0x00000000, wxXmlResourceHandler * handlerToUse=0x011c5a48)  Line 1022 + 0x14 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateChildren(wxObject * parent=0x01261b90, bool this_hnd_only=true)  Line 2445	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateChildren(wxObject * parent=0x01261b90, bool this_hnd_only=true)  Line 337 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxSizerXmlHandler::Handle_sizer()  Line 271	C++
 	CardPlayerApp.exe!wxSizerXmlHandler::DoCreateResource()  Line 115	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateResource(wxXmlNode * node=0x0124bdc8, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 1467 + 0x23 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateResource(wxXmlNode * node=0x0124bdc8, wxObject * parent=0x01261b90, wxObject * instance=0x00000000)  Line 161 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxXmlResource::DoCreateResFromNode(wxXmlNode & node={...}, wxObject * parent=0x01261b90, wxObject * instance=0x00000000, wxXmlResourceHandler * handlerToUse=0x00000000)  Line 1032 + 0x17 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateChildren(wxObject * parent=0x01261b90, bool this_hnd_only=false)  Line 2445	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateChildren(wxObject * parent=0x01261b90, bool this_hnd_only=false)  Line 337 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxPanelXmlHandler::DoCreateResource()  Line 52	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateResource(wxXmlNode * node=0x0124b650, wxObject * parent=0x01241d40, wxObject * instance=0x00000000)  Line 1467 + 0x23 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateResource(wxXmlNode * node=0x0124b650, wxObject * parent=0x01241d40, wxObject * instance=0x00000000)  Line 161 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxXmlResource::DoCreateResFromNode(wxXmlNode & node={...}, wxObject * parent=0x01241d40, wxObject * instance=0x00000000, wxXmlResourceHandler * handlerToUse=0x00000000)  Line 1032 + 0x17 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateChildren(wxObject * parent=0x01241d40, bool this_hnd_only=false)  Line 2445	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateChildren(wxObject * parent=0x01241d40, bool this_hnd_only=false)  Line 337 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxFrameXmlHandler::DoCreateResource()  Line 87	C++
 	CardPlayerApp.exe!wxXmlResourceHandlerImpl::CreateResource(wxXmlNode * node=0x012491c0, wxObject * parent=0x00000000, wxObject * instance=0x01241d40)  Line 1467 + 0x23 bytes	C++
 	CardPlayerApp.exe!wxXmlResourceHandler::CreateResource(wxXmlNode * node=0x012491c0, wxObject * parent=0x00000000, wxObject * instance=0x01241d40)  Line 161 + 0x26 bytes	C++
 	CardPlayerApp.exe!wxXmlResource::DoCreateResFromNode(wxXmlNode & node={...}, wxObject * parent=0x00000000, wxObject * instance=0x01241d40, wxXmlResourceHandler * handlerToUse=0x00000000)  Line 1032 + 0x17 bytes	C++
 	CardPlayerApp.exe!wxXmlResource::CreateResFromNode(wxXmlNode * node=0x012491c0, wxObject * parent=0x00000000, wxObject * instance=0x01241d40, wxXmlResourceHandler * handlerToUse=0x00000000)  Line 353 + 0x1e bytes	C++
 	CardPlayerApp.exe!wxXmlResource::LoadFrame(wxFrame * frame=0x01241d40, wxWindow * parent=0x00000000, const wxString & name={...})  Line 511 + 0x39 bytes	C++
 	CardPlayerApp.exe!CardPlayerMain::CreateControls()  Line 119 + 0x37 bytes	C++
 	CardPlayerApp.exe!CardPlayerMain::Create(wxWindow * parent=0x00000000, int id=10000, const wxString & caption={...}, const wxPoint & pos={...}, const wxSize & size={...}, long style=536877120)  Line 82	C++
 	CardPlayerApp.exe!CardPlayerMain::CardPlayerMain(wxWindow * parent=0x00000000, int id=10000, const wxString & caption={...}, const wxPoint & pos={...}, const wxSize & size={...}, long style=536877120)  Line 70	C++
 	CardPlayerApp.exe!CardPlayerApp::OnInit()  Line 112 + 0xc6 bytes	C++
 	CardPlayerApp.exe!wxAppConsoleBase::CallOnInit()  Line 93 + 0x32 bytes	C++
 	CardPlayerApp.exe!wxEntryReal(int & argc=1, wchar_t * * argv=0x011a3ff0)  Line 479 + 0x1d bytes	C++
 	CardPlayerApp.exe!wxEntry(int & argc=1, wchar_t * * argv=0x011a3ff0)  Line 188 + 0xd bytes	C++
 	CardPlayerApp.exe!wxEntry(HINSTANCE__ * hInstance=0x01390000, HINSTANCE__ * __formal=0x00000000, HINSTANCE__ * __formal=0x00000000, int nCmdShow=1)  Line 415 + 0x10 bytes	C++
 	CardPlayerApp.exe!WinMain(HINSTANCE__ * hInstance=0x01390000, HINSTANCE__ * hPrevInstance=0x00000000, char * __formal=0x0047333f, int nCmdShow=1)  Line 40 + 0x31 bytes	C++
 	CardPlayerApp.exe!__tmainCRTStartup()  Line 547 + 0x2c bytes	C
 	CardPlayerApp.exe!WinMainCRTStartup()  Line 371	C
 	kernel32.dll!758ced5c() 	
 	ntdll.dll!774b37eb() 	
 	ntdll.dll!774b37be() 	

comment:3 follow-up: Changed 3 months ago by vadz

This is really strange, IsShown() should return false in wxWindow::Create() and so the window should be created initially hidden. Does the GetBool("hidden") test fail somehow?

I'm afraid I don't see the problem just from looking at the code, could you please make an as small as possible patch to the xrc (or minimal if you prefer) sample showing the problem?

comment:4 in reply to: ↑ 3 Changed 3 months ago by escamoteur

Replying to vadz:


If you are using VS2010 I could give you my whole project as it's still in a very early phase.  
>

comment:5 follow-up: Changed 3 months ago by vadz

Unfortunately debugging your project would take me significantly more time. It would be really great if you could just reproduce the problem in the sample instead, it shouldn't be that difficult.

comment:6 in reply to: ↑ 5 Changed 3 months ago by escamoteur

Is a minimal VS Project ok?

comment:7 follow-up: Changed 3 months ago by vadz

You don't need to have any projects if you're just modifying a sample, they already have them. I'd really like to encourage you to read HowToSubmitPatches already linked from above.

comment:8 in reply to: ↑ 7 Changed 3 months ago by escamoteur

I'm not used to Git and the whole procedure of patches in such a project. So if I could use a small project it would be easier for me.

comment:9 Changed 3 months ago by neis

To speak frankly: You are the one asking for help, so to me it would seem a matter of politeness to put in a bit of an effort to make the life of those that are trying to help you (for free) - like Vadim - as easy as possible, instead of asking them, to make an extra effort to make your life a bit easier.

Changed 3 months ago by escamoteur

comment:10 Changed 3 months ago by escamoteur

I added a new Dialog to the XRC Sample with a derived panel class that implements the wxShowEventhandler.

The new dialog is opend by the derived class button.

In the Debug Output you can see, that it get's called at creation time with isShown = true.

If you patch wxWidgets like you proposed above, you will see that the hidden panel is no longer hidden.

comment:11 Changed 3 months ago by vadz

  • Status changed from confirmed to infoneeded_new

I'm sorry, but you really don't make it easy :-( There is tons of probably completely unrelated code in this patch, I was hoping more for a simple diff to the .xrc, like this:

  • samples/xrc/rc/basicdlg.xrc

    diff --git a/samples/xrc/rc/basicdlg.xrc b/samples/xrc/rc/basicdlg.xrc
    index 55857ca..bbfa604 100644
    a b  
    1919        <object class="sizeritem"> 
    2020            <flag>wxEXPAND|wxALL</flag> 
    2121            <border>5</border> 
     22            <minsize>100,100</minsize> 
     23            <object class="wxPanel"> 
     24                <hidden>1</hidden> 
     25                <bg>red</bg> 
     26            </object> 
     27        </object> 
     28        <object class="sizeritem"> 
     29            <flag>wxEXPAND|wxALL</flag> 
     30            <border>5</border> 
    2231            <object class="wxStdDialogButtonSizer"> 
    2332                <object class="button"> 
    2433                    <object class="wxButton" name="wxID_OK"> 

And another trivial change to the source to see the event:

diff --git a/samples/xrc/myframe.cpp b/samples/xrc/myframe.cpp
index 65a8de9..db1fcc0 100644
--- a/samples/xrc/myframe.cpp
+++ b/samples/xrc/myframe.cpp
@@ -170,13 +170,21 @@ void MyFrame::OnExitToolOrMenuCommand(wxCommandEvent& WXUNUSED(event))
 }


+void OnShow(wxShowEvent& e)
+{
+    wxLogMessage("%s event", e.IsShown() ? "show" : "hide");
+}
+
 void MyFrame::OnNonDerivedDialogToolOrMenuCommand(wxCommandEvent& WXUNUSED(event))
 {
     wxDialog dlg;
     // "non_derived_dialog" is the name of the wxDialog XRC node that should
     // be loaded.
     if ( wxXmlResource::Get()->LoadDialog(&dlg, this, wxT("non_derived_dialog")) )
+    {
+        XRCCTRL(dlg, "p", wxPanel)->Bind(wxEVT_SHOW, OnShow);
         dlg.ShowModal();
+    }
 }


There is no need to produce hundreds of lines of auto-generated code to see the problem, especially as it doesn't really help to debug the problem.

Anyhow, the trouble is that not only I don't see the problem with the panel being shown after applying the patch above, but I also don't see the problem with the unwanted show events without the patch. So I'm really not sure what are you doing to see the different results.

Please try to reproduce the bad behaviour in the sample using the small patches like the above ones. TIA!

comment:12 Changed 3 months ago by escamoteur

  • Status changed from infoneeded_new to new

Im sorry, but I spent yesterday about 3h to recreate the effect with just the elements in the xrc example but always ran in different problems like when I changed the custom class from using the "unknown" method to use "subclass" I suddenly got exceptions about missing parent. (This was confirmed by David_GH von IIRC)

So I tried to replicate almost the same condition as in my application.

If I run this project I can reproduce the effect everytime. So I don't know why it won't at your side. Have you tried it under Windows?

And yes, there are 4 new files, but they do almost nothing. So I don't really understand your complain. I spend most of my yesterday work to help finding this bug. I really appreciate your effort, but please don't do as if I'm just making things for me easy

comment:13 follow-up: Changed 3 months ago by vadz

  • Status changed from new to infoneeded_new

The point is that there is a bug in your code. There is no bug in the simple patch above. So somebody has to find which change in your code triggers the bug. I'd prefer if this somebody could be you and not me, because this is something straightforward to do (you just reduce the differences between the working and non-working versions until you hit the bug) and doesn't require any knowledge of wxWidgets -- but does require time. Time which I prefer to spend on something that does require knowledge of wxWidgets.

It's also far from impossible that there is simply a bug in your code. Maybe there are none. But this is hard to tell by just looking at the code you submitted, there is too much of it. If you could make a tiny patch, it would be obvious that it was correct and that the problem is indeed in wxWidgets (where I'm interested in fixing it) and not in your code (where I'm not).

Please see http://sscce.org/ for more on this topic.

And in the meanwhile we still need some reasonable way to reproduce the bug.

comment:14 in reply to: ↑ 13 Changed 3 months ago by escamoteur

  • Status changed from infoneeded_new to new

When you applied your patch, you were not able to reproduce the problem? That means you did not get a Debug Output telling that OnShow was called with isShown = true?

As said, I was not able yet to replicate the effect in the XRC example. What I can do is, is stripping everything not neccessary out from my last patch. Would this be ok?

comment:15 Changed 3 months ago by vadz

If you strip everything unnecessary from your patch you really should end up with something that can be put into the XRC sample. Currently there is so much stuff (most of it trivial, yes, but how am I supposed to know where non trivial part is?) that I really have no idea what's going on there. Please try to move the minimally necessary part into the sample. Chances are you may even find the solution to the bug yourself while you're doing it.

Good luck!

Changed 3 months ago by escamoteur

Changed 3 months ago by escamoteur

Dialog with applied propoesed patch

comment:16 Changed 3 months ago by escamoteur

This patch adds one custom class and one new XRC-File to the sample. And does nothing more than having an OnShow Handler. Still I get the same effect.

comment:17 Changed 2 months ago by vadz

  • Patch unset
  • Status changed from new to confirmed

Great, thanks, this is still much more verbose than ideal (you could have simply put the custom panel class declaration directly into myframe.cpp instead of creating separate files for them) and still does contain bugs (your Create() is wrong) but at least it's short enough to see what's going on and I could debug it easily and realize that the bug only happens for subclasses panels, which wasn't obvious initially.

I'll fix it now, thanks for your efforts.

comment:18 Changed 2 months ago by VZ

  • Resolution set to fixed
  • Status changed from confirmed to closed

(In [75757]) Don't show windows with "hidden" XRC attribute at all.

This is better than showing them initially and then hiding them if only
because it avoids the unexpected wxEVT_SHOW events being generated.

Closes #15919.

comment:19 Changed 2 months ago by escamoteur

Why is this case closed? The patch for the panel is still missing. [75757] only contains the change proposed above and not more. Btw. The Create function in my sample was created be DialogBlocks. I htought they would know what they are doing.

comment:20 Changed 2 months ago by vadz

No, r75757 is slightly (but importantly) different from the patch from the comment:1.

Do you still see the bug with it?

comment:21 Changed 2 months ago by escamoteur

Ah, I see the brackets, the now the  if (GetBool(wxT("hidden"), 0) == 1) is always performed undependent of vaiable.

No, the bug is gone! Could you ive me a pointer why my create is wrong?

Thanks a lot for your effort!

comment:22 Changed 2 months ago by vadz

Create() should actually create the window, i.e. call the base class version.

Note: See TracTickets for help on using tickets.