2011年8月19日 星期五

三戰之 再用bcc(borland c)來製作harbour + hwgui utf8版之記錄

用bcc(borland c)來製作harbour + hwgui utf8版
(到底試幾次了? 你的肝站在你後面,它不火了但燒到剩灰盡了....)
2011-08-19 03:02開始記錄
bcc現成在\fq\bc55
d:\t
d:\t\h harbour svn checkout
d:\t\u hwgui svn checkout

**** 這是harbour ****
d:\t\h>set path=\fq\bc55\bin
d:\t\h>win-make
成功做成lib\win\bcc 85 files, bin\win\bcc 15 files

記得copy
d:\t\h>copy bin\win\bcc bin
d:\t\h>copy lib\win\bcc lib

**** 這是hwgui ****
d:\t\h>cd \t\u
d:\t\u>
makefile.bc
加入 -DUNICODE
加入 bc55的include
----------------------------------
CFLAGS = -DUNICODE .....
INCLUDE_DIR = include;$(HRB_DIR)\include;\fq\bc55\include
----------------------------------
記得設HB_PATH(全部大寫)
d:\t\u>SET HB_PATH=d:\s\h
d:\t\u>SET PATH=d:\fq\bc55\bin;%windir%;%windir%\system32
記得d:\fq\bc55\bin下的bcc32.cfg ilink.cfg要設定對,免得include error
d:\t\u>make_b32
完成 5個lib檔

**** hwgui make完成,開始測試前的準備動作 ****
接下來重頭戲,到samples去測試了
d:\t\u>cd samples
bld.bat
並修正如下:
set HRB_DIR=\t\h
set HWGUI_INSTALL=\t\u
(註:這裡不需要加-DUNICODE)
最前面加2行,最後面加2行(純為個人習慣)
if exist %1.exe del %1.exe
if exist %1.exe goto end

if exist %1.exe %1.exe
:end

**** 測試開始 (以下請都用 samples\bldjc.bat ,不要用各目錄的bld.bat )
d:\s\u\samples>cd hello
d:\s\u\samples\hello>copy hello.prg h.prg
d:\s\u\samples\hello>..\bldjc h
h.exe 完成後自動執行。
RichText/EditBox輸入中文也沒問題。big5/utf8OK,但值在那裡
Get 任何中文都不行
EditBox 可ansi-big5中文,不能unicode
加不加三個修正檔都一樣, utf8編碼的prg檔也沒問題
主要問題在於 GET 有{|v|if(v=nil,,=v)}
這一段沒有完成uft8
editbox 同 get都是hedit(),差別在這
而richedit()也沒code block。所以沒問題

用mingw(gcc)來製作harbour + hwgui utf8版 之不死心再來一次

用mingw(gcc)來製作harbour + hwgui utf8版
(到底試幾次了? 你的肝站在你後面,它不火了但燒到剩灰盡了....)
2011-08-19 0:31開始記錄
d:\s
d:\s\g mingw完全安裝 (這次先不裝qt lib看看)
d:\s\h harbour svn checkout
d:\s\u hwgui svn checkout

**** 這是harbour ****
d:\s\h>set path=d:\s\g\bin
d:\s\h>win-make
竟然成功做成86 lib(.a), 10個bin/dll(.exe/.dll) 那我之前qt是灌心酸的哦

記得copy
d:\s\h>copy bin\win\mingw bin
d:\s\h>copy lib\win\mingw lib

**** 這是hwgui ****
d:\s\h>cd \s\u
d:\s\u>
記得copy 三個檔 source\ hedit.prg unicode.c misc.c
(自己去 www4.zzz.com.tw 找)
但我不想破壞svn後的內容,以後再用追加obj的方式另外處理吧
以下,要修改的檔案都另存新檔名,以免破壞svn的完整性
copy makefile.gcc makegcc.jc
加入 -DUNICODE
----------------------------------
CFLAGS = -DUNICODE -Wall -mno-cygwin -O3 -march=pentium -DHWG_USE_POINTER_ITEM
----------------------------------
copy makemngw.bat makejc.bat
最前面加入以下二行
if not exist lib md lib
if not exist obj md obj
修改
mingw32-make.exe -f makejc.gcc
記得設HB_PATH(全部大寫)
d:\s\u>SET HB_PATH=d:\s\h
d:\s\u>makejc
等待完成 4個lib檔(.a)
接下來,在ROTT下,複制三檔作obj(.o) hedit.prg unicode.c misc.c
misc.c太舊,裡面的ISNIL要換成HB_ISNIL, ISPOINTER要換成HB_ISPOINTER
d:\s\u>set path=d:\s\g\bin;d:\s\h\bin
d:\s\u>harbour -i\s\h\include;\s\u\include n hedit
d:\s\u>gcc -DUNICODE -Wall -mno-cygwin -O3 -march=pentium -DHWG_USE_POINTER_ITEM -I\s\u\include -I\s\h\include -c hedit.c -olib\hedit.o
d:\s\u>gcc -DUNICODE -Wall -mno-cygwin -O3 -march=pentium -DHWG_USE_POINTER_ITEM -I\s\u\include -I\s\h\include -c unicode.c -olib\unicode.o
d:\s\u>gcc -DUNICODE -Wall -mno-cygwin -O3 -march=pentium -DHWG_USE_POINTER_ITEM -I\s\u\include -I\s\h\include -c misc.c -olib\misc.o

