Mr. Rao:
Where I can find an example to use xbrowse with recordset, not with arrays.
My tolos, FWH 1507, Harbour and BCC5.5
Regards
If cMode = "V"
cTITLE := "DRIVERS Records Browse for Agency "+xAGENCY+" -- READ ONLY"
Else
cTITLE := "DRIVERS Records Browse for Agency "+xAGENCY
Endif
DEFINE ICON oICO RESOURCE "CROWN"
DEFINE WINDOW oWndChild ;
MDICHILD ;
NOZOOM ;
NOMINIMIZE ;
FROM 0,1 to 32,98 ;
ICON oICO ;
OF oWnd ;
TITLE cTitle
DEFINE DIALOG oDlg RESOURCE "DRVRBROW" of oWndChild
REDEFINE xBROWSE oLBX ;
RECORDSET oRsDrv ;
COLUMNS "LNAME", ;
"FNAME", ;
"LICENSE", ;
"TRAIN1", ;
"TRAIN2", ;
"ACTIVE" ;
COLSIZES 150,150,100,80,80,50 ;
HEADERS "Lname", ;
"Fname", ;
"Drv License", ;
"Drv Train", ;
"Adv Train", ;
"Active" ;
ID 111 of oDlg ;
AUTOSORT AUTOCOLS LINES CELL
oLbx:lHScroll := .f. // turn off horiz scroll bar
oLbx:nMarqueeStyle := MARQSTYLE_HIGHLROW
oLbx:lRecordSelector := .f.
oCol1 := oLbx:aCols[ 4 ]
oCol1:bStrData := { |x| x := if(oRsDrv:eof, ,TtoDate(oRsDrv:Fields("Train1"):Value)),;
If( Empty(x), ctod(""),x ) }
oCol2 := oLbx:aCols[ 5 ]
oCol1:bStrData := { |x| x := if(oRsDrv:eof, ,TtoDate(oRsDrv:Fields("Train2"):Value)),;
If( Empty(x), ctod(""),x ) }
oLbx:lFooter := .t.
oCol := oLbx:aCols[ 1 ]
oCol:bFooter := { || Ltrim( Str( oLbx:KeyNo() ) ) + " / " + LTrim( Str( oLbx:KeyCount() ) ) }
oLbx:bChange := { || oCol:RefreshFooter() }
oLbx:bClrGrad := { | lInvert | If( ! lInvert, ;
{ { 0.50, 15790320, 15790320 }, ;
{ 0.50, 15790320, 15790320 } }, ;
{ { 0.50, 15790320, 15790320 }, ;
{ 0.50, 15790320, 15790320 } } ) }
oLbx:aCols[4]:nDataStrAlign := AL_LEFT
oLbx:aCols[4]:nHeadStrAlign := AL_LEFT
oLbx:aCols[5]:nDataStrAlign := AL_LEFT
oLbx:aCols[5]:nHeadStrAlign := AL_LEFT
oLbx:bLDblClick := { |nRow,nCol | _Drvrview( "V",oRsDrv,oBtn1,oBtn2,oBtn3,oBtn4,oBtn5 ) }
_BrowColor( oLbx )
REDEFINE BTNBMP oBTN1 ID 113 ;
RESOURCE "ADD16","DADD16","DADD16" ;
PROMPT "&Add" LEFT 2007;
ACTION ( _Drvrview("A",oRsDrv,oBtn1,oBtn2,oBtn3,oBtn4,oBtn5 ),; // add
oLBX:ReFresh(),( oLbx:SetFocus(), .F. ) ) ;
GRADIENT GreyButtonGrad()
REDEFINE BTNBMP oBTN2 ID 114 ;
RESOURCE "EDIT16","DEDIT16","DEDIT16" ;
PROMPT "&Edit" LEFT 2007;
ACTION ( _Drvrview("E",oRsDrv,oBtn1,oBtn2,oBtn3,oBtn4,oBtn5 ),; // edit
oLBX:ReFresh(),( oLbx:SetFocus()) );
GRADIENT GreyButtonGrad()
REDEFINE BTNBMP oBTN3 ID 115 ;
RESOURCE "VIEW16","DVIEW16","DVIEW16" ;
PROMPT "&View" LEFT 2007;
ACTION ( _Drvrview("V",oRsDrv,oBtn1,oBtn2,oBtn3,oBtn4,oBtn5 ),; // view
oLBX:ReFresh(),( oLbx:SetFocus(), .F. ) ) ;
GRADIENT GreyButtonGrad()
REDEFINE BTNBMP oBTN4 ID 116 ;
RESOURCE "DELETE16","DDELETE16","DDELETE16" ;
PROMPT "&Delete" LEFT 2007;
ACTION ( _DrvrDel( oRsDrv,oLbx ), ;
oLBX:ReFresh(),( oLbx:SetFocus(), .F. ) ) ;
GRADIENT GreyButtonGrad()
REDEFINE BTNBMP oBTN6 ID 117 ;
RESOURCE "CAR24","DCAR24","DCAR24" ;
PROMPT "A&ccident" LEFT 2007;
ACTION ( _AcciBrow( oRsDrv,oBtn1,oBtn2,oBtn3,oBtn4,oBtn5 )) ;
GRADIENT GreyButtonGrad()
REDEFINE BTNBMP oBTN5 ID 112 ;
RESOURCE "CANCEL","DCANCEL","DCANCEL" ;
PROMPT "&Quit" LEFT 2007;
ACTION ( lOK1 := .F., oWndChild:END() ) ;
GRADIENT GreyButtonGrad()
ACTIVATE DIALOG oDlg NOWAIT ;
VALID (!GETKEYSTATE( 27 )) // do not allow esc key here
ACTIVATE WINDOW oWndChild ;
ON INIT ( oDlg:Move( 0,0, oWndchild:nWidth, oWndchild:nHeight, .T. ),oLbx:SetFocus(), ;
oWndChild:bResized := {|| _ReSizeUm( oDlg,oWndChild,oLbx) }, ;
oDlg:refresh(.t.),oLbx:SetFocus());
VALID ( IIF( !lOK, _ExitPgm(.T., oRsDrv,oWndChild,@lOk ), .F. ))
Return( .T. )
//-----------------------
Static FUNCTION _ExitPgm( lCLEAN , oRsDrv, oWndchild,lOk )
LOCAL lOK1
lOK1 := .F.
IF lCLEAN = .T.
lOK := .T.
lOK1 := lOK
try
oRsDrv:CLose()
catch
end try
oWndChild:End()
ENDIF
RETURN( lOK1 )
DEFINE ICON oIco RESOURCE "QUICK"
DEFINE WINDOW oWndChildB ;
FROM 0,0 to 39,120 ;
MDICHILD ;
OF oWnd ;
ICON oIco ;
TITLE xTITLE
DEFINE DIALOG oWorkB RESOURCE "QUIKVIEW" of oWndChildB
REDEFINE xBROWSE oLBXB ;
RECORDSET oRsInvDetail ;
COLUMNS "QTY", ;
"INVENTORY ID", ;
"INVENTORY TYPE", ;
"ITEM DESCRIPTION", ;
"PRICE", ;
"LOCATION", ;
"COVERED BY WARRANTY", ;
"SCRAPPED" ;
COLSIZES 45,115,55,300,65,80,50,55 ;
HEADERS "Qty", ;
"Part Number", ;
"Type", ;
"Description", ;
"Price", ;
"Location", ;
"Warranty", ;
"Scrapped" ;
ID 172 of oWorkB ;
AUTOCOLS LINES CELL FASTEDIT
AEval( oLbxB:aCols, { |o| o:nEditType := EDIT_GET } )
// row numbers
ADD oCol to oLbxB AT 1 DATA oLbxB:KeyNo() HEADER 'Ln' size 23 //PICTURE '9999'
oLbxB:aCols[1]:nDataStrAlign := AL_LEFT
oLbxB:aCols[1]:nHeadStrAlign := AL_LEFT
WITH OBJECT oLbxB
:lTabLikeExcel := .t.
END
// row number
oLbxB:aCols[1]:nEditType := EDIT_NONE
// qty
oLbxB:aCols[2]:bOnPostEdit := {|o,v| If(_ChkSerial( v,oRsInvDetail,oLbxB),;
_InvtLook( v, oRsInvDetail, oRsInv, "2", oLbxB, @lTaxable,oTaxable,cLoc,;
oLabor,oParts,oMisc,oTax,oTotal,cTaxSet,oOther,oSubtotal,"",nRepairNumber,nAssignedTo), ) }
// part number
oLbxB:aCols[3]:bOnPreEdit := { || If(oRsInvDetail:Fields("Inventory Id"):Value = " ", , __Keyboard( Chr( VK_HOME ))) }
oLbxB:aCols[3]:bOnPostEdit := {|o,v| _InvtLook( v, oRsInvDetail, oRsInv, "3", oLbxB, @lTaxable, oTaxable, cLoc,;
oLabor,oParts,oMisc,oTax,oTotal,cTaxSet,oOther,oSubtotal,oRsCust,nRepairNumber,nAssignedTo) }
// type
oLbxB:aCols[4]:nEditType := EDIT_LISTBOX
oLbxB:aCols[4]:aEditListTxt := aType
oLbxB:aCols[4]:bOnPostEdit := {|o,v| _GetPullDown( v,oLbxB,oRsInvDetail ) }
// description
oLbxB:aCols[5]:nEditType := EDIT_GET
* oLbxB:aCols[5]:bOnPreEdit := { || If(oRsInvDetail:Fields("Item Description"):Value = " ", ,;
* __Keyboard( Chr( VK_HOME )) )}
oLbxB:aCols[5]:bOnPostEdit := {|o,v| _GetText( v,oLbxB,oRsInvDetail ) }
// labor
ADD oCol to oLbxB AT 6 HEADER 'Labor' size 50 //60
oLbxB:aCols[ 6 ]:nEditType := EDIT_GET_BUTTON
oLbxB:aCols[ 6 ]:bEditBlock := {|row, col, oCol| ;
If(oRsInvDetail:Fields("Inventory Type"):Value = "Labor",;
( nAmount := _LabrBrow( ;
nRepairNumber,;
aEmp,;
aTech,;
oRsInvDetail,;
"","","","","","I","A",oRsInvDetail:Fields("Key"):Value ),;
oRsInvDetail:Fields("Price"):Value := nAmount,;
oRsInvDetail:Update()), MsgInfo( "Type is not Labor")) } // repair
oLbxB:aCols[ 6 ]:addbmpfile( "clockview" )
oLbxB:aCols[ 6 ]:addbmpfile( "clockadd" )
oLbxB:aCols[ 6 ]:bBmpData := { | lValue | If( oRsInvDetail:Fields("IsLabor"):Value = .t., 1, 2 ) }
* oLbxB:aCols[ 6 ]:lBtnTransparent := .t.
// Price
oLbxB:aCols[7]:nEditType := EDIT_GET
oLbxB:aCols[7]:bOnPostEdit := {|o,p| _GetPrice( p,oLbxB,oRsInvDetail,oRsInv,lTaxable,oTaxable,;
oLabor,oParts,oMisc,oTax,oTotal,cTaxSet,oOther,oSubtotal) }
// extention
ADD oCol TO oLbxB AT 8 DATA {|x| x := _CalcExt( oRsInvDetail:Fields("Qty"):Value,;
oRsInvDetail:Fields("Price"):Value,oRsInvDetail )} HEADER 'Ext' size 65
oLbxB:aCols[8]:nEditType := EDIT_NONE
oLbxB:aCols[8]:nDataStrAlign := AL_RIGHT
oLbxB:aCols[8]:nHeadStrAlign := AL_RIGHT
// serial number
ADD oCol to oLbxB AT 9 HEADER 'Serial Num' size 60
oLbxB:aCols[ 9 ]:nEditType := EDIT_GET_BUTTON
oLbxB:aCols[ 9 ]:bEditBlock := {|row, col, oCol| _SerBrow(;
nRepairNumber,;
oRsInvDetail:Fields("Inventory Id"):Value,;
oRsInvDetail:Fields("Qty"):Value,;
oRsInvDetail:Fields("Key"):Value,;
oRsInvDetail,;
oBtn1,oBtn2,oBtn3,oBtn4,oBtn5,"I","A" ) } // repair
oLbxB:aCols[ 9 ]:addbmpfile( "zoom2" )
oLbxB:aCols[ 9 ]:addbmpfile( "adddbf" )
oLbxB:aCols[ 9 ]:bBmpData := { | lValue | If( oRsInvDetail:Fields("IsSerial"):Value = .t., 1, 2 ) }
* oLbxB:aCols[ 9 ]:lBtnTransparent := .t.
// location
oLbxB:aCols[10]:nEditType := EDIT_NONE
// warranty
oLbxB:aCols[11]:nEditType := EDIT_GET
if ! empty(oCol := oLbxB:oCol( "WARRANTY" ))
oCol:SetCheck( { "ON", "OFF" } )
oCol:cSortOrder := nil
endif
// scrapped
oLbxB:aCols[12]:nEditType := EDIT_NONE
if ! empty(oCol := oLbxB:oCol( "SCRAPPED" ))
oCol:SetCheck( { "ON", "OFF" } )
oCol:cSortOrder := nil
endif
// add a new record
oLbxB:bPastEof = {|| _AddNewRow( oRsInvDetail,nRepairNumber,nAssignedTo,cLoc,oLbxB,"N","" ) }
oLbxB:nColsel(2)
// boiler plate text
REDEFINE SAY oSay1 PROMPT "Sales Person" ID 129 OF oWorkB UPDATE
oSay1:SetFont( oFontB )
REDEFINE SAY oSay2 PROMPT "Inventory Location" ID 130 OF oWorkB UPDATE
oSay2:SetFont( oFontB )
REDEFINE SAY oSay3 PROMPT "Invoice Date" ID 132 OF oWorkB UPDATE
oSay3:SetFont( oFontB )
REDEFINE SAY oSay11 ID 146 OF oWorkB UPDATE // tax set
oSay11:SetFont( oFontB )
oSay11:SetColor(nRgb(7,7,224)) // blue
REDEFINE SAY oSay12 ID 133 OF oWorkB UPDATE // non tax
oSay12:SetFont( oFontB )
oSay12:SetColor(nRgb(7,7,224)) // blue
REDEFINE SAY oSay4 PROMPT "Parts" ID 169 OF oWorkB UPDATE
oSay4:SetFont( oFontB )
REDEFINE SAY oSay5 PROMPT "Labor" ID 171 OF oWorkB UPDATE
oSay5:SetFont( oFontB )
REDEFINE SAY oSay6 PROMPT "Misc" ID 174 OF oWorkB UPDATE
oSay6:SetFont( oFontB )
REDEFINE SAY oSay7 PROMPT "SubTot" ID 137 OF oWorkB UPDATE
oSay7:SetFont( oFontB )
REDEFINE SAY oSay8 PROMPT "Other" ID 134 OF oWorkB UPDATE
oSay8:SetFont( oFontB )
REDEFINE SAY oSay9 PROMPT "Tax" ID 176 OF oWorkB UPDATE
oSay9:SetFont( oFontB )
REDEFINE SAY oSay10 PROMPT "Total" ID 179 OF oWorkB UPDATE
oSay10:SetFont( oFontB )
// all gets
REDEFINE COMBOBOX oTech var cTech ID 127 of oWorkB ;
ITEMS aTech UPDATE
oTech:lIncSearch = .T.
REDEFINE COMBOBOX oLoc var cLoc ID 131 of oWorkB ;
ITEMS aLoc UPDATE
REDEFINE DTPICKER oDc VAR dDc ID 128 OF oWorkB PICTURE '@D' UPDATE
REDEFINE CHECKBOX oTaxable var lTaxable ID 167 of oWorkB ;
ON CLICK ( _ReCalcTotals( oRsInvDetail,oRsInv,@lTaxable,oTaxable,"CLICKED",oLbxB,;
oLabor,oParts,oMisc,oTax,oTotal,cTaxSet,oOther,oSubtotal) )
REDEFINE GET oParts var xParts ID 170 of oWorkB PICTURE "99,999,999.99" READONLY
REDEFINE GET oLabor var xLabor ID 173 of oWorkB PICTURE "99,999,999.99" READONLY
REDEFINE GET oMisc var xMisc ID 175 of oWorkB PICTURE "99,999,999.99" READONLY
REDEFINE GET oSubtotal var xSubtotal ID 138 of oWorkB PICTURE "99,999,999.99" READONLY
REDEFINE GET oOther var xOther ID 135 of oWorkB PICTURE "99,999,999.99" READONLY
REDEFINE GET oTax var xTax ID 177 of oWorkB PICTURE "99,999,999.99" READONLY
REDEFINE GET oTotal var xTotal ID 183 of oWorkB PICTURE "99,999,999.99" READONLY
REDEFINE SAY oSay11 ID 185 OF oWorkB UPDATE // ----------------
oSay11:SetFont( oFontB )
// tax set
REDEFINE COMBOBOX oTaxSet var cTaxSet ID 187 of oWorkB ;
ITEMS aTax ;
ON CHANGE _TaxSetUpdt( cTaxSet,oRsInvDetail,oRsInv,@lTaxable,oTaxable,oLbxB,;
oLabor,oParts,oMisc,oTax,oTotal,cTaxSet,oOther,oSubtotal ) UPDATE
REDEFINE BTNBMP oBtn1 ID 147 PROMPT "Lookup"+CRLF+"Parts" ;
RESOURCE "SEARCH","DSEARCH","DSEARCH" TOP ;
of oWorkB 2007 ;
ACTION ( _InvtFind( oWnd,"",oWndChildB,@aLoc,oRsInvDetail,;
oRsInv,@lTaxable,oTaxable,oLbxB,oFontB,oFontBig,nRepairNumber,;
oLabor,oParts,oMisc,oTax,oTotal,nAssignedTo,cLoc,cTaxSet,;
oOther,oSubtotal,lIsTrucker))
REDEFINE BTNBMP oBtn2 ID 158 PROMPT "Next" ;
RESOURCE "NEXT32" ;
of oWorkB 2007 ;
ACTION(_Invview( oWnd,oWndChildA,oWndChildB,oRsInv,;
oRsInvDetail,nRepairNumber,oLbxB,lTaxable,;
oTaxable,oFontB,cTaxSet,cLoc,dDc,cTech,aEmp,hDatas,cTaxDesc,xTitle,oTech))
REDEFINE BTNBMP oBtn3 ID 178 PROMPT "Cancel" ;
RESOURCE "EXIT" ;
of oWorkB 2007 ;
ACTION( hVar["lClosed"] := .f., oWndChildB:End() )
REDEFINE BTNBMP oBtn4 ID 145 PROMPT "Add"+CRLF+"Item" ;
RESOURCE "PLUS","DPLUS","DPLUS" TOP ;
of oWorkB 2007 ;
ACTION ( _AddNewRow( oRsInvDetail,nRepairNumber,nAssignedTo,cLoc,oLbxB,"N","" ) )
REDEFINE BTNBMP oBtn6 ID 140 PROMPT "Return"+CRLF+"Item" ;
RESOURCE "RETURN","DRETURN","DRETURN" TOP ;
of oWorkB 2007 ;
ACTION ( _AddNewRow( oRsInvDetail,nRepairNumber,nAssignedTo,cLoc,oLbxB,"N","RETURN" ) )
REDEFINE BTNBMP oBtn5 ID 186 PROMPT "Cancel"+CRLF+"Unsaved Line" ;
RESOURCE "MINUS32","DMINUS32","DMINUS32" TOP ;
of oWorkB 2007 ;
ACTION( _Manual( 46,oRsInvDetail,oRsInv,cLoc,oLbxB,nRepairNumber,nAssignedTo,;
oLabor,oParts,oMisc,oTax,oTotal,lTaxable,oTaxable,cTaxSet,oOther,oSubtotal))
ACTIVATE DIALOG oWorkB NOMODAL ;
ON INIT _ReCalcTotals(oRsInvDetail,oRsInv,@lTaxable,oTaxable,,oLbxB,;
oLabor,oParts,oMisc,oTax,oTotal,cTaxSet,oOther,oSubtotal ) ;
VALID(!GETKEYSTATE( 27 ))
ACTIVATE WINDOW oWndChildB ;
ON INIT ( oWorkB:Move( 0,0, oWndchildB:nWidth, oWndchildB:nHeight, .T. ), oLbxB:SetFocus(), ;
oWndChildB:bResized := {|| _ReSizeUm( oWorkB,oWndChildB,oLbxB) }, ;
oWorkB:refresh(.t.));
VALID ( IIF( !lOK, ExitPgm(.T.,oWndChildB,oRsInvDetail,oRsEmp,oWndChildA,oLbxb,@lOk,;
oRsInv,cLoc,hDatas ), .F. ))
RETURN( NIL )
//--------------------------------
Static FUNCTION ExitPgm( lOk3,oWndchildB,oRsInvDetail,oRsEmp,;
oWndChildA,oLbx,lOk,oRsInv,cLoc,hDatas )
// olbx is from the repair screen
LOCAL lOK1
local hVar := hDatas["var"]
*Msginfo( "Close tables emp,detail,inv Exitpgm after cancelum Quickview.prg ")
IF lOk3 = .T.
lOK := .T.
lOK1 := lOK
If hVar["lClosed"] = .t.
Else
If _CancelUm( oRsInvDetail,oRsInv,oLbx,oWndChildB,cLoc,oWndChildA )
Else
lOk3 := .f.
Return(.f.)
Endif
Endif
oRsEmp:CLose()
If oRsInvDetail:State() = 1 // open
oRsInvDetail:Close()
Endif
If oRsInv:State() = 1 // open
oRsInv:CLose()
Endif
oLbx:bKeyCount := { || 0 }
oLbx:bKeyNo := { || 0 }
oWndChildB:End()
oWndChildA:End()
ENDIF
RETURN( lOK1 )
//----------------
Static Func _AddNewRow( oRsInvDetail,nRN,nTech,cLocation,oBrw,cAsk,cReturn )
Local Saying,nEid,nKey
If empty( cAsk )
cAsk := "Y"
Endif
If empty(cReturn)
cReturn := "ADD"
Endif
If cAsk = "Y"
Saying := "Do you wish to Add a New Record ?"
If MsgYesNo( Saying )
Else
oBrw:SetFocus()
Return(.f.)
Endif
Endif
nKey := _GenKey(oRsInvDetail)
If nKey = -1
MsgInfo( "Error creating Invoice Detail KEY" )
Return(.f.)
Endif
* msginfo( "end Key" )
oRsInvDetail:AddNew()
*oRsInvDetail:Fields("InvDetailEid"):Value := nEid
oRsInvDetail:Fields("Key"):Value := nKey
oRsInvDetail:Fields("Repair Number"):Value := nRn
oRsInvDetail:Fields("Item Description"):Value := space(100)
If cReturn = "RETURN"
oRsInvDetail:Fields("Qty"):Value := -1
Else
oRsInvDetail:Fields("Qty"):Value := 1
Endif
oRsInvDetail:Fields("Price"):Value := 0
oRsInvDetail:Fields("Tech Number"):Value := nTech
oRsInvDetail:Fields("Inventory Id"):Value := space(50)
oRsInvDetail:Fields("Inventory Type"):Value := "Labor"
oRsInvDetail:Fields("Cost"):Value := 0
oRsInvDetail:Fields("Covered By Warranty"):Value := .f.
oRsInvDetail:Fields("Extension"):Value := 0
oRsInvDetail:Fields("Location"):Value := cLocation
oRsInvDetail:Fields("Code"):Value := space(25)
oRsInvDetail:Fields("NoTax"):Value := 0
oRsInvDetail:Fields("IsSerial"):Value := .f.
oRsInvDetail:Fields("IsLabor"):Value := .f.
oRsInvDetail:Fields("Scrapped"):Value := .f.
oRsInvDetail:Update()
oBrw:ReFresh()
oBrw:nColSel(3) // move to part number on add
oBrw:SetFocus()
Return(.t.)
//-------------------
Static Func _GenKey(oRsInvDetail)
LOCAL nRAND
LOCAL oRs, cSQL, oERR
If oRsInvDetail:Eof
nRand := 100
Else
nRand := oRsInvDetail:Fields("Key"):Value+1
Endif
Return(nRand)
//------------------------------
Static Func _ReSizeUm( oWorkB1,oWndChildB1,oLbxB1 )
oWorkB1:SetSize( oWndChildB1:nWidth, oWndChildB1:nHeight, .t. ) // frame and dialog link
// dialog controls
oWorkB1:bResized = { | nSizeType, nWidth, nHeight | ResizeControls( nSizeType, nWidth, nHeight, oWorkB1 ) }
oLbxB1:SetFocus()
Return(nil)
//-------------------------
Static Func ResizeControls( nSizeType, nWidth, nHeight, oWorkB1 )
if nSizeType = 0 //SIZE_MAXIMIZED
oWorkB1:aControls[ 1 ]:SetSize( nWidth - 170, nHeight - 295 ) //txbrowse
endif
Return(nil)
Return to FiveWin for Harbour/xHarbour
Users browsing this forum: Google [Bot] and 9 guests