使用CodeTyphon做FPC编译碰到的问题记录2

之前使用了CodeTyphon做FPC交叉编译,将Delphi写的部分命令行工具修改编译到Linux下运行,又碰到如下一些问题:
1. 重新安装后,不能Win64版本下编译生成x86_x64-linux的交叉编译相关包
解决方法:使用Win32版本编译生成x86_x64-linux交叉编译相关包

2. 代码文件中的中文字符,编译后运行显示乱码
原因,Delphi下写的代码是用GBK编码的,FPC高版本使用UTF8编码,格式转化失败
解决方法:在包含中文字符的代码文件最前面添加 {$codepage cp936} 指定源码文件的编码格式
编译再次碰到问题,提示cp936是不能识别 codepage
解决方法:检查CodeTyphon的fpcsrc目录下fpc编译器源码,
发现compiler/widestr.pas 文件中uses部分缺少cp936的引用,
修改该文件添加cp936的单元引用,
然后将 packages/rtl-unicode/src/inc/cp936.pas 文件拷贝一份到 rtl/charmaps目录下,
同时也修改rtl/charmaps/cpall.pas,添加cp936单元的引用
重新运行CodeTyphon安装程序,选择 4) Remove and Build FreePascal,
结束后,重新编译项目,再次在Linux下运行编译后的程序,中文可以正常显示了。
注: 修改后的文件,要添加/替换到 allzips/src/fpc_src.7z 中,否则重新编译时会自动被压缩包中解压出来的文件替换掉,导致修改失败

3.部分使用Hex格式传输的GBK中文字符,还原输出后显示为乱码
解决方法:对于还原回来的中文字符串,添加如下一个设置字符代码页的代码
SetCodePage(RawByteString(myStr), 936, false);
重新编译运行,问题解决。

4. 使用+号拼装中文字符串时,中文字符出现乱码,
解决方法,多写几个语句,拆分为单个+号连接
比如
Result := Result + ‘测试’ + sOther + ‘结束’;
修改为:
Result := Result + ‘测试’;
Result := Result + sOther;
Result := Result + ‘结束’;
问题解决。

Popularity: 10% [?]

Random Posts

SQLite数据存取速度慢的原因分析

写了一个小工具,使用SQLite作为本地数据结构的存取,但是在默认情况下,发现大批量插入数据的速度很慢,100条不到的记录,花了快10秒,没错不是毫秒,是秒,深感SQLite的存取速度太慢,现在很多软件都在使用SQLite作为本地数据存取,这么慢存取的效率怎么能用呢,估计是有什么参数没有设置对,网上搜索后发现如下一篇文章Increasing SQLite Performance
文章主要是通过PRAGMA对一些参数设置不同值做效率对比

方式 测试结果值 说明
TEMP_STORE DEFAULT 235 不同值区别不大
FILE 225
MEMORY 215
 
JOURNAL_MODE DELETE * 235 使用MEMORY和OFF方式速度较快
TRUNCATE 210
PERSIST 220
MEMORY 65
OFF 63
 
SYNCHRONOUS FULL 235 OFF有较大提升
NORMAL 175
OFF 43
 
LOCKING_MODE NORMAL 235 EXCLUSIVE独占有较大提升
EXCLUSIVE 155

另外 PAGE_SIZE 和 CACHE_SIZE 的只修改,对性能影响不是很明显,所以为了提升插入效率,在使用事物的基础上还可以通过修改 JOURNAL_MODE、SYNCHRONOUS和LOCKING_MODE的值

PRAGMA locking_mode=EXCLUSIVE
PRAGMA synchronous=0
PRAGMA journal_mode=MEMORY

Popularity: 9% [?]

Random Posts

发现一个Delphi的静态代码检查工具FixInsight

