Windows、Linux、Unix应用开发
循序渐进Linux下的Qt开发(1):开始前的准备工作
[
2010/04/17 15:35 | by 袁旭东 ]
2010/04/17 15:35 | by 袁旭东 ]
1.开始前的准备工作
1.1.Qt简介
Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt,基于 Framebuffer的Qt Embedded,快速开发工具Qt Designer,国际化工具Qt Linguist等部分Qt支持所有Unix系统,当然也包括linux,还支持 WinNT/Win2k,Win95/98 平台。
Trolltech 公司在 1994 年成立,但是在 1992 年,成立 Trolltech 公司的那批程序员就已经开始设计 Qt 了,Qt 的第一个商业版本于 1995 年推出然后 Qt 的发展就很快了。
基本上,Qt同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但QT最大的优点是跨平台特性:Qt支持Microsoft Windows 95/98, Microsoft Windows NT, MAC,linux,Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。
但是真正使得Qt在自由软件界的众多 Widgets (如lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脱颖而出的还是基于 QT 的重量级软件 KDE。
如果用户使用 C++,对库的稳定性,健壮性要求比较高,并且希望跨平台开发的话,那么使用 Qt 是较好的选择。
Qt现在的版本是4.6.2。有商用License和FreeLicense。但是值得注意的是,虽然 Qt的 Free Edition 采用了 GPL 宣言,但是如果你开发Windows 上的 Qt 软件或者是 Unix 上的商业软件,还是需要向 Trolltech 公司支付版权费用的。
1.1.Qt简介
Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt,基于 Framebuffer的Qt Embedded,快速开发工具Qt Designer,国际化工具Qt Linguist等部分Qt支持所有Unix系统,当然也包括linux,还支持 WinNT/Win2k,Win95/98 平台。
Trolltech 公司在 1994 年成立,但是在 1992 年,成立 Trolltech 公司的那批程序员就已经开始设计 Qt 了,Qt 的第一个商业版本于 1995 年推出然后 Qt 的发展就很快了。
基本上,Qt同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但QT最大的优点是跨平台特性:Qt支持Microsoft Windows 95/98, Microsoft Windows NT, MAC,linux,Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。
但是真正使得Qt在自由软件界的众多 Widgets (如lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脱颖而出的还是基于 QT 的重量级软件 KDE。
如果用户使用 C++,对库的稳定性,健壮性要求比较高,并且希望跨平台开发的话,那么使用 Qt 是较好的选择。
Qt现在的版本是4.6.2。有商用License和FreeLicense。但是值得注意的是,虽然 Qt的 Free Edition 采用了 GPL 宣言,但是如果你开发Windows 上的 Qt 软件或者是 Unix 上的商业软件,还是需要向 Trolltech 公司支付版权费用的。
KOL-CE TKOLListView的用法
[
2009/10/21 13:42 | by 袁旭东 ]
2009/10/21 13:42 | by 袁旭东 ]
使用KOL-CE后,就不能使用Lazarus自带的可视化控件了,而KOL控件的使用方法与标准的Lazarus控件有些不同,因此有必要针对我使用过程中遇到的问题说明一下。这次要说的是,ListView控件,在KOL-CE里叫做KOLListView。最常用到的方法就是往控件中增加数据行,用到了LVItemAdd方法。用法参考以下代码,我就不用文字描述了。
procedure TfrmMain.ShowClientInfo(cid: string);
begin
lvClient.Clear;
qryMain.SQL.Text := 'select cname,contact,tel,mobile,address,complete from clients where cid=' + cid;
qryMain.Open;
lvClient.LVItemAdd('名称');
lvClient.LVItems[0,1] := qryMain.Fields[0].AsString;
lvClient.LVItemAdd('联系人');
lvClient.LVItems[1,1] := qryMain.Fields[1].AsString;
lvClient.LVItemAdd('电话');
lvClient.LVItems[2,1] := qryMain.Fields[2].AsString;
lvClient.LVItemAdd('手机');
lvClient.LVItems[3,1] := qryMain.Fields[3].AsString;
lvClient.LVItemAdd('地址');
lvClient.LVItems[4,1] := qryMain.Fields[4].AsString;
lvClient.LVItemAdd('是否完成');
if qryMain.Fields[5].AsString = '0' then
lvClient.LVItems[5,1] := '否'
else
lvClient.LVItems[5,1] := '是';
qryMain.Close;
end;
procedure TfrmMain.ShowClientInfo(cid: string);
begin
lvClient.Clear;
qryMain.SQL.Text := 'select cname,contact,tel,mobile,address,complete from clients where cid=' + cid;
qryMain.Open;
lvClient.LVItemAdd('名称');
lvClient.LVItems[0,1] := qryMain.Fields[0].AsString;
lvClient.LVItemAdd('联系人');
lvClient.LVItems[1,1] := qryMain.Fields[1].AsString;
lvClient.LVItemAdd('电话');
lvClient.LVItems[2,1] := qryMain.Fields[2].AsString;
lvClient.LVItemAdd('手机');
lvClient.LVItems[3,1] := qryMain.Fields[3].AsString;
lvClient.LVItemAdd('地址');
lvClient.LVItems[4,1] := qryMain.Fields[4].AsString;
lvClient.LVItemAdd('是否完成');
if qryMain.Fields[5].AsString = '0' then
lvClient.LVItems[5,1] := '否'
else
lvClient.LVItems[5,1] := '是';
qryMain.Close;
end;
Lazarus编译文件减肥
[
2009/08/16 17:39 | by 袁旭东 ]
2009/08/16 17:39 | by 袁旭东 ]
什么是Lazarus?Lazarus是Free Pascal 的IDE,与Delphi非常的类似,操作方式和界面几乎一模一样。与Free Pascal 一样,Lazarus是一个开源项目。Lazarus相比Delphi有很多优点,比如:跨平台、支持的操作系统极为丰富、可在同一操作系统下交叉编译生成不同操作系统的程序等。
Lazarus有如此多的优点,使用的人在渐渐多起来。每一位第一次使用Lazarus的人都会遇到这样一个问题——为什么Lazarus编译出来的可执行文件如此之大,不写任何代码,编译出来的就有11兆之巨,而Delphi同样情况编译出来的就只有500多K。实际上Lazarus也可以编译出比较小的文件,只要简单的设置就可以。
运行Lazarus(我安装的是Lazarus 0.9.27测试版,以下就以此版本为例),点开“工程”->“编译选项”,在出现的对话框中点“链接”标签,将“当出现错误时显示行号”前面的对勾去掉,确定保存设置。按照上面的设置,重新编译一下工程文件,编译出来的程序文件就减小到1.7兆了。如果想继续压缩,那么就该使用UPX之类的压缩工具了。我用Lazarus自带的UPX压缩了一下,减小到了600多K,差不多可以接受了。
如果想进一步减少生成的程序文件体积,那么只能用KOL了。
Lazarus有如此多的优点,使用的人在渐渐多起来。每一位第一次使用Lazarus的人都会遇到这样一个问题——为什么Lazarus编译出来的可执行文件如此之大,不写任何代码,编译出来的就有11兆之巨,而Delphi同样情况编译出来的就只有500多K。实际上Lazarus也可以编译出比较小的文件,只要简单的设置就可以。
运行Lazarus(我安装的是Lazarus 0.9.27测试版,以下就以此版本为例),点开“工程”->“编译选项”,在出现的对话框中点“链接”标签,将“当出现错误时显示行号”前面的对勾去掉,确定保存设置。按照上面的设置,重新编译一下工程文件,编译出来的程序文件就减小到1.7兆了。如果想继续压缩,那么就该使用UPX之类的压缩工具了。我用Lazarus自带的UPX压缩了一下,减小到了600多K,差不多可以接受了。
如果想进一步减少生成的程序文件体积,那么只能用KOL了。
Delphi树形控件(TreeView)节点间的拖动
[
2009/04/16 20:51 | by 袁旭东 ]
2009/04/16 20:51 | by 袁旭东 ]
很久没写博客了,因为实在没什么东西可写。不过,今天以前的同事问我,关于TreeView的操作,那我就顺便写在博客里,稍微展开一下,说说TreeView吧。
TTreeView是VCL里面一个类,也是我们经常会用到的,而且功能也是很强大的。与TreeView相关的一个极其重要的类就是TTreeNode,我们下面的操作,几乎都是在围绕着它进行的。下面直接切入正题,要实现节点间的拖动,都需要实现哪几个事件呢?
TTreeView是VCL里面一个类,也是我们经常会用到的,而且功能也是很强大的。与TreeView相关的一个极其重要的类就是TTreeNode,我们下面的操作,几乎都是在围绕着它进行的。下面直接切入正题,要实现节点间的拖动,都需要实现哪几个事件呢?
引用
首先,要实现 OnMouseDown ,在其内要写入开启拖动的代码。
然后,要实现 OnDragOver ,其主要作用是在拖动过程中,实现对节点拖动目的(di)的控制。
最后,要实现 OnDragDrop ,其是实现拖动释放的操作。
然后,要实现 OnDragOver ,其主要作用是在拖动过程中,实现对节点拖动目的(di)的控制。
最后,要实现 OnDragDrop ,其是实现拖动释放的操作。
Delphi获取文件版本号
[
2009/04/10 23:16 | by 袁旭东 ]
2009/04/10 23:16 | by 袁旭东 ]
曾经在写的一个程序里面用到过,今天又用到了,顺便写在这里。
引用
procedure TfrmMain.FormShow(Sender: TObject);
var
BufSize, Len: DWORD;
Buf, Value: PChar;
begin
BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), BufSize);
if BufSize > 0 then
begin
Buf := AllocMem(BufSize);
GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, Buf);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\ProductVersion'), Pointer(Value), Len) then
Self.Caption := Self.Caption + ' ' + Value;
end;
Application.Title := Self.Caption;
end;
var
BufSize, Len: DWORD;
Buf, Value: PChar;
begin
BufSize := GetFileVersionInfoSize(PChar(Application.ExeName), BufSize);
if BufSize > 0 then
begin
Buf := AllocMem(BufSize);
GetFileVersionInfo(PChar(Application.ExeName), 0, BufSize, Buf);
if VerQueryValue(Buf, PChar('StringFileInfo\080403A8\ProductVersion'), Pointer(Value), Len) then
Self.Caption := Self.Caption + ' ' + Value;
end;
Application.Title := Self.Caption;
end;
Delphi:使用TQuery的SQL储存Memo内容
[
2009/04/08 22:10 | by 袁旭东 ]
2009/04/08 22:10 | by 袁旭东 ]
今天好容易有了一个比较轻松的下午,好久没有用Delphi做东西了,今天正好写一个小工具。小工具使用TADOQuery对数据库进行存取,并且使用到了TMemo控件。大家都知道,TMemo控件与TEdit控件的区别就是,TMemo控件是多行文本输入框,允许有回车。当我们update TMemo.Text的时候,会提示错误,具体错误忘记是什么了,造成错误的原因就是TMemo.Text中有回车。
解决问题的方法,修改TADOQuery的ParamCheck属性为False,即可解决问题。顺便说一下,为了防止TMemo自动增加换行,需要将TMemo的WordWrap属性修改为False。
解决问题的方法,修改TADOQuery的ParamCheck属性为False,即可解决问题。顺便说一下,为了防止TMemo自动增加换行,需要将TMemo的WordWrap属性修改为False。
Delphi读写INI文件
[
2009/03/26 16:59 | by 袁旭东 ]
2009/03/26 16:59 | by 袁旭东 ]
今天为了导用户库,用Delphi写了一个小工具,其中用到了ini文件保存数据库连接参数,所以这里顺便写写Delphi如何对ini文件进行操作。
第一步就是要uses IniFiles;
然后就是定义一个TIniFile对象;
接下来就是调用TIniFile对象的方法进行读写了;
最后是释放资源。
第一步就是要uses IniFiles;
然后就是定义一个TIniFile对象;
接下来就是调用TIniFile对象的方法进行读写了;
最后是释放资源。



