sobre comportamiento de txbrowse

sobre comportamiento de txbrowse

Postby carlos vargas » Tue Aug 09, 2011 5:10 pm

estimados, recientemente me he encontrado con un problema al usar xbrowse, la tabla que muestra tiene 1800 registros, y sucede que al seleccionar el registro 15 o cualquier otro y dar doble click abre mi dialogo de edicion, hasta ahi todo correcto, pero extrañamente el browse ha realizado un salto de un registro, cuando por ejemplo el primero en el browse era el registro uno, ahora es el registro dos.
adjunto unas imagenes para que lo observen
http://img405.imageshack.us/slideshow/webplayer.php?id=txb1.png

[img]
http://img405.imageshack.us/img405/8646/txb1.png
http://img200.imageshack.us/img200/2471/txb2.png
http://img834.imageshack.us/img834/2815/txb3.png
[/img]

el salto tambien ocurre cuando teniendo el browse solamente y muevo el cursor del mouse hacia arriba del browse llegando a la toolbar, al llegar a la toolbar el salto ocurre, esto lo muestro en la 3er grafica, el mouse nose mira, pero puse una flechita para referencia.

revisando, el salto no ocurre cuando me muevo por el browse conlas teclas doy ENTER para editar el registro abriendose el dialogo de edicion, esto me llevo a revisar los metodos de txbrowse que involucran el uso del mouse
llegando al siguiente codigo

Code: Select all  Expand view

METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TXBrowse

   local oCol
   local nLen, nFor, nPos
   local cTxt  // tooltip CELL
   local nVMove, nHMove, nOldRowPos,  nOldColPos
   local nMousePos := ::MouseRowPos( nRow )

   //KDS  TrackMouseEvent( ::hWnd, TME_LEAVE )   <<------------------- aca lo comente y  ya no hace el salto

   if ::lDrag .or. ::lEditMode
      return Super:MouseMove( nRow, nCol, nKeyFlags )
   endif

   if ::oCapCol != nil
      ::oCapCol:MouseMove( nRow, nCol, nKeyFlags )
      return 0
   endif

   if ::nCaptured == 4
      ::HorzLine( nRow, 3 )
      return 0
   endif

   if ::lPressed
      // temporarily moved here
      TrackMouseEvent( ::hWnd, TME_LEAVE )
      //
      if ::nStartTime == 0
         ::nStartTime := GetTickCount()
      en
 


hay problema comentando la linea TrackMouseEvent( ::hWnd, TME_LEAVE )

este el codigo de mi modulo, aclaro que estoy usando una copia de txbrowse.prg sin modificar

Code: Select all  Expand view

/*-------------------------------------------------------------------------------------------------*/
#include "credicom.ch"