C++,Java, C#等常用编程语言都有静态代码检查工具,帮助发现编写代码过程中存在的一些问题,从而有效提升代码质量,将一些缺陷在编译阶段就发现解决掉。
Delphi作为一个已经有几十年历史的语言,一直没有发现类似的静态代码检查工具,引以为憾,但是今天发现了一款工具 FixInsight 填补了这个缺憾。
下载地址 http://sourceoddity.com/fixinsight/download.html
软件的售价对于个人版只要 $95, 相对于排查代码缺陷所花的时间是完全值得的。

Popularity: 9% [?]

Random Posts

使用CodeTyphon做FPC交叉编译的问题记录

在mac下安装了CodeTyphon尝试做freepascal代码的跨平台编译。

首先编译安装CodeTyphon环境

步骤1:安装 mac ports
步骤2:首先解压下载来的CodeTyphon安装包,运行解压目录下下的setup.sh, 使用 sudo 执行
步骤3:选择0,安装系统库
步骤4:选择8, 清空之前的全部组件,重新编译安装
经过漫长等待后,可以在应用程序中看到有CodeTyphon和Typhon32两个图标,运行CodeTyphon

编译所需目标平台的工具链

主要是CrossBuild菜单项目下的几个菜单项处理。
步骤1:选择 CrossBuild 菜单下面的 ToolChains Build 项目,选择期望的目标平台,主要是第一列的 FPC CPU-OS Targets 中选择, 选择好后点击 Build 按钮进行编译。在自己手动编译前可以先选择 CrossBuild 菜单下面的 Download ToolChains项目,看服务器上有无预先编译好的可可以下载来用(手工编译速度比下载速度慢很多)下载前,要用sudo 运行CodeTyphon, 否则会下载失败,提示目录不存在的错误,其实就是没有权限写目录
步骤2:选择 CrossBuild 菜单下的 Download Libaraies 项目,下载对应目标平台的库文件
步骤3:选择 CrossBuild 菜单下的 FreePascal 32bits(64bits), 编译所需平台的 cross elements,
如果没有做第一步, 则这儿没有对应平台的cross elements可以选择

编译目标平台的程序

步骤1. 运行Typhon32
步骤2. 新建或打开工程
步骤3. 设置工程的相关搜索路径,菜单 工程=》工程选项=》编译选项=》路径, 主要为Libraries路径,为了变更目标平台时不修改这边的路径,可以采用相对路径。
Libraries 可以填 $(CTDir)/binLibraries/$(TargetCPU)-$(TargetOS)
单元输出目录可以填 lib/$(TargetCPU)-$(TargetOS)
步骤4. 选择目标平台,菜单 工程=》工程选项=》Config and Target, 设置目标OS和目标CPU

编译中碰到问题:
问题1: 编译提示 system 单元未找到
这一般是由于没有创建好对应平台的cross elements 或者 在工程的路径设置中没有设置对 units的路径

问题2: 代码中的中文信息在编译后输出了乱码
这个一般是由于Freepascal默认按照utf8解释的原因,之前代码中的中文是在Win下编写,GBK编码,将文件转为UTF8格式重新编译问题解决。

Popularity: 9% [?]

Random Posts

FAST-REPORT FMX 完全手工编译安装方法

