登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: kylix的1700个陷井     [回主站]     [分站链接]
标题
kylix的1700个陷井
clq
浏览(0) + 2006-04-17 22:29:58 发表 编辑

关键字:

可以说kylix是建立在clx上的delphi,但它隐含着许多陷井会让一个用惯delphi的人吐血身亡。下面是我或者其他..留下的足迹:

之前我已经发表了几篇很重要的关于kylix3在redhat9下安装使用的重要信息,请兄弟们一定要先看过那些文章再往下看.

先说一下,我跨平台的组合是delphi7+kylix3

2006.4.17
kylix的string与delphi的string其实是不同的,甚至delphi7中的clx程序的string都与vcl的不同--它是utf8的(vcl的是普通单字节字符)--虽然我还没看到别人这样说.这个重要吗?重要!很多程序员喜欢用string来保存二进制内容,这在vcl或者我们普通的delphi程序中是可以的,但在clx下不要这样做!即使在C++也是可是这样做,BS就说可以.但clx不行,因为用了utf8就表示它隐含有代码转换,这是会改变其中的二进制内容的.就象java的字符串不适宜用来保存二进制内容是一样的,这时候一般的替代办法是用base64编码.其实我今天就碰到了公司所用的base64解码函数在clx环境下不能使用的情况.也许这是因为他们不知道delphi7中有base64的函数 -- 在EncdDecd单元中,用string来作二进制数据的参数,这也是一个巨大的错误,我们来看看这4个函数的参数:
procedure EncodeStream(Input, Output: TStream);
procedure DecodeStream(Input, Output: TStream);
function EncodeString(const Input: string): string;
function DecodeString(const Input: string): string;

[往具体的说,他们使用stringgrid的一个cell来保存二进制内容导致了二进制内容的更改]

clq
2006-4-17 22:35:15 发表 编辑

utf8并不是官方说法,仅供参考.
clq
2006-4-17 22:37:37 发表 编辑

Delphi Language Reference
WideString

Topic Groups      See Also
-----------------------------------------------
The WideString type represents a dynamically allocated string of 16-bit Unicode characters. In most respects it is similar to AnsiString. On Win32, WideString is compatible with the COM BSTR type.

Note

Under Win32, WideString values are not reference-counted. Under Linux, they are. For more information, see About extended character sets.

clq
2006-5-7 13:36:39 发表 编辑

窗体激活的 bug。
一般在windows下,只要用form.show()就可是激活一个窗体.但在kylix/clx下还要用一个form.setfouce. 另外,我还发现了一个clx控件本身的bug:stringgrid如果有焦点的话,会在别的窗体激活后又再将自己的父窗体激活! 这是比较严重的bug,我的解决办法是在要激活别的窗体的,先将stringgrid的焦点转移到一个edit控件上.

clq
2006-7-5 21:57:14 发表 编辑

差点忘记说了。今天发现了一个bugtscrollbox中的控件hide或show时居然后改变某些东东的位置,我用了一个特别的方法可以避免这种情况。但速度非常慢[不过是今天才发现是它导致速度慢的[s:7] ] 想了想先用几个数组保存所有要hide的控件的指针,在(对我来说是循环)处理完后再一起hide。果然ok了,速度极快。 [s:9]
clq
2006-7-5 21:57:39 发表 编辑

明天说一下那个特殊的方法,有点忘记了。
clq
2006-8-14 23:46:00 发表 编辑

好像是先隐藏滚动条,设定完位置后再恢复。
clq
2006-8-15 0:03:59 发表 编辑

今天碰到一个问题,不过应当说是 delphi 语言本身的问题。我用 array[0..1024] of char 保存二进制缓冲,然后用 copy() 函数取其中一段用 string 来保存。最后这个 string 交给 delphi7 自带的 base64encode 函数编码。ok 一切工作正常。但当我想把这段代码封装到一个自定义函数时,去出了问题。最后发现是我用的函数参数引起的--为了与c的兼容思想,我用了pchar将 array 传递进来,但是执行到 copy 函数后却惊讶地发现这时得到的 string 已经与前面的不一样了!它像 C 语言一样将 0 结尾后的字符全部去掉了,在c++ 里这是经常发生的,但在 delphi/kylix 里是可以这样做的呀。难道 copy 函数对 pchar/array/string 这三者的操作不一样吗?而这个 copy 函数又不像别的函数那样可以看到源码,只好自己测试了多种情况,最后得出的结论是,对array/string的处理是一样的,但对 pchar 的处理却是与C一样把 0 当作终止的,即使你指定了要复制的内容的长度(可能是防止访问内存越界)。不过我觉得 copy 函数不太可能为不同类型定义不同的算法,真正的原因应当在类型转换上,它肯定是只处理string的类型,但你给的参数是pchar,它只好先隐式的做个转换,产生一个string的中间变量,而pchar转换成string确实是要把'\0'当作结束符的(因为它没有别的办法确定串的结束,而string本质是一个结构,有一个长度字段的)。所以才产生了前面的奇怪情况,最后我将参数改为 const string ,这时接收过来的array就不会丢失内容了。

还有一点比较奇怪的,copy函数的“源”内容参数居然是无类型的,唉,语法的不明确我觉得是delphi/kylix和pascal最致命的弱点。

clq
2006-8-15 0:07:39 发表 编辑

以后还是尽量用 c 的字符缓冲来处理二进制内容好了。不过delphi的那些 c 风格函数在多线程下是不行的,嘿,用得越多,我对 delphi 就越是失望。
clq
2006-8-30 20:59:14 发表 编辑

linux下怎么执行别的程序呢?linux下有一个独特的单元 libc ,它就是linux下 c 语言函数的封装,它们的函数都是相同的,所以我们可以用 system() 函数. 即 libc.system() .方法与c完全相同,但执行的结果却与 c 语言中的效果有所不同,我也不知道为什么. 比如公司今天要做一个显示 html 页面的东东,C下面直接调用 system("htmlview"); 就ok了.但kylix死活不行,甚至在我用c写了一个动态库导出的 system 函数也不是,但它执行 ls 这些命令都是很好的,甚至可以良好的调用 gedit .晕了,为什么?最后在同事的提醒下我调用了firefox来显示这些 html 文档,这时是一切正常的.好在 redhat9 上安装 firefox 是非常容易的(其实只要解压就完了,根本就不用安装).至于 htmlview 为什么调用不了...去问上帝吧.

还要注意,system的执行完全相当于您在命令行中输入命令的效果,所以它是阻塞式的,在 gedit 执行期间,您的程序是不响应任何操作的.当然linux的老手都会知道要在命令行后加一个 "&" 符号,这个符号的意思是说调用后立即返回不要等待 -- 很多象我一样"常年"呆在windows上的兄弟们要特别小心这一点.


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


所在合集/目录



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


附件:



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

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