登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [delphi/ppc]Lazarus介绍 [zt]     [回主站]     [分站链接]
标题
[delphi/ppc]Lazarus介绍 [zt]
clq
浏览(2) + 2009-02-01 15:15:58 发表 编辑

关键字:

[2024-03-22 17:21:57 最后更新]
[delphi/ppc]Lazarus介绍 [zt]

http://blog.csdn.net/hellogv/archive/2008/06/20/2570626.aspx

Lazarus是一个类似Delphi的IDE,其语言是Free Pascal,开发方式就是RAD,自从2.2.0 FPC(Free Pascal Compile)开始,就支持WINCE -ARM平台。
Lazarus平台搭建步骤一:

1. 下载Lazarus for Win32,到 http://sourceforge.net/projects/lazarus/ 下载最新版的lazarus for Win32,一般Lazarus 已经捆绑FPC在一起了。
2. 下载Lazarus for cross-arm-wince-win32,这个工具可以在Lazarus上编译WINCE的代码。

Lazarus平台搭建步骤二:
注意:不能保存在有中文字符的路径内,我在包含中文字符的路径则编译失败

1. 安装Lazarus for Win32

2. 安装Lazarus for cross-arm-wince-win32,这个工具可以在Lazarus上编译WINCE的代码。

建立Lazarus项目

1. 启动Lazarus并点选表单来新增一个应用程序项目:File > New...。
2. 新增项目以后不要急! 千万不要在这个时候放任何元件上去,请先把项目存档,点选目录选项: File > Save All,然后选择您要存放项目档案的目录即可。

编译前设定

要编译arm-wince的应用程序,您必须先设定项目的编译器属性,请点选选单项目: Project > Compiler options...,点选Path分页,并把LCL Widget改编为Wince;点选Code分页,并把target platform改变为arm-wince。

附注: 在编译您的WinCE应用程序时,IDE可能会回报以下的错误讯息:

Compiling resource *.rc
arm-wince-windres.exe: no resources
*.PAS(57901) Error: Error while linking
*.PAS(57901) Fatal: There were 1 errors compiling module, stopping

此时,您需要编辑Windows的环境变量中的用户变量PATH,把Win32平台FPC的编译器路径加进去。 如果您不知道要加入哪个路径,请点选Lazarus选单项目: Environment options,然后看compiler path这个栏位的资料就是了,只需要文件夹路径。 别变动Lazarus里面的PATH,离开Lazarus. 用鼠标右键在”我的计算机”图示上面点击,选择目录里的’’’内容’’’,再点选内容视窗里面的进阶分页,再点选环境变量这个按键就可以编辑PATH这个环境变量了。
编译后精简EXE
到Lazarus安装文件夹中找出arm-wince-strip.exe,把EXE直接拖到arm-wince-strip.exe,则会自动精简EXE,10MB可以精简为1.25MB,再用UPX精简则可达346kb。

注意:如果编译时出现关于"LazarusResources"的错误,则需要把Lazarus卸载,把Lazarus的安装文件夹删除,再重装一次,重新操作"Lazarus平台搭建步骤二"。

clq
2009-2-1 15:32:30 发表 编辑

http://wiki.lazarus.freepascal.org/Windows_CE_Development_Notes/zh_TW



Home News Download Wiki Forums Documentation Bug tracker
Lazarus Logo
Log in / create account
lazarus wiki
Open source GUI RAD IDE for freepascal
Views
Article Discussion Edit History
Navigation
Main Page Documentation FAQ Downloads Glossary Index Recent changes Random page Help
Toolbox
What links here Related changes Upload file Special pages Printable version Permanent link
Wiki Search

Windows CE Development Notes/zh TW
From Lazarus-ccr
Jump to: navigation, search

English (en) | 正體中文 (zh_TW)
Contents
[hide]