/*-------------------------------------------------------------------------------------------------*/
GLOBAL EXTERNAL oApp

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Clientes()
   LOCAL oFnt1
   PRIVATE oDlg, oBrw, oMsg, oBus

   CIUD->( OrdSetFocus( "NUM_CIUD" ), DBGoTop() )
   RUTA->( OrdSetFocus( "NUM_RUTA" ), DBGoTop() )
   GEST->( OrdSetFocus( "NUM_GEST" ), DBGoTop() )
   COBR->( OrdSetFocus( "NUM_COBR" ), DBGoTop() )
   PRES->( OrdSetFocus( "CLIEPRES" ), DBGoTop() )
   CLIE->( OrdSetFocus( "NUM_CLIE" ), DBGoTop() )

   DBSELECT "RUTA"
   SET RELATION TO NUM_COBR INTO COBR

   DBSELECT "CLIE"
   SET RELATION TO NUM_CIUD INTO CIUD,;
                   NUM_GEST INTO GEST,;
                   NUM_RUTA INTO RUTA

   DEFINE FONT oFnt1 NAME "Tahoma" SIZE 0,-12

   DEFINE DIALOG oDlg NAME "DLG_CLIENTESC" TITLE "Catalogo de clientes" OF oApp:oMainWnd ICON GetIcon() FONT oFnt1

   REDEFINE XBROWSE oBrw ID 101 OF oDlg ALIAS "CLIE" ON DBLCLICK Clientes_Editar( FALSE ) FONT oFnt1

   ADD TO oBrw DATA CLIE->NUM_CLIE                     TITLE "*Nº Cliente" SIZE 090 ORDER "NUM_CLIE" CENTER
   ADD TO oBrw DATA CLIE->NOMBRE                       TITLE "*Nombre"     SIZE 285 ORDER "NOMBRE"
   ADD TO oBrw DATA CLIE->CEDULA                       TITLE "*Cedula"     SIZE 120 ORDER "CEDULA"
   ADD TO oBrw DATA CIUD->NOMBRE                       TITLE "Ciudad"      SIZE 130
   ADD TO oBrw DATA RUTA->NOMBRE                       TITLE "Ruta"        SIZE 120
   ADD TO oBrw DATA IIf( !Empty( CLIE->NOTAS ), 1, 0 ) TITLE "Nota" SIZE 028 BITMAP IN "BMS_POSTIT"

   oBrw:SetRdd()
   oBrw:bKeyDown      := {|nKey| Clientes_ProcesaTecla( nKey ) }
   oBrw:nHeaderHeight := 25
   oBrw:lHScroll      := FALSE
   oBrw:lSeekUpper    := TRUE
   oBrw:bSeek         := {|cString| DbSeek( Upper( cString ) ) }
   oBrw:MyConfig( TRUE )

   oBrw:aCols[1]:nHeadStrAlign := AL_LEFT

   ACTIVATE DIALOG oDlg CENTER ON INIT Clientes_Toolbar()

   LimpiarAreas()

   RELEASE FONT oFnt1
   RELEASE oDlg, oBrw, oMsg, oBus

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Clientes_Toolbar()
   LOCAL oToolbar, oPopUpPrn, oPopUpPre

   DEFINE BUTTONBAR oToolBar OF oDlg SIZE 45, 45 2007

   DEFINE BUTTON NAME "TB_CLOSE"       OF oToolBar ACTION oDlg:END()                         TOOLTIP "Salir del modulo"
   DEFINE BUTTON NAME "TB_ADD"         OF oToolBar ACTION Clientes_Editar( TRUE  )           TOOLTIP "Registro de nuevo cliente" GROUP
   DEFINE BUTTON NAME "TB_EDIT"        OF oToolBar ACTION Clientes_Editar( FALSE )           TOOLTIP "Editar datos de cliente"
   DEFINE BUTTON NAME "TB_DELETE"      OF oToolBar ACTION Clientes_Borrar()                  TOOLTIP "Borrar datos de cliente"
   DEFINE BUTTON NAME "TB_PRINTERM"    OF oToolBar ACTION Dummy()                            TOOLTIP "Menu de listados" GROUP
   DEFINE BUTTON NAME "TB_TABLEPRES"   OF oToolBar ACTION Clientes_Prestamos()               TOOLTIP "Mostrar prestamos otorgados" GROUP
   DEFINE BUTTON NAME "TB_TABLESEARCH" OF oToolBar ACTION Clientes_BuscarXPrestamo()         TOOLTIP "Buscar por nº de prestamo"

   SET MSGBAR OF oDlg TO "INS=Nuevo, DEL=Borrar, ENTER=Editar, F2=Prestamos, F9=Refrescar" 2010

   DEFINE MSGITEM oBus OF oDlg:oMsgBar PROMPT "" SIZE 100 COLOR CLR_HBLUE, CLR_BLACK

   oDlg:SetControl( oBrw )

   oBrw:nTop    += 1
   oBrw:nHeight -= 1
   oBrw:oSeek   := oBus

   oToolBar:bRClicked:={|| TRUE }
   oToolBar:bLClicked:={|| TRUE }

RETURN

/*-------------------------------------------------------------------------------------------------*/