**** hwgui make完成,開始測試前的準備動作 ****
接下來重頭戲,到samples去測試了
d:\s\u>cd samples
一樣為了保持svn完整性,複制複制
d:\s\u>cd samples
d:\s\u\samples>copy bldgw.bat bldjc.bat
並修正如下:
set path=d:\s\g\bin
set MINGW=d:\s\g
set HRB_DIR=d:\s\h
set HWGUI_INSTALL=d:\s\u
@set OBJ_LIST=%1.o \s\u\lib\misc.o \s\u\lib\unicode.o \s\u\lib\hedit.o(gcc 那行最扯hb 3.1版都很久了。都不更新lib檔名)
(註:這裡不需要加-DUNICODE)
gcc -Wall -mwindows -o%1.exe %OBJ_LIST% -L%MINGW%\lib -L%HRB_DIR%\lib -L%HWGUI_INSTALL%\lib -mno-cygwin -Wl,--allow-multiple-definition -Wl,--start-group -lhwgui -lprocmisc -lhbxml -lhbvm -lhbrdd -lhbmacro -lhbpp -lhbrtl -lhbcpage -lhblang -lhbcommon -lhbnulrdd -lrddntx -lrddcdx -lrddfpt -lhbsix -lgtgui -lgtwin -luser32 -lwinspool -lcomctl32 -lcomdlg32 -lgdi32 -lole32 -loleaut32 -luuid -Wl,--end-group
最前面加2行,最後面加2行(純為個人習慣)
if exist %1.exe del %1.exe
if exist %1.exe goto end

if exist %1.exe %1.exe
:end

**** 測試開始 (以下請都用 samples\bldjc.bat ,不要用各目錄的bld.bat )
d:\s\u\samples>cd hello
d:\s\u\samples\hello>copy hello.prg h.prg
d:\s\u\samples\hello>..\bldjc h
h.exe 完成後自動執行。
RichText/EditBox輸入中文也沒問題。連沒裝unicode補完也能輸入unicode
但值是什麼呢???
Get 卻連中文都不行
EditBox 可ansi-big5中文,不能unicode
加不加三個修正檔都一樣

2011年8月18日 星期四

建立一個在win平台下,以gcc為開發工具的harbour+hwgui的資料開發工具

建立一個在win平台下,以gcc為開發工具的harbour+hwgui的資料開發工具
並解決中文的問題(如能用utf8更讚)

需安裝套件如下
-----------------------------------------------------------------------
1.MingGW (只需裝預設的c complier) from GNU
http://ncu.dl.sourceforge.net/project/mingw/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110802/mingw-get-inst-20110802.exe
2.QT lib from www.nokia.com
http://get.qt.nokia.com/qt/source/qt-win-opensource-4.7.3-mingw.exe
3.TortoiesSVN (或自己用習慣的SVN client)
http://ncu.dl.sourceforge.net/project/tortoisesvn/1.7.0-beta2/Application/TortoiseSVN-1.7.0-beta2-win32-svn-1.7.0-dev.msi
-----------------------------------------------------------------------

****準備動作****
本人以d:\s為計畫ROOT
g為MingW的ROOT
q為QT lib的ROOT
預計
h為harbour的ROOT
u為hwgui的ROOT

環境設定。path納入gcc及qt的bin
path=d:\s\g\bin;d:\s\q\bin
將1-3套件裝好之後,就開始吧

****開始行動****

****make harbour-------------------------------------------------------
將最新的harbour-project\trunk\harbour checkout到d:\s\h下
開啟命令視窗於 d:\s\h
D:\s\h>set path=d:\s\g\bin;d:\s\q\bin
D:\s\h>win-make
等待完成
copy lib\win\mingw\* lib -->沒這動作,會找不到lib檔


win-make.exe是win32平台下自動的harbour make程式。
會自動在路徑中找各種c complier,自動判斷如何make.
使用gcc make一定要裝qt lib 不然會找不到moc.exe rcc.exe的嚴重錯誤

我以前用過bcc則不用。不知道理由為何。總之費了一些力氣上網搜尋之後
裝了nokia的QT lib才能解決。
-----------------------------------------------------------------------

****make hwgui---------------------------------------------------------
將最新的hwgui\trunk\hwgui checkout到d:\s\u下
開啟命令視窗於 d:\s\u
D:\s\u>set path=path=d:\s\g\bin;d:\s\q\bin
將makefile.gcc修正如下
----------------------------------
HRB_DIR = d:\s\h
INC_DIR = d:\s\u\include
CFLAGS = -DUNICODE -DUTF8 -Wall -mno-cygwin -O3 -march=pentium -DHWG_USE_POINTER_ITEM
----------------------------------
重點在1.路徑 2.加上UNICODE及UTF8的Define (UNICODE又稱UTF16,所以要加兩個)