FAST-REPORT FMX 安装包针对每个版本的Delphi都做了安装包,如果Delphi的环境是默认的没有经过一些库文件的升级,比如将TeeChart控件升级到专业版使用,则默使用认安装包安装后,会有异常,需要自己使用源码重新编译安装。查看了安装目录下的txt文件,有篇中提到只要使用recompile.exe,按照提示选择设置对应参数重新编译即可,可是不幸的是在安装目录下并没有recompile.exe文件,只能完全的手工安装了。
首先卸载已经安装的FASTREPORT FMX,然后只安装源码包。
按照如下顺序安装 (以DelphiXE4为例)
1. 打开FastReport FMX\FastScript\FMXfs18.dpk–》编译(Compile)
打开FastReport FMX\FastScript\dclFMXfs18.dpk–》编译(Compile)–》安装(Install)
2. 打开FastReport FMX\FastScript\FMXfsDB18.dpk–》编译(Compile)
打开FastReport FMX\FastScript\dclFMXfsDB18.dpk–》编译(Compile)–》安装(Install)
3. 按照需要编译DB,TEE模块,如果是TEE模块,记得修改tee.inc文件,对应到机器上的TeeChar版本
4. 新建一个FastReport FMX\LibD18目录,复制FastReport FMX\Source\*.*到这个LibD18目录
5. 打开FastReport FMX\LibD18\FMXfrx18.dpk–》编译(Compile)
打开FastReport FMX\LibD18\dclFMXfrx18.dpk–》编译(Compile)–》安装(Install)
6. 打开FastReport FMX\LibD18\FMXfrxDB18.dpk–》编译(Compile)
打开FastReport FMX\LibD18\FMXfrxDB18.dpk–》编译(Compile)–》安装(Install)
7.按照自己的需要,编译DB,TEE等模块,如果要安装Tee模块,记得从FastScript目录下将tee.inc拷贝过来,要不然编译有问题。

编译过程中会遇到一些控件缺少属性的提示,直接忽略所有即可。

Popularity: 8% [?]

Random Posts

体验Delphi XE4 iOS 开发时真机调试环境下碰到的一些问题解决方法

最新的Delphi XE4支持了iOS原生开发,凑着热闹也试了一下,发现很多传统Delphi界面开发的模式在iOS开发这儿都得到了延续,如创建窗体,拖拉控件,对控件的事件做处理等。可以通过它快速实现使用标准界面的应用。

初步感受之开发iOS程序的不足之处:

  1. 编译出来的文件比较大
  2. 一个简单的应用都快20MB的大小了,虽说现在手机的内存比较大了,但是也不能这么样吧,这还没算运行时需要的运行内存都这么大了,实际运行起来需要多少内存呢?

  3. 对用的最多的基本String行为做了修改
  4. 只支持Unicode的字符串,AnsiString不支持了,而且居然从0开始下标了,让熟悉了传统Delphi字符串以1为下标的人情以何堪啊

回到正题,真机调试过程中碰到的一些问题以及解决方法:

  1. 设置好Proile后,编译时在codesign时出现 [PAClient Error] Error: E0264 ambiguous错误
  2. 按照官方解释,只能有一个名称好用,当有冲突且错误提示中Matchs名称不一样的时候可以删除掉一个,或者修改名称唯一。但是还有一个问题其实就是这台开发电脑使用了好久,有之前的过期证书未被删除,这儿也是显示冲突的,需要在Mac证书助理中显示已过期的证书(默认不显示已过期的证书,你的感觉会同名的只有一个),然后将过期的证书删除,保证同名的只有一个即可正常通过codesign

  3. 执行文件时候出现 Unable to install package. (e8008015) 错误。
  4. 这个问题有人在EMB提问过,结果官方一句未能重新问题就打发了,对EMB鄙视。实际情况是做测试的机器的udid未在证书签名中,加入设备的udid后后重新签名证书,问题消失。

  5. 写的程序需要外部资源,未能在打包发布中带过去
  6. 这个问题需要在菜单的Deployment将需要的资源添加进去即可(要注意添加的目录和程序中的读取对应起来),在这儿再次鄙视EMB,居然没有资源的目录结构,且不能批量目录增加资源文件,需要手工逐个文件添加,对那些使用大量资源的人估计就惨了,在不同目录下拥有同名资源的人就更惨了。

Popularity: 8% [?]

Random Posts

TMS的MEMO控件(TAdvMemo/TTMSFMXMemo) 中文处理修订补丁

在Delphi下试用了TMS的TAdvMemo 和 TTMSFMXMemo 文本高亮显示,发现它们对中文的支持有缺陷(有中文的行中文显示不正常,光标定位不准等),于是乎分析跟踪了一下源码,对其做了中文处理的补丁。
为了修正对中文的处理,必须要对如下几个函数做补丁:
CharFromPos
CellFromPos
CellRect
PaintLine
修订后,中文显示正常,光标移动定位正常,鼠标点击选择正常

