Unicode support in FWH 14.09

Unicode support in FWH 14.09

Postby Antonio Linares » Sat Oct 11, 2014 11:38 am

Thanks to ruediger help we have already implemeted the core engine to support unicode in FWH apps:

Image

More screenshots soon :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby ShumingWang » Sun Oct 12, 2014 1:56 am

This is a great news for Chinese and other Asia users!
For a long time we could not use XP themes mode for tget class in the past.

TKS a lot!

Shuming Wang
http://www.xtech2.top
Mobile:(86)13802729058
Email:100200651@qq.com
QQ:100200651
Weixin: qq100200651
ShumingWang
 
Posts: 465
Joined: Sun Oct 30, 2005 6:37 am
Location: Guangzhou(Canton),China

Re: Unicode support in FWH 14.09

Postby richard-service » Sun Oct 12, 2014 6:26 am

Antonio,

A long time ago, I post question about Unicode and XP themes. I hope this will be help us.
May I get Unicode sample EXE for test?
Best Regards,

Richard

Harbour 3.2.0dev (r2402101027) => Borland C++ v7.7 32bit
MySQL v8.0 /ADS v10
Harbour 3.2.0dev (r2011030937) => Borland C++ v7.4 64bit
User avatar
richard-service
 
Posts: 803
Joined: Tue Oct 16, 2007 8:57 am
Location: New Taipei City, Taiwan

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Sun Oct 12, 2014 9:21 am

I need your help :-)

We are a making a very good progress with it, but I have found a simple problem that I can't solve yet.

See how I modified the Method SetText() and GetText() in Class TWindow:

Code: Select all  Expand view
  METHOD GetText() INLINE If( ! ::lUnicode, GetWindowText( ::hWnd ),;
                               GetWindowTextW( ::hWnd ) )


Code: Select all  Expand view
  METHOD SetText( cText ) INLINE ;
                           ::cCaption := cText,;
                           If( ::lUnicode,;
                               SetWindowTextW( ::hWnd, ::cCaption ),;
                               SetWindowText( ::hWnd, ::cCaption ) )


Now see how we have implemented SetWindowText():

Code: Select all  Expand view
HB_FUNC( SETWINDOWTEXTW )
{
   #ifndef _WIN64
      HWND hWnd = ( HWND ) hb_parnl( 1 );
   #else  
      HWND hWnd = ( HWND ) hb_parnll( 1 );
   #endif

   if( IsWindow( hWnd ) )
   {
      LPWSTR pW = HB_ISCHAR( 2 ) ? UTF8toUTF16( hb_parc( 2 ) ): L"";
     
      SetWindowTextW( ( HWND ) hb_parnl( 1 ), pW );
     
      if( HB_ISCHAR( 2 ) )
         hb_xfree( pW );
   }
}


So far so good. But the problem comes from GetWindowTextW(), see its code:
Code: Select all  Expand view
HB_FUNC( GETWINDOWTEXTW )
{
   #ifndef _WIN64
      HWND hWnd   = ( HWND ) hb_parnl( 1 );
   #else  
      HWND hWnd   = ( HWND ) hb_parnll( 1 );
   #endif
   LPWSTR pText;
   int iLen = IF( IsWindow( hWnd ), GetWindowTextLengthW( hWnd ), 0 );

   if( iLen > 0 )
   {
      pText = ( LPWSTR ) hb_xgrab( ( iLen * 2 ) + 2 );
      GetWindowTextW( hWnd, pText, ( iLen * 2 ) + 2 );
      MessageBoxW( 0, pText, L"from C", 0 );
      hb_retclen( pText, ( iLen * 2 ) + 2 );
      hb_xfree( pText );
   }
   else
      hb_retc( "" );
}


Notice that I have left a MessageBoxW() to check what we get, but it does not look right.

Any hint of what is missing ?

Thanks!
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Sun Oct 12, 2014 10:59 am

Unicode menus working fine :-)

Image
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Sun Oct 12, 2014 11:19 am

Unicode SAYs are working fine :-)

Image
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Mon Oct 13, 2014 12:50 am

Would you like to test it and help to complete the missing parts ? thanks :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby richard-service » Mon Oct 13, 2014 3:42 am

Antonio Linares wrote:Would you like to test it and help to complete the missing parts ? thanks :-)


I think I can test it.But not easy. Yesterday, I ask Charles about it. Show Unicode Character easy,but Edit Character not easy.
I remember Patrick Fan( Visual Fivewin ) from HongKong, he finished Unicode+ XP Themes solution.
Harbour MiniGUI working for XP Themes and Chinese 2byte control( Left/Right/Backspace key ), Unicode not work.
Best Regards,