******重點在這裡*******
接下來,跟據http://www4.zzz.com.tw/phpbb2/viewtopic.php?t=334修改hwgui的部分內容
*1.
Modify hEdit.prg: 或去跟站長ssbbs要最新修改版
Change METHOD OnEvent() to METHOD OnEventOld()
add METHOD OnEvent:
//-------------------------------------------------------------------
METHOD onEvent( msg, wParam, lParam ) CLASS HEdit
IF ::cType='C' .AND. Empty( ::cPicFunc ) .AND. Empty( ::cPicMask )
RETURN -1
Else
RETURN ::onEventold( msg, wParam, lParam )
ENDIF
RETURN nil
//-------------------------------------------------------------------
*.2 從上述網址下載rar檔,將裡面source\unicode.c 複到到source\下
*.網址上原作者用bcc, 對自寫了ssbbs.bat , ss_make_b32.bat 及 ssmakefile.bc
跟據上三檔來作修正
ssbbs.bat : path與haubour路徑設定。
ss_make_b321.bat : 可以看出主要是加-DUNICODE -DUTF8於make那兩行
ssmakefile.bc :可以看出主要是加-DUNICODE -DUTF8於CFLAG外,hwgui.lib多了unicode.obj
------修改成適用於mingw-------------------------
makemngw.bat
最前面加入以下二行
if not exist lib md lib
if not exist obj md obj

makefile.gcc
加-DUNICODE -DUTF8於CFLAG,hwgui加unicode.o
********重點結束**************

D:\s\u>makemngw
等待完成
-----------------------------------------------------------------------


-----------------------------------------------------------------------
最後,samples底下及各目錄都有自己bld.bat,請不要用,那是bcc專用的
請用 ..\bldgw.bat,但需修正如下
-------此4行跟據你的安裝目錄修改-----
set path=d:\s\g\bin;d:\s\q\bin
set MINGW=d:\s\g
set HRB_DIR=d:\s\h
set HWGUI_INSTALL=d:\s\u
--------------------------------------
第一個gcc那行加上-DUNICODE -DUTF8 :
gcc -DUNICODE -DUTF8 -I. -I%HRB_DIR%\include -mno-cygwin -Wall -c %1.c -o%1.o


第二個gcc那行加上-DUNICODE -DUTF8,外
後面harbour的lib部分可能年代久遠,名稱錯一堆
-L%HRB_DIR%\lib2 ->-L%HRB_DIR%\lib
vm ->hbvm
rdd ->hbrdd
macro ->hb marco
pp ->hbpp 重複兩個,刪掉一個
rtl ->hbrtl
codepage ->hbcpage
lang ->hblang
common ->hbcommno
nulsys ->hbnulrdd (找超久...)
dbfntx ->rddntx
dbfcdx ->rddcdx
dbfftp ->rddfpt
gtgui ->gtwin

gcc -Wall -mwindows -o%1.exe %OBJ_LIST% -L%MINGW%\lib -L%HRB_DIR%\lib -L%HWGUI_INSTALL%\lib -mno-cygwin -Wl,--allow-multiple-definition -Wl,--start-group -lhwgui -lprocmisc -lhbxml -lhbvm -lhbrdd -lhbmacro -lhbpp -lhbrtl -lhbcpage -lhblang -lhbcommon -lhbnulrdd -lrddntx -lrddcdx -lrddfpt -lhbsix -lgtwin -luser32 -lwinspool -lcomctl32 -lcomdlg32 -lgdi32 -lole32 -loleaut32 -luuid -Wl,--end-group

最後再加上這2行於最頭和最尾,是我的習慣。
if exist %1.exe del %1.exe 第1行
if exist %1.exe %1.exe 最後1行
------------------------------------------------------------------------
下面以samples\get\testget2.prg為例
直接 ..\bldgw testget2
選單上get a value,第二行
之前無法中文,之後可以,但取得內容為 ?????
在mian()裡,加上HWG_SETUTF8(),取得內容也正常了。
(注意程式只能用ansi檔,不能用utf8 or utf16)
接下來改這行看看
Local e6 := ansitounicode("中華民國")
完全破功 = = 只得-N兩字
想也是,在php下要用$str=iconv("big5","UTF-8",$str);
ansi碼跟本沒中文。至少也要有big5Tounicode()
或Setlocale('big5')吧
.......
Local e6 := memorea("utf8.txt") //uft8編碼的文字檔
則顯示:沒問題,游標移動:沒問題
輸入則ooxx死了

結果,肝燒了好幾夜,短命的結果仍是白忙一場。
謝幕
-------------------------------------
後註:如果用big5+unicode補完可以接受的話,
倒是勉強成功
***日後有成功再來修改此文**