Popularity: 8% [?]

Random Posts

TIdHTTP访问从HTTP重定向到HTTPS页面出错问题的解决

使用TIdHttp 访问http协议的网页,碰到返回的页面自动重定向到https协议的地址,然后报不能创建SSL连接的错误。

网上搜索后发现只要在TidHttp对象创建后,再创建一个TIdSSLIOHandlerSocketOpenSSL 对象,将TIdHttp对象的IOHandler值设置为新创建的TIdSSLIOHandlerSocketOpenSSL对象,再次编译运行,问题就可以解决。可以自动获取跳转到https协议地址的网页内容。

Popularity: 7% [?]

Related

Delphi6总是提示要注册激活问题解决

好一段时间没有用 Delphi6了,今天在打开一个工程的时候竟然反复提示要注册。

就算是用Kg提供的SN与激活方法都失败了,激活步骤总是先提示注册成功,然后再提示注册失败,郁闷。。。

后来网上找到一篇:
找到注册表:
[HKEY_CURRENT_USER\Software\Borland\Delphi\6.0]

删除下面的 “LM” 键

照做后,再打开 Delphi6,果然全好了,继续使用Delphi6中…

Popularity: 6% [?]

Related

ASQLite控件的Blob类型字段内存泄漏问题

使用Delphi的ASqlite控件做Sqlite数据库的数据维护,最近打开一个大的表,总是报”out of memory while expading memory stream” 的错误,提示内存不足。

经分析,是由于ASqlite控件在默认情况下总是将数据装入内存,记录数太多时造成数据不能完整装入。经查有UniDirectional数据可是设置为单方向使用表,可以不将记录完整装入到内存。但是设置了该属性值为True后,遍历表仍然是”Out of memory while expanding memory stream” 错误,感觉没有起作用。

分析ASQlite的源码,发现其将memo类型数据当作blob类型处理,而在UniDirectional为True是,读取记录时创建的BlobStream没有释放,因此和UniDirectional为False时行为一样。

修正Bug,打开ASGSqlite3.pas,将

  1. function TASQLite3BaseQuery.GetRecord(Buffer: PAnsiChar;    GetMode: TGetMode;
  2.   DoCheck: boolean): TGetResult;

函数的末尾部分

  1.     if Result = grOK then
  2.     begin
  3.       if FUniDir then begin
  4.           ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
  5.           if ptr <> nil then begin
  6.              Move(ptr^, ActiveBuffer^, MaxStrLen);
  7.           end else Result := grEOF;
  8.       end else begin
  9.           ptr := FResult.GetData(FCurRec);
  10.           if FResult.Count = 0 then
  11.              InternalInitRecord(Buffer)
  12.           else
  13.              if ptr <> nil then Move(ptr^, Buffer^, MaxStrLen); // albert 17/11/2004
  14.       end;
  15.       …

修改为

  1.     if Result = grOK then
  2.     begin
  3.       if FUniDir then begin
  4.           // 增加部分,释放前一记录的blobstream内存
  5.           if FResult.Count > 0 then begin FResult.FreeBlobs; FResult.Delete(0); end;
  6.          
  7.           ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
  8.           if ptr <> nil then begin
  9.              FResult.Add(ptr, 0);  // 增加部分,当前行添加到缓存中,等待下次释放
  10.              Move(ptr^, ActiveBuffer^, MaxStrLen);
  11.           end else Result := grEOF;
  12.       end else begin
  13.           ptr := FResult.GetData(FCurRec);
  14.           if FResult.Count = 0 then
  15.              InternalInitRecord(Buffer)
  16.           else
  17.              if ptr <> nil then Move(ptr^, Buffer^, MaxStrLen); // albert 17/11/2004
  18.       end;
  19.      …

修改后编译程序,再次打开库文件遍历表,没有再次出现问题。

Popularity: 6% [?]

Related

Next Page →