* 1 為您的程式進行偵錯
* 2 資料存取不一致的問題
o 2.1 甚麼是”資料存取不一致”?
o 2.2 如何解決這個問題呢?
* 3 實現分頁控制項(Tab Controls)的細節(TPageControl)
o 3.1 背景跟表單位置的問題
o 3.2 仍在偵錯中的項目
* 4 已知的問題跟錯誤
* 5 其它
* 6 未來的工作
* 7 連結

[edit] 為您的程式進行偵錯

請參考[這裡]的說明 (中文)。

* 有時候GDB程式可能會死掉,請直接把偵錯程式停止,然後重來一次吧。
* 如果您打開了呼叫堆疊(call stack)子視窗的話,他會占用很多資源,所以當您進行偵錯的時候速度會很慢,有時候也可能讓偵錯程式死掉,所以請注意,沒必要的時候不要打開這個子視窗。
* 請在您需要中斷程式的部分設定breakpoint(中斷點),否則您可能沒辦法在需要程式暫停的時候讓它乖乖停止。
* 除非是要作偵錯,不然請別對您的程式進行反組譯或逆向工程,因為這些strip的工具程式或多或少都有些問題,拆解過以後,您的程式可能會沒辦法執行,所以不建議您使用它。
* 有時候單步執行會用很久的時間,要請您多準備些耐心,我曾經要透過偵錯程式做個簡單的單步執行,結果就花了一分多鐘…

[edit] 資料存取不一致的問題

在使用ARM處理器的時候,有時會遇到EBusError的另外狀況,當時的訊息可能是資料存取不一致 (misaligned data access),以下的幾個章節會說明它發生的原因跟解決的方法。


[edit] 甚麼是”資料存取不一致”?

假設CPU到記憶體的匯流排(Bus)是8bit,而您想讀取一個Byte。既然您的Bus是8bit的,就可以對每一個Byte的定址定的清清楚楚,那麼一次讀取一個byte就一定沒有問題。現在請想像一下,一個使用32bit匯流排的CPU要讀取一個Byte。32bit的匯流排,每次讀取的資料都會是一致的長度,也就是32bits (=4bytes),定址的時候也是一樣,都是以四的倍數進行定址的,所以要得到CPU真正想讀取的資料時,CPU就會把右邊的byte進行搬移。

好的,現在我們再想想,在讀取一個32bits的整數時,在一個8bits的CPU上面,必須要讀四次,每次讀一個byte,才能讀到一個32bits的整數,在32bits的CPU,如果定址也正好是4bytes的倍數,則相同的動作只要讀一次就行了。如果不是的話,就得把32bits 整數分拆成不同的部分讀取,然後再組合成一個整數,在x86系列的CPU上面就是這麼作的,所以是比較沒效率的。在SPARC跟ARM系列CPU的一些分支上面(*)就不支援這種分拆讀取再組合的動作,它們會直接回報出一個匯流排錯誤,錯誤訊息就是”資料存取不一致 ”。

(*)有些以ARM為基礎的CPU已經作了功能補強,把這問題給處理掉了,但這要看是哪個製造商製造的ARM處理器,還有它們的規格書上面是否有註明已經作了這問題的修補。


[edit] 如何解決這個問題呢?

在對指標進行轉型(typecasting)的時候,一定要很小心。16bit (2bytes)長的資料跟32bit (4bytes)長的資料一定要在記憶體裡面轉成4bytes長的資料,不然這個bus錯誤就會發生了。或者在使用到這樣的轉型動作之前加上一個新的關鍵字 (unaligned),這個關鍵字可以同時放在一個語法描述的左邊跟右邊。

例如:

var
p1:^Longint;
l:longint;
begin
p1^:=20; //這個assignment可能會造成bus error, 如果p這個指標正好指向了一個沒對齊的記憶體位址,例如: 該位址不是四的倍數。
unaligned(p1^):=20; //這樣就沒問題
l:=pl^; //這也可能會造成問題
l:=unaligned(pl^); //加個關鍵字就保險了
end.