PROCEDURE Clientes_ProcesaTecla( nKey )
   DO CASE
   CASE nKey == VK_INSERT
      Clientes_Editar( TRUE  )
   CASE nKey == VK_RETURN
      Clientes_Editar( FALSE )
   CASE nKey == VK_DELETE
      Clientes_Borrar()
   CASE nKey == VK_F2
      Clientes_Prestamos()
   CASE nKey == VK_F9
      Refrescar_Browse( oBrw )
   ENDCASE
RETURN
 

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1686
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: sobre comportamiento de txbrowse

Postby nageswaragunupudi » Wed Aug 10, 2011 9:29 am

May I know the version of FWH you are using?

Please see the method Refresh() in the xbrowse.prg and locate the line with the code:
::DelRePos()

Please comment out this line and link to your program. Can you let me know if the problem is resolved or not with this change?
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10248
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: sobre comportamiento de txbrowse

Postby jll-fwh » Wed Aug 10, 2011 2:03 pm

Hola carlos:

Comprueba el tema de los registros borrados en los indices.

Yo lo solucione indexando con ! FOR deleded()

Un saludo
JLL
Libreria: FWH/FWH1109 + Harbour 5.8.2 + Borland C++ 5.8.2
Editor de Recursos: PellecC
ADA, OURXDBU
S.O: XP / Win 7 /Win10
Blog: http://javierlloris.blogspot.com.es/
e-mail: javierllorisprogramador@gmail.com
User avatar
jll-fwh
 
Posts: 408
Joined: Fri Jan 29, 2010 8:14 pm
Location: Meliana - Valencia

Re: sobre comportamiento de txbrowse

Postby nageswaragunupudi » Wed Aug 10, 2011 2:54 pm

jll-fwh wrote:Hola carlos:

Comprueba el tema de los registros borrados en los indices.

Yo lo solucione indexando con ! FOR deleded()

Un saludo
JLL

Yes.
Finally I am going to come to a similar recommendation.
Before that I wanted to know the effect of ::DelRepos(). Some users have been occasionally facing this problem and I am trying to decide a final fix.

About ! Deleted() condition:

Having a for clause in an index expression renders the index useless for optimization purposes.
Better and time-tested solution is this:
Always create an additional index tag "INDEX ON DELETED() TAG DELETED"
And SET FILTER TO !DELETED() where we do not want any filter
and SET FILTER TO <expr> .AND. !DELETED() where we want a filter on <expr>.

Because we have an index on DELETED(), the filter is optimized and speed is better than having no filter.

Also OrdKeyNo() and OrdKeyCount() return accurate values.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10248
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: sobre comportamiento de txbrowse

Postby carlos vargas » Wed Aug 10, 2011 3:46 pm

sorry for my bad english.

ok, i use fwh 11.03


all my index tag used the clausule "for !deleted()" and a idex tag named "index on deleted() tag del" for optimize use, this is recomend for ads.


i try you recomend
Code: Select all  Expand view
Please see the method Refresh() in the xbrowse.prg and locate the line with the code:
::DelRePos()