Richard

Harbour 3.2.0dev (r2402101027) => Borland C++ v7.7 32bit
MySQL v8.0 /ADS v10
Harbour 3.2.0dev (r2011030937) => Borland C++ v7.4 64bit
User avatar
richard-service
 
Posts: 803
Joined: Tue Oct 16, 2007 8:57 am
Location: New Taipei City, Taiwan

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Mon Oct 13, 2014 8:59 am

Basically I need help on this. It is not working, I have done all kind of tests, and I can't understand why it does nor work:

If you uncomment the call to MessageBoxW() it should properly show the text of the control, but it does not appear right. I am testing it with a unicode standard push button.

Code: Select all  Expand view
LPSTR UTF16toUTF8( LPWSTR utf16 )
{
   WORD wUtf16Len = wcslen( utf16 );
   WORD wUtf8Len = WideCharToMultiByte( CP_UTF8, 0, utf16, wUtf16Len,
                                        NULL, 0, NULL, NULL );
   LPSTR pString = ( LPSTR ) hb_xgrab( wUtf8Len + 1 );

   pString[ 0 ] = 0;

   WideCharToMultiByte( CP_UTF8, 0, utf16, wUtf16Len,
                        pString, wUtf8Len, 0, 0 );
   return pString;
}


Code: Select all  Expand view
HB_FUNC( GETWINDOWTEXTW )
{
   #ifndef _WIN64
      HWND hWnd   = ( HWND ) hb_parnl( 1 );
   #else  
      HWND hWnd   = ( HWND ) hb_parnll( 1 );
   #endif
   LPWSTR pText;
   LPSTR szText;
   int iLen = IF( IsWindow( hWnd ), GetWindowTextLengthW( hWnd ), 0 );

   if( iLen > 0 )
   {
      pText = ( LPWSTR ) hb_xgrab( ( iLen * 2 ) + 2 );
      GetWindowTextW( hWnd, pText, ( iLen * 2 ) + 2 );
      szText = UTF16toUTF8( pText );
      // MessageBoxW( 0, pText, L"GetWindowTextW", 0 );
      hb_retclen( szText, strlen( szText ) + 1 );
      hb_xfree( pText );
      hb_xfree( szText );
   }
   else
      hb_retc( "" );
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby Enrico Maria Giordano » Mon Oct 13, 2014 5:57 pm

Antonio,

can you build a PRG sample to test it here?

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8710
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Mon Oct 13, 2014 9:45 pm

Enrico,

The new FWH 14.09 libs are required in order to run the first example unicode.prg

Today Dave (BP Dave) sent me a very interesting link that maybe helps me to solve the problem:
http://www.nubaria.com/en/blog/?p=289

Here is the code for unicode.prg though it can't be built without FWH 14.09. Using Unicode in FWH 14.09 is as easy as doing: FW_SetUnicode( .T. )

unicode.prg
Code: Select all  Expand view
// Save this file with UTF-8 coding
//
// ToDo: DT_RTLREADING
//

#include "FiveWin.ch"

//----------------------------------------------------------------------------//

function Main()

   local oWnd
   local aArray, aArray2
   local lUnicode := .T.
   local cCad1, oBtn, cText, oBrw, oCbx, oSay, oGet

   aArray := { { "China: ",   "中国版 (China)"   },;
               { "Hong Kong", "香港版 (Hong Kong)"   },;
               { "Japan:",    "日本 (Japan)"   },;
               { "Korea:",    "한국 (Korea)"   },;
               { "Taiwan:",   "台灣版 (Taiwan)"   },;
               { "Israel:",   "ישראל (Israel)"   },;
               { "Greece:",   "Ελλάδα (Greece)"   },;
               { "Arabic:",   "العالم العربي (Arabic)"   },;
               { "Russia:",   "Россия (Russia)"   },;
               { "India:",    "हिन्दी (India)"   },;
               { "India:",    "தமிழ் (India)"   },;
               { "India:",    "മലയാളം (India)"   },;
               { "India:",    "తెలుగు (India)" } }

   FW_SetUnicode( .T. )
   
   aArray2 := {}
   AEVAL( aArray, { |x| AADD(aArray2,x[2]) } )

   DEFINE WINDOW oWnd FROM 3, 6 TO 36, 70 ;
      TITLE "Unicode Window - " + aArray[ 1, 2 ] ;
      MENU BuildMenu( oWnd, aArray )

   SET MESSAGE TO "Message - " + aArray[ 1, 2 ] OF oWnd

   @ 1, 3 SAY aArray[ 1, 2 ]
   @ 2, 3 SAY aArray[ 2, 2 ]
   @ 3, 3 SAY aArray[ 3, 2 ]
   @ 4, 3 SAY aArray[ 4, 2 ]
   @ 5, 3 SAY aArray[ 5, 2 ]

   @ 1, 30 SAY aArray[ 6, 2 ]
   @ 2, 30 SAY aArray[ 7, 2 ]
   @ 3, 30 SAY aArray[ 8, 2 ]
   @ 4, 30 SAY aArray[ 9, 2 ]
   @ 5, 30 SAY aArray[ 10, 2 ]

   @ 1, 50 SAY aArray[ 11, 2 ]
   @ 2, 50 SAY aArray[ 12, 2 ]
   @ 3, 50 SAY aArray[ 13, 2 ]
   
   cText := aArray2[1]

   @ 7.5, 2 COMBOBOX oCbx VAR cText OF oWnd ;
      ITEMS aArray2 SIZE 250, 150 ;
         ON CHANGE ( oWnd:SetText( aArray2[ oCbx:nAt ] ),;
                     oWnd:oMsgBar:SetMsg( aArray2[ oCbx:nAt ] ),;
                     oBtn:SetText( aArray2[ oCbx:nAt ] ), oGet:SetText( aArray2[ oCbx:nAt ] ) )

   cCad1 := PADR( aArray[1,2], 100 )

   @  10, 2 SAY oSay PROMPT aArray[1,2]+":" OF oWnd

   @  11.2, 16 GET oGet VAR cCad1 OF oWnd SIZE 200, 24

   @  16, 4 LISTBOX oBrw ;
      FIELDS "", "" ;
      HEADERS aArray[1,2], aArray[3,2];
      FIELDSIZES 150 ;
      OF oWnd;
      SIZE 400, 160

   oBrw:SetArray( aArray )

   oBrw:nAt           := 1
   oBrw:bLine         := { || { aArray[ oBrw:nAt ][1], aArray[ oBrw:nAt ][2] } }
   oBrw:bGoTop        := { || oBrw:nAt := 1 }
   oBrw:bGoBottom     := { || oBrw:nAt := Eval( oBrw:bLogicLen ) }
   oBrw:bSkip         := { | nWant, nOld | nOld := oBrw:nAt, oBrw:nAt += nWant,;
                            oBrw:nAt := Max( 1, Min( oBrw:nAt, Eval( oBrw:bLogicLen ) ) ),;
                            oBrw:nAt - nOld }
   oBrw:bLogicLen     := { || Len( aArray ) }
   oBrw:cAlias        := "Array"                // Just put something
   oBrw:lUnicode       := lUnicode

   @ 23, 6 BUTTON oBtn PROMPT aArray[ 1, 2 ] SIZE 130, 24 OF oWnd ;
      ACTION MsgInfoW( oBtn:GetText() ) // oBtn:SetText( aArray[ 2, 2 ] ) // oBnMsgInfoW( oBtn:SetText( oBtn:GetText() ), aArray[ 1, 2 ] )
     
   @ 23, 45 BUTTON ">>> Dialog-Test" SIZE 130, 24 OF oWnd ;
      ACTION UnicodeDialog( aArray, aArray2, lUnicode )

   oWnd:Center()

   ACTIVATE WINDOW oWnd

return nil

//----------------------------------------------------------------------------//

function UnicodeDialog( aArray, aArray2, lUnicode )

   local oDlg, oBtn, oBrw, oCbx, cCad1, oGet, oSay, cText

   DEFINE DIALOG oDlg FROM 3, 6 TO 37, 70 ;
      TITLE "Unicode Dialog - " + aArray[ 1, 2 ]

   @ 10, 15 SAY aArray[ 1, 2 ] PIXEL
   @ 18, 15 SAY aArray[ 2, 2 ] PIXEL
   @ 26, 15 SAY aArray[ 3, 2 ] PIXEL
   @ 34, 15 SAY aArray[ 4, 2 ] PIXEL
   @ 42, 15 SAY aArray[ 5, 2 ] PIXEL

   @ 10, 85 SAY aArray[ 6, 2 ] PIXEL
   @ 18, 85 SAY aArray[ 7, 2 ] PIXEL
   @ 26, 85 SAY aArray[ 8, 2 ] PIXEL
   @ 34, 85 SAY aArray[ 9, 2 ] PIXEL
   @ 42, 85 SAY aArray[ 10, 2 ] PIXEL

   @ 10, 180 SAY aArray[ 11, 2 ] PIXEL
   @ 18, 180 SAY aArray[ 12, 2 ] PIXEL
   @ 26, 180 SAY aArray[ 13, 2 ] PIXEL

   cText = aArray2[ 1 ]

   @ 4, 2 COMBOBOX oCbx VAR cText OF oDlg;
      ITEMS aArray2 SIZE 150, 50;
      ON CHANGE ( oDlg:SetText( aArray2[oCbx:nAt] ), oDlg:oMsgBar:SetMsg( aArray2[oCbx:nAt] ), oBtn:SetText( aArray2[oCbx:nAt] ), oGet:SetText( aArray2[oCbx:nAt] ) )

   cCad1 := PADR( aArray[1,2], 100 )

   @  5.1, 2 SAY oSay PROMPT aArray[1,2]+":" OF oDlg

   @  6, 9 GET oGet VAR cCad1 OF oDlg SIZE 100, 12

   @  9, 4 LISTBOX oBrw ;
      FIELDS "", "" ;
      HEADERS aArray[1,2], aArray[3,2];
      FIELDSIZES 150 ;
      /*FONT oFont*/ OF oDlg;
      SIZE 200, 80

   oBrw:SetArray( aArray )

   oBrw:nAt           := 1
   oBrw:bLine         := { || { aArray[ oBrw:nAt ][1], aArray[ oBrw:nAt ][2] } }
   oBrw:bGoTop        := { || oBrw:nAt := 1 }
   oBrw:bGoBottom     := { || oBrw:nAt := Eval( oBrw:bLogicLen ) }
   oBrw:bSkip         := { | nWant, nOld | nOld := oBrw:nAt, oBrw:nAt += nWant,;
                            oBrw:nAt := Max( 1, Min( oBrw:nAt, Eval( oBrw:bLogicLen ) ) ),;
                            oBrw:nAt - nOld }
   oBrw:bLogicLen     := { || Len( aArray ) }
   oBrw:cAlias        := "Array"                // Just put something
   oBrw:lUnicode       := lUnicode

   @ 12,6 BUTTON oBtn PROMPT aArray2[ 1 ] SIZE 100,14 OF oDlg ;
      ACTION MsgInfoW( oBtn:GetText(), aArray[ 1, 2 ] )

   @ 12,31 BUTTON "Close" size 30,14 OF oDlg ACTION oDlg:End()

   ACTIVATE DIALOG oDlg CENTERED;
      ON INIT ( oDlg:oMsgBar := TMsgBar():New( oDlg, "Message - "+aArray[1,2], .F., .F., .F., .F.,,,, .F. ),;
                oDlg:SetMenu( BuildMenu( oDlg, aArray, lUnicode ) ) )

return nil

//----------------------------------------------------------------------------//

function BuildSays( oWnd, hDC, aArray )

   oWnd:Say( 1, 3, aArray[ 1, 2 ],,,  , .F., .T. )
   oWnd:Say( 2, 3, aArray[ 2, 2 ],,,  , .F., .T. )
   oWnd:Say( 3, 3, aArray[ 3, 2 ],,,  , .F., .T. )
   oWnd:Say( 4, 3, aArray[ 4, 2 ],,,  , .F., .T. )
   oWnd:Say( 5, 3, aArray[ 5, 2 ],,,  , .F., .T. )

   oWnd:Say( 1, 30, aArray[ 6, 2 ],,,  , .F., .T. )
   oWnd:Say( 2, 30, aArray[ 7, 2 ],,,  , .F., .T. )
   oWnd:Say( 3, 30, aArray[ 8, 2 ],,,  , .F., .T. )
   oWnd:Say( 4, 30, aArray[ 9, 2 ],,,  , .F., .T. )
   oWnd:Say( 5, 30, aArray[ 10, 2 ],,, , .F., .T. )

   oWnd:Say( 1, 50, aArray[ 11, 2 ],,, , .F., .T. )
   oWnd:Say( 2, 50, aArray[ 12, 2 ],,, , .F., .T. )
   oWnd:Say( 3, 50, aArray[ 13, 2 ],,, , .F., .T. )

return nil

//----------------------------------------------------------------------------//

function BuildMenu( oWnd, aArray, lUnicode )

   local oMenu, oMenuItem

   MENU oMenu

      MENUITEM aArray[ 1, 2 ] MESSAGE aArray[ 1, 2 ]

      MENU
         MENUITEM  aArray[ 1, 2 ] MESSAGE aArray[ 1, 2 ]
         MENUITEM  aArray[ 2, 2 ] MESSAGE aArray[ 2, 2 ]
         MENUITEM  aArray[ 3, 2 ] MESSAGE aArray[ 3, 2 ]
         MENUITEM  aArray[ 4, 2 ] MESSAGE aArray[ 4, 2 ]
         MENUITEM  aArray[ 5, 2 ] MESSAGE aArray[ 5, 2 ]
         SEPARATOR
         MENUITEM  aArray[ 6, 2 ]  MESSAGE aArray[ 6, 2 ]
         MENUITEM  aArray[ 7, 2 ]  MESSAGE aArray[ 7, 2 ]
         MENUITEM  aArray[ 8, 2 ]  MESSAGE aArray[ 8, 2 ]
         MENUITEM  aArray[ 9, 2 ]  MESSAGE aArray[ 9, 2 ]
         MENUITEM  aArray[ 10, 2 ] MESSAGE aArray[ 10, 2 ]
         SEPARATOR
         MENUITEM aArray[ 11, 2 ] MESSAGE aArray[ 11, 2 ]
         MENUITEM aArray[ 12, 2 ] MESSAGE aArray[ 12, 2 ]
         MENUITEM aArray[ 13, 2 ] MESSAGE aArray[ 13, 2 ]
      ENDMENU

      MENUITEM  aArray[ 2, 2 ] MESSAGE aArray[ 2, 2 ]
      MENUITEM  aArray[ 3, 2 ] MESSAGE aArray[ 3, 2 ]
      MENUITEM  aArray[ 4, 2 ] MESSAGE aArray[ 4, 2 ]

   MenuEnd()

   oMenu:l2007 := .f.
   oMenu:l2010 := .f.

return oMenu

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Mon Oct 13, 2014 11:13 pm

No luck with Dave's url :-(

I need a hand with GetWindowTextW()

If you have any suggestions, please share them :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby Antonio Linares » Tue Oct 14, 2014 6:38 am

Richard, Dave and others,

What function should I use to convert:

"中国版 (China)" into L"中国版 (China)"

Please notice the L

thanks!
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42071
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Unicode support in FWH 14.09

Postby ShumingWang » Wed Oct 15, 2014 4:21 am

package com.elmer.c;

import java.io.UnsupportedEncodingException;

public class GbktoUtf8 {

public String convertString(String gbk){
String utf8 = "";
try {
utf8 = new String(gbk2utf8(gbk),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return utf8;
}

public byte[] gbk2utf8(String chenese) {
char c[] = chenese.toCharArray();
byte[] fullByte = new byte[3 * c.length];
for (int i = 0; i < c.length; i++) {
int m = (int) c[i];
String word = Integer.toBinaryString(m);

StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
for (int j = 0; j < len; j++) {
sb.append("0");
}
sb.append(word);
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");

String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16);

byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
byte[] bf = new byte[3];
bf[0] = b0;
fullByte[i * 3] = bf[0];
bf[1] = b1;
fullByte[i * 3 + 1] = bf[1];
bf[2] = b2;
fullByte[i * 3 + 2] = bf[2];

}
return fullByte;
}

public static void main(String[] args) {
GbktoUtf8 gtu = new GbktoUtf8();
System.out.println(gtu.convertString("我是q !"));
}

}
http://blog.csdn.net/seng3018/article/details/6894276
http://www.xtech2.top
Mobile:(86)13802729058
Email:100200651@qq.com
QQ:100200651
Weixin: qq100200651
ShumingWang
 
Posts: 465
Joined: Sun Oct 30, 2005 6:37 am
Location: Guangzhou(Canton),China

Re: Unicode support in FWH 14.09

Postby richard-service » Fri Sep 18, 2015 8:10 am

Hi Antonio,

I saw new fwh1508 support limite Unicode character for display.
I want to know your plan for support full function Unicode( edit, control key...).
Best Regards,

Richard

Harbour 3.2.0dev (r2402101027) => Borland C++ v7.7 32bit
MySQL v8.0 /ADS v10
Harbour 3.2.0dev (r2011030937) => Borland C++ v7.4 64bit
User avatar
richard-service
 
Posts: 803
Joined: Tue Oct 16, 2007 8:57 am
Location: New Taipei City, Taiwan

Next

Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 52 guests