在使用Pascal的自訂形別:Pack record時,編譯器會自動把對該record的所有成員的所有動作都定義成unaligned存取。目前,有時在循環使用到pack record的時候(有人翻成巢式定義),編譯器不會自動把需要的程式碼建立出來,所以這時候我們就得自己加上unaligned關鍵字了。但是請留意啊! 循環使用pack record來定義新資料結構,而且對它所有成員的存取都加上unaligned時,會對程式處理資料的速度造成很大的影響。所以非必要時,別這麼用吧。
[edit] 實現分頁控制項(Tab Controls)的細節(TPageControl)

絕大多數的控制項在移植到WinCE的時候,都是直接把Win32的原始碼拿來稍微改一改而已,但是分頁控制項在WinCE上面要實現,比Win32平台上難得太多了。

簡單的說,有以下這幾個難處:

* 不支援縱向文字,所以分頁控制項的分頁標籤如果放在左邊或右邊,文字就沒辦法顯示了。
* 由於還沒釐清的原因(是WinCE的錯誤嗎?),分頁控制項的分頁標籤放在畫面上方的時候,分頁標籤上的文字也不會顯示出來。

此外,微軟也建議在Windows CE裡面使用分頁控制項時,使用分頁標籤位於畫面下方的樣式,這樣使用者在用手切換分頁的時候就不會遮到觸控螢幕了。綜合上述援因,我決定把 Windows CE版本的分頁控制項寫死成只有一個樣式,這是跟其它控制項最大的不同。預設的樣式看來有點老式,但我發現新的樣式太簡化了。雖然樣式有點老式,但您還是可以一眼就看出它是個分頁控制項,如果您想設定分頁控制項的樣式(設定為平滑樣式: flat)的話,請從程式碼裡面直接控制(TWinCEWSCustomNotebook.CreateHandle),要改變它的外觀也並不難。

您也可以從這裡參閱相關文件: http://msdn2.microsoft.com/en-us/library/aa921319.aspx
[edit] 背景跟表單位置的問題

每一頁的背景之間是不會自動被更新的,且因為控制項的背景邊框很細,而且並不完整(不是每一邊都有邊框的),有時使用者就可以這樣看到表單的背景了。

我使用了個不錯的方法,把WinCE的表單背景作了些處理,細節請見: http://www.pocketpcdn.com/forum/viewtopic.php?t=499

在沒有進行表單位置調整前,分頁控制項看起來像這樣:

Image:Before_tab_adjust.png

調整完以後,看起來會像這樣:

Image:After_tab_adjust.png

請注意,在沒有調整之前,您可以看到控制項後面的表單背景,但是在調整過以後,很明顯的就看不到了,因為我使用了TPanel控制項來調整控制項的位置。

我不確定用固定的背景色是不是個好主意,或者應該用哪個固定的顏色,所以我把這個問題留到現在還沒解決。
[edit] 仍在偵錯中的項目

* http://www.freepascal.org/mantis/view.php?id=8938 – 已修正

[edit] 已知的問題跟錯誤

SetProp - GetProp - RemoveProp APIs

Windows CE沒有SetProp跟GetProp這兩個很常用的API,所以我已經自己製作/模擬了類似動作。目前我製作的動作跟Win32 API並不完全一樣,在Win32裡面,我們可以對每個視窗,一次設定多個不同名稱的屬性,但我在實現這功能的時候,把名稱給省略了,所以我們只能對每一個控制項中,指定的同一類屬性進行設定。(要改成跟Win32的作法一樣也不難,但我發現目前這麼作沒甚麼幫助) 而removeprop這個功能也還沒被使用過。所以在您離開應用程式的時候,可能發生記憶體裂縫。(我不確定WinCE是否會自己釋放記憶體空間,或者在Windows Handle被釋放時同時釋放記憶體)這部分會很快就被實現的。


LCLControlSizeNeedsUpdate LCLBoundsToWin32Bounds LCLFormSizeToWin32Size GetLCLClientBoundsOffset GetLCLClientBoundsOffset

