Re: Added MDI support to Pythoncard (was MDI - childwindows within a window)
John Henry <[email protected]> Fri, 1 Apr 2011 15:43:45 -0700 (PDT)
| Newsgroups | gmane.comp.python.pythoncard |
|---|---|
| Message-ID | <[email protected]> |
--===============4740399014933998001== Content-Type: multipart/alternative; boundary="0-1184220370-1301697825=:10753" --0-1184220370-1301697825=:10753 Content-Type: text/plain; charset=us-ascii I couldn't agree with you more. Earlier there was a post claiming that he prefers wxPython over Pythoncard. I assume he's using a different animal than the one I am looking at. Pythoncard is simple, feature rich - and very stable. I've done numerous projects using Pythoncard. I've long suggested that somebody release a 1.0 version of Pythoncard. So far, it has fallen to death ears. If we can all convince the owner to do that, I can package up what I have done and contribute to the release. I've hecked together the following controls: pdfwindow, flashwindow, tree control, minimizable window (minimize to Windows lauch bar), MDI parent and child windows, sashwindows, ... I have to stress heck because I did all these kind of blind folded because I really don't know what's going on most of the time. Wing debugger is my friend. Controls I tried but unable to get it to work: matplotlib window, a graphic file viewer widget (works but not behaving properly), a MDI widget (not window). -- John Henry > >From: Mark Carter <[email protected]> >To: [email protected] >Sent: Fri, April 1, 2011 9:13:02 AM >Subject: [Pythoncard-users] Added MDI support to Pythoncard (was MDI - >childwindows within a window) > > >Hi John. > >Awesome! Good to know someone is still developing PythonCard! PythonCard is >really a super project, for infrequent programmers like myself looking for a >Visual Basic-like development experience on Python, PythonCard does the job. > >I don't suppose you could shepherd through a new release? The current release >is several years old IIRC, and the installer has issues (either with Vista >and/or latest Python, can't recall). Most people who research PythonCard these >days just assume it's a dead project. > >Mark > > > >On Fri, Apr 1, 2011 at 10:53 AM, John Henry <[email protected]> wrote: > >I am happy to report that I've succeeded in Pythoncardize >>the wx.SashLayoutWindow control of wxPython >> using similar technique to the MDI support I reported previously. Not sure >if >>the screen capture attachment to this email will get stripped or not. If you >>don't see the screen shot, shout and I'll try to upload that somewhere. >> >>########## mod to model.py ####################### >>class Background(BackgroundBase, wx.Frame): >> def __init__(self, aParent, aBgRsrc, init=None): >> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>frameclass=wx.Frame, init=init) >> >>class MDIChildBackground(BackgroundBase, wx.MDIChildFrame): >> def __init__(self, aParent, aBgRsrc, init=None): >> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>frameclass=wx.MDIChildFrame, init=init) >> >>class MDIParentBackground(BackgroundBase, wx.MDIParentFrame): >> def __init__(self, aParent, aBgRsrc, init=None): >> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>frameclass=wx.MDIParentFrame, init=init) >> >>class SashWindow(BackgroundBase, wx.SashLayoutWindow): >> def __init__(self, aParent, aBgRsrc, init=None): >> rsrc = resource.Resource(aBgRsrc).application.backgrounds[0] >> return BackgroundBase.__init__(self, aParent, rsrc, >>frameclass=wx.SashLayoutWindow, init=init) >> # Dummy routine >> def SetMenuBar(self, child): >> return >> # Dummy routine >> def GetStatusBar(self): >> return >>########## end of mod to model.py #######################-- >>John Henry >> >> >> >>----- Original Message ---- >>> From: John Henry <[email protected]> >>> To: [email protected] >>> Sent: Wed, March 9, 2011 10:08:39 AM >>> Subject: Added MDI support to Pythoncard (was MDI - childwindows within a >>>window) >>> >>> I am happy to let you know that I succeeded in adding MDI support to >>Pythoncard >>> >>> with only a few lines of modifications to the Background class in model.py >>> >>> I made the Background class into a BackgroundBase class, and have the >>>Background >>> >>> class subclass from the BackgroundBase class. >>> >>> Then I added a MDIParentBackground and MDIChildBackground which simply force >>> Background to subclass from wxMDIParentFrame and wxMDIChildFrame >>respectively, >>> >>> instead of the wx.Frame class. Once I've done that, wxPython does the rest >>>of >>> >>> the work. >>> >>> ################ mod to model.py ###################### >>> >>> from wxPython.wx import wxMDIParentFrame, wxMDIChildFrame >>> >>> # Used to say: >>> # class BackgroundBase(Scriptable, wx.Frame, event.EventSource): >>> class BackgroundBase(Scriptable, event.EventSource): >>> """ >>> A window that contains Widgets. >>> """ >>> def __init__(self, aParent, aBgRsrc, frameclass=wx.Frame): >>> ...<original code>... >>> #Changed original code from invoking wx.Frame here to a method passed down >>> # First, call the base class' __init__ method to create the frame >>> frameclass.__init__(self, aParent, >>> self.id, >>> #self.name, >>> aBgRsrc.title, >>> position, >>> aBgRsrc.size, >>> style | wx.NO_FULL_REPAINT_ON_RESIZE, >>> aBgRsrc.name) >>> ...<rest of original code>... >>> >>> >>> class Background(BackgroundBase, wx.Frame): >>> def __init__(self, aParent, aBgRsrc): >>> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> frameclass=wx.Frame) >>> >>> class MDIParentBackground(BackgroundBase, wxMDIParentFrame): >>> def __init__(self, aParent, aBgRsrc): >>> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> frameclass=wxMDIParentFrame) >>> >>> class MDIChildBackground(BackgroundBase, wxMDIChildFrame): >>> def __init__(self, aParent, aBgRsrc): >>> return BackgroundBase.__init__(self, aParent, aBgRsrc, >>> frameclass=wxMDIChildFrame) >>> >>> ############## end of mod to model.py ######################### >>> >>> To use these two new classes, the code is remarkably unremarkable. The >>parent >>> >>> code: >>> >>> ############# Parent ###################### >>> #!/usr/bin/python >>> >>> """ >>> __version__ = "$Revision: 1.5 $" >>> __date__ = "$Date: 2004/04/30 16:26:12 $" >>> """ >>> >>> from PythonCard import model >>> >>> MDI_rsrc=\ >>> {'application':{'type':'Application', >>> 'name':'Template', >>> 'backgrounds': [ >>> {'type':'Background', >>> 'name':'bgTemplate', >>> 'title':'Testing MDI Controls', >>> 'size':(400, 300), >>> 'style':['resizeable'], >>> >>> 'menubar': {'type':'MenuBar', >>> 'menus': [ >>> {'type':'Menu', >>> 'name':'menuFile', >>> 'label':'&File', >>> 'items': [ >>> {'type':'MenuItem', >>> 'name':'menuFileExit', >>> 'label':'E&xit', >>> 'command':'exit', >>> }, >>> ] >>> }, >>> {'type':'Menu', >>> 'name':'menuOptions', >>> 'label':'Options', >>> 'items': [ >>> {'type':'MenuItem', >>> 'name':'menuOptionsOpenNew', >>> 'label':'Open New\tAlt+N', >>> 'command':'openNew', >>> }, >>> ] >>> }, >>> ] >>> }, >>> 'components': [ >>> >>> ] # end components >>> } # end background >>> ] # end backgrounds >>> } } >>> >>> MyCW_rsrc=\ >>> {'application':{'type':'Application', >>> 'name':'Template', >>> 'backgrounds': [ >>> {'type':'Background', >>> 'name':'bgTemplate', >>> 'title':'Standard Template with File->Exit menu', >>> 'size':(698, 517), >>> 'style':['resizeable'], >>> >>> 'menubar': {'type':'MenuBar', >>> 'menus': [ >>> {'type':'Menu', >>> 'name':'menuFile', >>> 'label':'&File', >>> 'items': [ >>> {'type':'MenuItem', >>> 'name':'menuFileExit', >>> 'label':'E&xit', >>> 'command':'exit', >>> }, >>> ] >>> }, >>> {'type':'Menu', >>> 'name':'menuOptions', >>> 'label':'Options', >>> 'items': [ >>> {'type':'MenuItem', >>> 'name':'menuOptionsOpenNew', >>> 'label':'Open New\tAlt+N', >>> 'command':'openNew', >>> }, >>> ] >>> }, >>> ] >>> }, >>> 'components': [ >>> >>> {'type':'TextArea', >>> 'name':'TextArea1', >>> 'position':(20, 20), >>> 'size':(651, 333), >>> }, >>> >>> {'type':'Button', >>> 'name':'Button1', >>> 'position':(559, 376), >>> 'label':'Button1', >>> }, >>> >>> ] # end components >>> } # end background >>> ] # end backgrounds >>> } } >>> >>> class MyBackground(model.MDIParentBackground): >>> >>> def on_initialize(self, event): >>> # if you have any initialization >>> # including sizer setup, do it here >>> #MDI.on_initialize(self, event) >>> pass >>> def on_openNew_command ( self, event ): >>> # Create a child window >>> child = model.childWindow(self, MyCW, rsrc=MyCW_rsrc) >>> >>> if __name__ == '__main__': >>> app = model.Application(MyBackground, None, MDI_rsrc) >>> app.MainLoop() >>> ############# End of Parent ###################### >>> >>> ############# Child ###################### >>> class MyCW(model.MDIChildBackground): >>> >>> def on_initialize(self, event): >>> self.parent = self.getParent() >>> self.components.TextArea1.text='I am only a child.' >>> def on_openNew_command ( self, event ): >>> return self.parent.on_openNew_command ( event ) >>> ############# End of Child ###################### >>> >>> That's it!!! >>> >>> Now I have to play around with resizer to see how that would work here. >>> >>> -- >>> John Henry >>> >>------------------------------------------------------------------------------ >>Create and publish websites with WebMatrix >>Use the most popular FREE web apps or write code yourself; >>WebMatrix provides all the features you need to develop and >>publish your website. http://p.sf.net/sfu/ms-webmatrix-sf >> >>_______________________________________________ >>Pythoncard-users mailing list >>[email protected] >>https://lists.sourceforge.net/lists/listinfo/pythoncard-users >> >> > > >-- >Mark Carter, OCT >markcarter.tel > > > >-- >Mark Carter, OCT >markcarter.tel > --0-1184220370-1301697825=:10753 Content-Type: text/html; charset=us-ascii <html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:'times new roman', 'new york', times, serif;font-size:12pt"><div></div><div>I couldn't agree with you more. Earlier there was a post claiming that he prefers wxPython over Pythoncard. I assume he's using a different animal than the one I am looking at. Pythoncard is simple, feature rich - and very stable. I've done numerous projects using Pythoncard.</div><div><br></div><div>I've long suggested that somebody release a 1.0 version of Pythoncard. So far, it has fallen to death ears. If we can all convince the owner to do that, I can package up what I have done and contribute to the release.</div><div><br></div><div>I've hecked together the following c ontrols:</div><div><br></div><div>pdfwindow, flashwindow, tree control, minimizable window (minimize to Windows lauch bar), MDI parent and child windows, sashwindows, ...</div><div><br></div><div>I have to stress heck because I did all these kind of blind folded because I really don't know what's going on most of the time. Wing debugger is my friend.</div><div><br></div><div>Controls I tried but unable to get it to work:</div><div><br></div><div>matplotlib window, a graphic file viewer widget (works but not behaving properly), a MDI widget (not window). </div><div><br></div><div><br> </div>--<br>John Henry<div><br></div><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><br><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><font size="2" face="Tahoma"><b><span style="font-weight: b old;">From:</span></b> Mark Carter <[email protected]><br><b><span style="font-weight: bold;">To:</span></b> [email protected]<br><b><span style="font-weight: bold;">Sent:</span></b> Fri, April 1, 2011 9:13:02 AM<br><b><span style="font-weight: bold;">Subject:</span></b> [Pythoncard-users] Added MDI support to Pythoncard (was MDI - childwindows within a window)<br></font><br> <meta http-equiv="x-dns-prefetch-control" content="off"><div class="gmail_quote">Hi John.<br><br>Awesome! Good to know someone is still developing PythonCard! PythonCard is really a super project, for infrequent programmers like myself looking for a Visual Basic-like development experience on Python, PythonCard does the job.<br> <br>I don't suppose you could shepherd through a new release? The current release is several years old IIRC, and the installer has issues (either with Vista and/or latest Python, can't recall). Most people who research PythonCard these days just assume it's a dead project.<br> <br>Mark<br><br><br><div class="gmail_quote"><div><div></div><div class="h5">On Fri, Apr 1, 2011 at 10:53 AM, John Henry <span dir="ltr"><<a rel="nofollow" ymailto="mailto:[email protected]" target="_blank" href="mailto:[email protected]">[email protected]</a>></span> wrote:<br> </div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div></div><div class="h5"> I am happy to report that I've succeeded in Pythoncardize<br> the wx.SashLayoutWindow control of wxPython<br> using similar technique to the MDI support I reported previously. Not sure if<br> the screen capture attachment to this email will get stripped or not. If you<br> don't see the screen shot, shout and I'll try to upload that somewhere.<br> <br> ########## mod to <a target="_blank" href="http://model.py">model.py</a> #######################<br> class Background(BackgroundBase, wx.Frame):<br> def __init__(self, aParent, aBgRsrc, init=None):<br> return BackgroundBase.__init__(self, aParent, aBgRsrc,<br> frameclass=wx.Frame, init=init)<br> <br> class MDIChildBackground(BackgroundBase, wx.MDIChildFrame):<br> def __init__(self, aParent, aBgRsrc, init=None):<br> return BackgroundBase.__init__(self, aParent, aBgRsrc,<br> frameclass=wx.MDIChildFrame, init=init)<br> <br> class MDIParentBackground(BackgroundBase, wx.MDIParentFrame):<br> def __init__(self, aParent, aBgRsrc, init=None):<br> return BackgroundBase.__init__(self, aParent, aBgRsrc,<br> frameclass=wx.MDIParentFrame, init=init)<br> <br> class SashWindow(BackgroundBase, wx.SashLayoutWindow):<br> def __init__(self, aParent, aBgRsrc, init=None):<br> rsrc = resource.Resource(aBgRsrc).application.backgrounds[0]<br> return BackgroundBase.__init__(self, aParent, rsrc,<br> frameclass=wx.SashLayoutWindow, init=init)<br> # Dummy routine<br> def SetMenuBar(self, child):<br> return<br> # Dummy routine<br> def GetStatusBar(self):<br> return<br> ########## end of mod to model.py #######################--<br> John Henry<br> <br> <br> <br> ----- Original Message ----<br> > From: John Henry <<a rel="nofollow" ymailto="mailto:[email protected]" target="_blank" href="mailto:[email protected]">[email protected]</a>><br> > To: <a rel="nofollow" ymailto="mailto:[email protected]" target="_blank" href="mailto:[email protected]">[email protected]</a><br> > Sent: Wed, March 9, 2011 10:08:39 AM<br> > Subject: Added MDI support to Pythoncard (was MDI - childwindows within a<br> >window)<br> ><br> > I am happy to let you know that I succeeded in adding MDI support to Pythoncard<br> ><br> > with only a few lines of modifications to the Background class in model.py<br> ><br> > I made the Background class into a BackgroundBase class, and have the<br> >Background<br> ><br> > class subclass from the BackgroundBase class.<br> ><br> > Then I added a MDIParentBackground and MDIChildBackground which simply force<br> > Background to subclass from wxMDIParentFrame and wxMDIChildFrame respectively,<br> ><br> > instead of the wx.Frame class. Once I've done that, wxPython does the rest<br> >of<br> ><br> > the work.<br> ><br> > ################ mod to model.py ######################<br> ><br> > from wxPython.wx import wxMDIParentFrame, wxMDIChildFrame<br> ><br> > # Used to say:<br> > # class BackgroundBase(Scriptable, wx.Frame, event.EventSource):<br> > class BackgroundBase(Scriptable, event.EventSource):<br> > """<br> > A window that contains Widgets.<br> > """<br> > def __init__(self, aParent, aBgRsrc, frameclass=wx.Frame):<br> > ...<original code>...<br> > #Changed original code from invoking wx.Frame here to a method passed down<br> > # First, call the base class' __init__ method to create the frame<br> > frameclass.__init__(self, aParent,<br> > <a rel="nofollow" target="_blank" href="http://self.id">self.id</a>,<br> > #<a rel="nofollow" target="_blank" href="http://self.name">self.name</a>,<br> > aBgRsrc.title,<br> > position,<br> > aBgRsrc.size,<br> > style | wx.NO_FULL_REPAINT_ON_RESIZE,<br> > <a target="_blank" href="http://aBgRsrc.name">aBgRsrc.name</a>)<br> > ...<rest of original code>...<br> ><br> ><br> > class Background(BackgroundBase, wx.Frame):<br> > def __init__(self, aParent, aBgRsrc):<br> > return BackgroundBase.__init__(self, aParent, aBgRsrc,<br> > frameclass=wx.Frame)<br> ><br> > class MDIParentBackground(BackgroundBase, wxMDIParentFrame):<br> > def __init__(self, aParent, aBgRsrc):<br> > return BackgroundBase.__init__(self, aParent, aBgRsrc,<br> > frameclass=wxMDIParentFrame)<br> ><br> > class MDIChildBackground(BackgroundBase, wxMDIChildFrame):<br> > def __init__(self, aParent, aBgRsrc):<br> > return BackgroundBase.__init__(self, aParent, aBgRsrc,<br> > frameclass=wxMDIChildFrame)<br> ><br> > ############## end of mod to model.py #########################<br> ><br> > To use these two new classes, the code is remarkably unremarkable. The parent<br> ><br> > code:<br> ><br> > ############# Parent ######################<br> > #!/usr/bin/python<br> ><br> > """<br> > __version__ = "$Revision: 1.5 $"<br> > __date__ = "$Date: 2004/04/30 16:26:12 $"<br> > """<br> ><br> > from PythonCard import model<br> ><br> > MDI_rsrc=\<br> > {'application':{'type':'Application',<br> > 'name':'Template',<br> > 'backgrounds': [<br> > {'type':'Background',<br> > 'name':'bgTemplate',<br> > 'title':'Testing MDI Controls',<br> > 'size':(400, 300),<br> > 'style':['resizeable'],<br> ><br> > 'menubar': {'type':'MenuBar',<br> > 'menus': [<br> > {'type':'Menu',<br> > 'name':'menuFile',<br> > 'label':'&File',<br> > 'items': [<br> > {'type':'MenuItem',<br> > 'name':'menuFileExit',<br> > 'label':'E&xit',<br> > 'command':'exit',<br> > },<br> > ]<br> > },<br> > {'type':'Menu',<br> > 'name':'menuOptions',<br> > 'label':'Options',<br> > 'items': [<br> > {'type':'MenuItem',<br> > 'name':'menuOptionsOpenNew',<br> > 'label':'Open New\tAlt+N',<br> > 'command':'openNew',<br> > },<br> > ]<br> > },<br> > ]<br> > },<br> > 'components': [<br> ><br> > ] # end components<br> > } # end background<br> > ] # end backgrounds<br> > } }<br> ><br> > MyCW_rsrc=\<br> > {'application':{'type':'Application',<br> > 'name':'Template',<br> > 'backgrounds': [<br> > {'type':'Background',<br> > 'name':'bgTemplate',<br> > 'title':'Standard Template with File->Exit menu',<br> > 'size':(698, 517),<br> > 'style':['resizeable'],<br> ><br> > 'menubar': {'type':'MenuBar',<br> > 'menus': [<br> > {'type':'Menu',<br> > 'name':'menuFile',<br> > 'label':'&File',<br> > 'items': [<br> > {'type':'MenuItem',<br> > 'name':'menuFileExit',<br> > 'label':'E&xit',<br> > 'command':'exit',<br> > },<br> > ]<br> > },<br> > {'type':'Menu',<br> > 'name':'menuOptions',<br> > 'label':'Options',<br> > 'items': [<br> > {'type':'MenuItem',<br> > 'name':'menuOptionsOpenNew',<br> > 'label':'Open New\tAlt+N',<br> > 'command':'openNew',<br> > },<br> > ]<br> > },<br> > ]<br> > },<br> > 'components': [<br> ><br> > {'type':'TextArea',<br> > 'name':'TextArea1',<br> > 'position':(20, 20),<br> > 'size':(651, 333),<br> > },<br> ><br> > {'type':'Button',<br> > 'name':'Button1',<br> > 'position':(559, 376),<br> > 'label':'Button1',<br> > },<br> ><br> > ] # end components<br> > } # end background<br> > ] # end backgrounds<br> > } }<br> ><br> > class MyBackground(model.MDIParentBackground):<br> ><br> > def on_initialize(self, event):<br> > # if you have any initialization<br> > # including sizer setup, do it here<br> > #MDI.on_initialize(self, event)<br> > pass<br> > def on_openNew_command ( self, event ):<br> > # Create a child window<br> > child = model.childWindow(self, MyCW, rsrc=MyCW_rsrc)<br> ><br> > if __name__ == '__main__':<br> > app = model.Application(MyBackground, None, MDI_rsrc)<br> > app.MainLoop()<br> > ############# End of Parent ######################<br> ><br> > ############# Child ######################<br> > class MyCW(model.MDIChildBackground):<br> ><br> > def on_initialize(self, event):<br> > self.parent = self.getParent()<br> > self.components.TextArea1.text='I am only a child.'<br> > def on_openNew_command ( self, event ):<br> > return self.parent.on_openNew_command ( event )<br> > ############# End of Child ######################<br> ><br> > That's it!!!<br> ><br> > Now I have to play around with resizer to see how that would work here.<br> ><br> > --<br> > John Henry<br> > <br></div></div>------------------------------------------------------------------------------<br> Create and publish websites with WebMatrix<br> Use the most popular FREE web apps or write code yourself;<br> WebMatrix provides all the features you need to develop and<br><span> publish your website. <a target="_blank" href="http://p.sf.net/sfu/ms-webmatrix-sf">http://p.sf.net/sfu/ms-webmatrix-sf</a></span><br> <br>_______________________________________________<br> Pythoncard-users mailing list<br> <a rel="nofollow" ymailto="mailto:[email protected]" target="_blank" href="mailto:[email protected]">[email protected]</a><br> <a rel="nofollow" target="_blank" href="https://lists.sourceforge.net/lists/listinfo/pythoncard-users">https://lists.sourceforge.net/lists/listinfo/pythoncard-users</a><br> <br></blockquote></div><font color="#888888"><br><br clear="all"><br>-- <br>Mark Carter, OCT<div><a rel="nofollow" target="_blank" href="http://markcarter.tel">markcarter.tel</a></div><br> <div style="padding:0px;margin-left:0px;margin-top:0px;overflow:hidden;word-wrap:break-word;color:black;font-size:10px;text-align:left;line-height:130%;"> </div> </font></div><br><br clear="all"><br>-- <br>Mark Carter, OCT<div><a rel="nofollow" target="_blank" href="http://markcarter.tel">markcarter.tel</a></div><br> <div style="visibility:hidden;padding:0px;margin-left:0px;margin-top:0px;overflow:hidden;word-wrap:break-word;color:black;font-size:10px;text-align:left;line-height:130%;" id="avg_ls_inline_popup"> </div> <meta http-equiv="x-dns-prefetch-control" content="on"></div></div></blockquote><div style="position:fixed"></div> </div></body></html> --0-1184220370-1301697825=:10753-- --===============4740399014933998001== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------------ Create and publish websites with WebMatrix Use the most popular FREE web apps or write code yourself; WebMatrix provides all the features you need to develop and publish your website. http://p.sf.net/sfu/ms-webmatrix-sf --===============4740399014933998001== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Pythoncard-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/pythoncard-users --===============4740399014933998001==--