but not work. :-(
only work comment the first call to TrackMouseEvent( ::hWnd, TME_LEAVE ) in the method mousemove

salu2
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1686
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: sobre comportamiento de txbrowse

Postby nageswaragunupudi » Wed Aug 10, 2011 4:23 pm

Mr Carlos

This problem occurs on specific tables. Not easy to reproduce on any table. I am not able to reproduce.
But let me keep trying to find the right fix.

Modification of TrackMouseEvent appears to fix this issue, but that is not the correct fix.
The real problem is in the Refresh() method.

I get back when i find the right table to reproduce and fix it.

Offtopic:
If you are using ADS, please avoid using FOR condtion. Indexes with for and while conditions will NOT be used for optimization of filters.
It is enough to have one separate tag on deleted() and add !deleted() to every filter condition. Sameway set filter to !deleted() instead of clearing all filters.

About English: Do not worry. I am also not good at English. It is enough if we understand each other to help each other.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10248
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: sobre comportamiento de txbrowse

Postby carlos vargas » Wed Aug 10, 2011 10:59 pm

ok, thanks for the recomend about the for deleted() clause in index ....
i can send by email the dd with the tables, please sendme a email address.

thanks you
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1686
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: sobre comportamiento de txbrowse

Postby nageswaragunupudi » Wed Aug 10, 2011 11:41 pm

nageswaragunupudi at gmail dot co,
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10248
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: sobre comportamiento de txbrowse

Postby nageswaragunupudi » Thu Aug 11, 2011 3:47 am

Mr Carlos

I just received your data. I shall make my tests later.

Meanwhile, please let me know if you are using ADS in the above sample.

If you are using ADS in the above sample, please add these two lines of code after REDEFINE oBrw.
Code: Select all  Expand view
oBrw:bKeyNo    := {| n | iif( n == nil, ( oBrw:cAlias )->( OrdKeyNo() ), ( oBrw:cAlias )->( OrdKeyGoto( n )
oBrw:bKeyCount := {|| ( oBrw:cAlias )->( OrdKeyCount() ) }
 


REDEFINE oBrw ..... ALIAS <alias>
command executes SetRDD() also.

Please remove the SetRDD() call at the end.

and test after this change.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10248
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: sobre comportamiento de txbrowse

Postby carlos vargas » Thu Aug 11, 2011 3:11 pm

yes, i use ads in client/remote in lan

error with oBrw:bKeyNo:
Application
===========
Path and name: D:\misapp\credicom\credicom.Exe (32 bits)
Size: 3,431,424 bytes
Time from start: 0 hours 0 mins 3 secs
Error occurred at: 11/08/2011, 08:59:54
Error description: Error BASE/1004 Class: 'NIL' has no exported method: EVAL
Args:
[ 1] = U

Stack Calls
===========
Called from: => EVAL(0)
Called from: source\xbrowse.prg => TXBROWSE:PAINT(1343)
Called from: source\xbrowse.prg => TXBROWSE:DISPLAY(1216)
Called from: source\control.prg => TCONTROL:HANDLEEVENT(1525)
Called from: source\xbrowse.prg => TXBROWSE:HANDLEEVENT(11297)
Called from: .\source\classes\WINDOW.PRG => _FWH(3418)
Called from: => DIALOGBOXINDIRECT(0)
Called from: .\source\classes\DIALOG.PRG => TDIALOG:ACTIVATE(275)
Called from: .\source\function\ERRSYSW.PRG => ERRORDIALOG(379)
Called from: .\source\function\ERRSYSW.PRG => (b)ERRORSYS(27)
Called from: => EVAL(0)
Called from: source\xbrowse.prg => TXBROWSE:PAINT(1343)
Called from: source\xbrowse.prg => TXBROWSE:DISPLAY(1216)
Called from: source\control.prg => TCONTROL:HANDLEEVENT(1525)
Called from: source\xbrowse.prg => TXBROWSE:HANDLEEVENT(11297)
Called from: .\source\classes\WINDOW.PRG => _FWH(3418)
Called from: => DIALOGBOX(0)

Code: Select all  Expand view


PROCEDURE Clientes()
   LOCAL oFnt1
   PRIVATE oDlg, oBrw, oMsg, oBus

   CIUD->( OrdSetFocus( "NUM_CIUD" ), DBGoTop() )
   RUTA->( OrdSetFocus( "NUM_RUTA" ), DBGoTop() )
   GEST->( OrdSetFocus( "NUM_GEST" ), DBGoTop() )
   COBR->( OrdSetFocus( "NUM_COBR" ), DBGoTop() )
   PRES->( OrdSetFocus( "CLIEPRES" ), DBGoTop() )
   CLIE->( OrdSetFocus( "NUM_CLIE" ), DBGoTop() )

   DBSELECT "RUTA"
   SET RELATION TO NUM_COBR INTO COBR

   DBSELECT "CLIE"
   SET RELATION TO NUM_CIUD INTO CIUD,;
                   NUM_GEST INTO GEST,;
                   NUM_RUTA INTO RUTA

   DEFINE FONT oFnt1 NAME "Tahoma" SIZE 0,-12

   DEFINE DIALOG oDlg NAME "DLG_CLIENTESC" TITLE "Catalogo de clientes" OF oApp:oMainWnd ICON GetIcon() FONT oFnt1

   REDEFINE XBROWSE oBrw ID 101 OF oDlg ALIAS "CLIE" ON DBLCLICK Clientes_Editar( FALSE ) FONT oFnt1

   ADD TO oBrw DATA CLIE->NUM_CLIE                     TITLE "*Nº Cliente" SIZE 090 ORDER "NUM_CLIE" CENTER
   ADD TO oBrw DATA CLIE->NOMBRE                       TITLE "*Nombre"     SIZE 285 ORDER "NOMBRE"
   ADD TO oBrw DATA CLIE->CEDULA                       TITLE "*Cedula"     SIZE 120 ORDER "CEDULA"
   ADD TO oBrw DATA CIUD->NOMBRE                       TITLE "Ciudad"      SIZE 130
   ADD TO oBrw DATA RUTA->NOMBRE                       TITLE "Ruta"        SIZE 120
   ADD TO oBrw DATA IIf( !Empty( CLIE->NOTAS ), 1, 0 ) TITLE "Nota"        SIZE 028 BITMAP IN "BMS_POSTIT"

   oBrw:bKeyNo        := {| n | iif( n == nil, CLIE->( OrdKeyNo() ), CLIE->( OrdKeyGoto( n ) ) ) }
   oBrw:bKeyCount     := {|| CLIE->( OrdKeyCount() ) }
   oBrw:bKeyDown      := {|nKey| Clientes_ProcesaTecla( nKey ) }
   oBrw:nHeaderHeight := 25
   oBrw:lHScroll      := FALSE
   oBrw:lSeekUpper    := TRUE
   oBrw:bSeek         := {|cString| DbSeek( Upper( cString ) ) }
   oBrw:MyConfig( TRUE )

   oBrw:aCols[1]:nHeadStrAlign := AL_LEFT

   ACTIVATE DIALOG oDlg CENTER ON INIT Clientes_Toolbar()

   LimpiarAreas()

   RELEASE FONT oFnt1
   RELEASE oDlg, oBrw, oMsg, oBus

RETURN
 


I procure not touch the original class, i use the extende instruction of xharbour for modify the class
examples:

Code: Select all  Expand view

...
   EXTEND CLASS TXBROWSE   WITH METHOD MyConfig
   EXTEND CLASS TXBROWSE   WITH METHOD SetMyBmpSort
...
/*-------------------------------------------------------------------------------------------------*/

FUNCTION SetMyBmpSort()
   LOCAL Self := HB_QSelf()
   LOCAL oBmp, hBmp

   ::aSortBmp := {}

   DEFINE BITMAP oBmp NAME "BMS_UP"
   hBmp  := oBmp:hBitmap
   AAdd( ::aSortBmp, { hBmp, 0, nBmpWidth( hBmp ), nBmpHeight( hBmp ), NIL, FALSE } )

   DEFINE BITMAP oBmp NAME "BMS_DOWN"
   hBmp  := oBmp:hBitmap
   AAdd( ::aSortBmp, { hBmp, 0, nBmpWidth( hBmp ), nBmpHeight( hBmp ), NIL, FALSE } )

RETURN NIL

/*-------------------------------------------------------------------------------------------------*/

FUNCTION MyConfig( lOrder, nFreeze, lCell )
   LOCAL Self := HB_QSelf()

   DEFAULT lOrder  := FALSE,;
           nFreeze := 0, ;
           lCell   := FALSE

   ::lRecordSelector        := FALSE
   ::nStretchCol            := STRETCHCOL_LAST
   ::nColDividerStyle       := LINESTYLE_DARKGRAY
   ::lColDividerComplete    := TRUE
   ::bClrHeader             := { || { CLR_BLUE,  CLR_BROWTIT, CLR_BLACK } }
   ::bClrSelFocus           := { || { CLR_WHITE, CLR_CYAN               } }
   ::bClrFooter             := { || { CLR_RED,   CLR_BROWTIT, CLR_BLACK } }
   ::bClrSel                := { || { CLR_WHITE, CLR_BLACK              } }
   ::l2007                  := TRUE
   ::lAllowColHiding        := FALSE
   ::lAllowColSwapping      := FALSE
   ::lAllowRowSizing        := FALSE
   ::lAllowCopy             := FALSE
   ::lKinetic               := FALSE
   ::lKineticBrw            := FALSE
   ::nFreeze                := nFreeze
   IF !lCell
      ::nMarqueeStyle       := MARQSTYLE_HIGHLROW
   ENDIF
   IF lOrder
      ::SetMyBmpSort()
   ENDIF
RETURN NIL
 


a question, in client/server is correct this codes: i have dude in the use of rlock o flock in c/s with ads is necesary?
in a transacction, is correct my implementation?
sorry for my questyon, is my first use of ads:

Code: Select all  Expand view

/*-------------------------------------------------------------------------------------------------*/
#include "credicom.ch"

/*-------------------------------------------------------------------------------------------------*/
GLOBAL oApp, oUser, hConnADS

/*-------------------------------------------------------------------------------------------------*/
STATIC oMutex

/*-------------------------------------------------------------------------------------------------*/

REQUEST  ADS, HB_LANG_ESWIN, HB_CODEPAGE_ESWIN
REQUEST  DBFCDX, DBFFPT
EXTERNAL AdsKeyNo, AdsKeyCount, AdsGetRelKeyPos, AdsSetRelKeyPos
....
FUNCTION Main_Configure()

   HB_Langselect(  "ESWIN" )
   HB_Setcodepage( "ESWIN" )

   RddSetDefault( "ADS" )

   #ifndef __WITH_SERVER__
   SET SERVER LOCAL
   #else
   SET SERVER REMOTE
   #endif
   SET FILETYPE TO ADT
   SET RIGHTS CHECKING OFF
   SET AXS LOCKING OFF
   SET DEFAULT  TO .\DATOS\

   SET DATE     BRIT
   SET EPOCH    TO 1964
   SET DECIMAL  TO 4
   SET TRACE    OFF
   SET SOFTSEEK OFF
   SET CENTURY  ON
   SET OPTIMIZE ON
   SET CONFIRM  ON
   SET DELETED  ON
   SET FIXED    ON

   SET( _SET_FILECASE, 1 )
   SET( _SET_DIRCASE,  1 )
...
 


Code: Select all  Expand view

FUNCTION Clientes_Grabar( lNuevo )
   LOCAL lGrabado := FALSE

   TRY
      AdsBeginTransaction()

      IF lNuevo
         IF CTRL->( DBLockRec() ) .and. CLIE->( DBAppendRec() )
            CTRL->CONT_CLIE  += 1
            CLIE->NUM_CLIE   := cNumCli
            CLIE->NOMBRE     := LTrim( cNomCli )
            CLIE->DOMICILIO  := LTrim( cDomCli )
            DBCommitAll()
            DBUnlockAll()
            lGrabado := TRUE
         ELSE
            DBUnlockAll()
         ENDIF
      ELSE
         IF CLIE->( DBLockRec() )
            CLIE->NOMBRE     := LTrim( cNomCli )
            CLIE->DOMICILIO  := LTrim( cDomCli )
            CLIE->( DBCommit(), DBUnlock() )
            lGrabado := TRUE
         ENDIF
      ENDIF

      AdsCommitTransaction()

   CATCH oError
      AdsRollBack()
      ShowError( oError )
   END

   IF lGrabado
      oBrw:Refresh()
      SysRefresh()
   ENDIF

RETURN lGrabado
 
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1686
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 73 guests