這部分我還沒驗證過,我也不覺得這幾個元件會像我們在Win32平台上那麼需要它們。所以還需要重新設計,舉例來說TWinCEWSWinControl.SetBounds,我就把裡面的movewindow給拿掉了,因為在WinCE上面也不知道能把它移到哪兒去。

Brushes

在WinCE裡面也沒有Brush,我已經把CreateBrushIndirect直接對應到CreateSolidBrush跟CreateDIBPatternBrushPt了,如果在LCL裡面用到其它的flag的話,就會出錯喔。
[edit] 其它

一些有用的資訊:

External signal(?) Error

有時候您可能會在偵錯程式裡面看到這個訊息,表示出現了”資料存取不一致”的問題,正常狀況下應該不會發生的。您可以在出錯的原始碼指令檔裡面加入”unaligned”這個關鍵字,這個錯誤會發生在所有可能出問題的地方。


Menus

這需要大規模的工程,需要對LCL如何處理Menu的背景知識有稍微深入的了解,或許還需要稍微修正一下該架構。


[edit] 未來的工作

* 要確認WinCE版本的WinAPI相關描述,目前使用到的部分跟Win32還大致相同,僅有少數情形是不同的。

* 目前用Lazarus跟WinCE介面編譯出來的應用程式都是經過最佳化的,並且只能在PocketPC裝置裡工作。

[edit] 連結

以下是建立Windows CE介面時,有幫助的幾個連結: 如何將您的Win32程式移植到Windows CE

一些舊文章,說明在建立WinCE控制項的時候需要使用到的參數

詳盡說明了WinCE參數的相關網頁

把應用程式的選單移植到CE的使用者介面裡

一般Win32-API跟Windows CE之間的差別

資源定義的指令

GUI控制項樣式

要開發高解析度WinCE應用程式控制項的注意事項

將KOL GUI 函式庫移植到WinCE上面

* 初版正體中文翻譯,以及Device Emulator 2.0等相關資訊,由元智大學資訊傳播學系兼任講師張子仁 (Dennies Chang)製作。 - 2008/1/7 User:Dennies

Retrieved from "http://wiki.lazarus.freepascal.org/Windows_CE_Development_Notes/zh_TW"
Powered by MediaWiki

* This page was last modified 09:17, 7 January 2008.
*

This page has been accessed 1,080 times.
* Content is available under .
* Privacy policy
* About Lazarus-ccr
* Disclaimers


clq
2009-2-1 15:43:37 发表 编辑

Lazarus开发使用SQLite的WinCE

http://www.sqlite.com.cn/MySqlite/4/515.Html
--------------------------------------------------

作者:tamsyn 来源:http://hi.baidu.com/qwetiop/blog/ 时间:2008-12-2 【 字体:大 中 小 】 〖 双击滚屏 〗
SQLite是一个开源的小型数据库,它可以在WinCE上正常工作,本文讲述的,就是如何在WinCE开发中使用它。
首先,我们需要相关的开发工具,SQLite没有可视化的管理工具,它提供了一个命令行下的工具,用于创建数据库。下载了SQLite3后,会找到SQlite3.exe和SQlite3.dll,其中EXE就是命令行工具了。

我们用命令来建立一个测试用的数据库,如下:
sqlite3 myTest.db
create table Demo(uid integer, uname varchar(50));
insert into Demo values(1,'a');
insert into Demo values(2,'b');
insert into Demo values(3,'c');
.quit

这时就能看到在sqlite3.exe相同的目录下,生成了myTest.db这个文件,当然了,里面包含了一个名为Demo的表,要查询表中内容可以用以下语句
sqlite3 myTest.db
select * from Demo;
.quit

以上的命令是在PC上执行的,它借助了sqlite3.dll完成相应的功能,但是在Windows Mobile下,显然不能够使用PC上的dll,我们需要用源码自行编译相关的dll。

从 SourceForge上下载到sqlite-ce-source 3.3.3之后,解压,然后在VC6里新建一个Library工程,把source内除了tclsqlite.c外,所有的文件添加到这个工程内,编译工程。编译后即生成sqlite3.dll,这个dll可以放到Windows Mobile下使用了。

我使用的是VC6来编译sqlite3.dll,您也可以用C++Builder,DEV C++,或是Visual Studio 2008内的VC++.NET来编译这个dll,编译的效果是一样的。

建好了数据库之后,就要进行程序的开发了,我在此选择Lazarus进行开发。当然了,如果你喜欢用C++,Java或C#进行开发,也是一样的,用.NET或Java语言开发时,需要多下载一个对应的Wrapper,用原生语言开发则不需要多下载东西。

为了使程序体积更小,我们需要使用KOLCE,关于KOLCE的使用,请去以下帖子:点击进入

假设您已经会使用lazarus和KOLCE,那么下面就开始进行开发了。我们会碰到一个小小的问题,就是lazarus自带的DB Connection不支持SQLite。这时我们需要借助一套第三方的控件,那就是Zeos DBO。
ZeosDBO 是使用Delphi开发的一套强劲的数据操作控件,它也有Lazarus相关的版本,您可以从SourceForge上获得它,它是免费且开源的。

根据Zeos DBO的文档所述,在要Lazarus上安装只需要编译并安装ZComponents.lpk即可。安装时会自动安装其余的4个包,Zeos DBO的安装时间相当的久,以我电脑4核+4G内存的配置都要将近5分钟才能安装完成,安装期间lazarus会发生没有响应的现象,系统反应也相当的慢,请不要在意,并耐心的等待。

安装Zeos DBO时,或许会发生另一个问题,如果您以前安装过KOLCE,那么会报一个KOL.o和KOL.ppu
重复存在的错误,此时需要把MCK目录下的lib目录删除,并重新编译KOLCE。

安装Zeos DBO成功后,会在控件面板上看到多出一组控件,如图所示:

下面我们可以进行真正的开发了,新建一个工程,设置窗口大小为240x320,这个分辨率是我的手机屏幕的大小,您可以跟据您的手机实际的分辨率来设置大小。然后往窗体上拖放一个TKOLListBox,一个TZConnection,一个TZQuery。设置ZQuery的Connection属性为 ZConnection。


编写一些简单的代码来完成数据的查询和显示。

可以看到,这些代码与在Delphi中的操作非常类似。有几点需要注意:
1. KOLListBox中,Items属性是字符串,因此不能够Items.Clear,也不能够Items.Add()。能用的方法只是ListBox.Clear和ListBox.Add。
2. SQLite的数据库必须使用完整的路径,不能使用相对路径。
3. SQLite的SQL语句最后都必须带上分号,以示这一行语句结束。

好了,现在可以编译程序了。编译成功后,我们要运行程序,以测试程序工作是否正常。此时又会碰到一个问题,就是用Windows Mobile模拟器,无法将数据库部署上去,也无法将相关的DLL部署上去。这个时候有两种解决办法,一种是使用Microsoft ActiveSync,把相关文件直接拷进模拟器,另一种就是拥有一台真实的Windows Mobile。我使用的是后一种方法。

部署需要的东西很简单,刚才开发的程序,sqlite3.dll,myTest.db,全部拷到手机里。然后执行exe文件。

到此为止,一个简单的演示程序就完成了,对于使用Delphi的开发人员来说,要上手lazarus是非常容易的,而且Zeos DBO的操作方式几乎与DBGO完全一样,这使得Delphi开发人员能无缝的过渡到Lazarus。
对于SQLite,它体积小,操作也很简单,而且数据访问速度很快,越来越多的PPC应用程序使用了它作为本地数据库。另外,SQLite的开源也使开发人员能够更深入的了解它的本质,从而对它作出改进,以满足不同用户的不同需要。

guest
2024-03-22 17:21:57 发表 编辑

ip: 37.115.216.33
Mozilla/5.0 (Windows NT 11.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5814.214 Safari/537.36


总数:3 页次:1/1 首页 尾页  
总数:3 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1