Delphi----心得05

99-1-28 10:13
今天忽然发现Delphi4.0的quick report不好用了。
在财务科,有我开发的一个应用,原来一直用得好好的。自从我升级到了Delphi4,
又因改动重新编译,再运行时,quick report的preview的所有按钮都没有了图标,
除了最后的那个'close'。原先的报表现在打印出来变了样,有个currency类型的
cash项,因为autosize设成了true,每次打印时总是分成2行,第一行是¥,第二行
才是值;column header 在第一页不打印!

98-12-31
下面技巧大概来自Kiven的“电子书库”,(因为后来我又找不到了)
在IDE中设置书签(爽!)
Ctrl+Shift+0~9 设置书签
Ctrl+0~9 快速跳转到书签的位置

98-12-31
看了UDDF(Unofficial Delphi Developers FAQ),哇噻,好东西多多!!!
现在我没空,等抽空再捡有用的翻译几篇。如果你的英文够好,不
妨自己先下载看一下。

98-12-21   以下tips来自“四眼工作室
数据库应用程序中一般都会有备份功能,即复制一个完全相同的数
据库
。可以这样实现:假设table1已关联着要被复制的库了,
t: TTable;
...
Table1.Active := True;
t := TTable.Create(self);
t.DatabaseName:="c:/test/creattab";
t.TableName:="BackUP.db";
t.Fielddefs.Assign(Table1.Fielddefs);
table1.IndexDefs.Update;
t.IndexDefs.Clear;
t.IndexDefs.Assign(Table1.Indexdefs);
t.CreateTable;
t.BatchMove(Table1,batAppend);
t.Close;
-----------------------------------
当我们用DBGrid显示Table中的记录时,有时候需要左边的一列
或两列在做水平滚动时不被移出屏幕
。如就有人向我提出在做水平
滚动时,"姓名"字段能不能始终保留在屏幕上,由于DBGrid控件
没有FixdCols属性,但TStringGrid控件有,如果我想让DBGrid
最左边的那一列固定,可以这样写:
TStringGrid(MyDBGrid1).FixdCols=2;
如果想让最左边的两列固定就写成:
TStringGrid(MyDBGrid1).FixdCols=3;
依次类推。在实际使用中对纯浏览没有任何问题,但同时要
对表格录人的话会有点小问题,但无碍大局
另外要注意的是:DBGrid所涉及的Table要先置Active为True
然后再执行上面置固定列数的语句,否则不起作用。

:我在编程时遇到过这个问题,但却没有想到这个看似简单的解决方法。
惭愧呀惭愧。

98-12-21  (文摘) Delphi4.0与Delphi3.0之间的区别
当然,如果你幸运地得到了Delphi4,就可以更容易地开发功能更
加强大的应用程序,特别是从一开始就使用Delphi4进行工作。但
是它与3.0版在某些地方有一些区别,在3.0环境下开发的早期软
件有时需要进行调整方能在4.0编程环境下适应。同样,将它再返
回3.0中调试,就有许多的属性不能被认识了(3.0版也算旧?真
是—这世界变化快!)。为支持原3.0版本下开发的软件,在调入
4.0版本中时,应用软件被自动调整了一些东西,如加入了窗体建
立(FROMONCREATE)事件的响应顺序设置的旧版本兼容代码,因
为新版本对这个响应顺序进行了调整。新版本中的QuickReport控
件是3.0的升级版,虽然它的功能有所增强,但某些时候还不如旧
版本。如在老版本中设计的打印控件如果不在BAND内,仍可正确
打印,而新版却规范得要求所有打印信息必须包含在BAND中,否
则什么效果也不显示,当然不能正确打印了。所以将QRLabel,
QRDBText这样的控件直接放入QuickRep报表控件中进行打印是行
不通了。这一点在用不同版本的DELPHI开发时就要注意了。旧版
本中的TeeChart控件中的某些控件属性的常量值,在新版本中也
不能认识,可能需要首先进行声明。如语句:
DBChartnumber.Gradient.Direction:= gdRightLeft中,
颜色渐进方式:gdRightLeft等常量在代码方式下就不能被DELPHI4
认识。如前面所讲,Delphi4当然增了许多新功能,简单的如位图
菜单等,但它的运行速度也是个问题,在奔腾166档次以下的机器
中,还是用3.0好。在早期3.0版中做的工作如果升级到4.0中继续
的话可能会重头开始,甚至行不通。如许多第三方的控件支持工
具,可以安装到3.0中运行(提供了1/2/3各版的支持),由于3.0
版的支持库文件.DPL已经变为4.0的.BPL,所以这些第三方开发工
具就已经无效了,除非有这些工具的源代码,重新编译一遍—这
是极不现实的。我们现在得到的Delphi 4可能是它的Beta版,看
看它附带的ISEXPRESS安装工具名(InstallShield For Delphi 4
Beta)就知道了。
----看了这篇短文,我决定暂不升级到4.0,因为我的CPU是K5-133.

98-12-8
请看我在《中国计算机报》上发表的巧用ActiveX控件制作全功能浏览器

98-12-8 
下面的小技巧来自http://www.netease.com/~qiu/,对我来说,十分有用。
问题:很多软件安装后都会在桌面上生成自己的快捷图标(Shortcuts)或
在Start Menu中加入一项
,如Winzip等,这是如何实现的呢?
技巧26:好了,启动你的Delphi 3!在窗口中放一个TButton,起名叫做
Button1。双击这个Button,然后照抄下面的代码即可:(下面的代码读
取了注册表中的
HKEY_CURRENT_USER/Software/MicroSoft/Windows/CurrentVersion/Explorer
/Shell Folders里的某些值,详见代码)
uses
ShlObj, ActiveX, ComObj, Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyObject : IUnknown;
  MySLink : IShellLink;
  MyPFile : IPersistFile;
  FileName : String;
  Directory : String;
  WFileName : WideString;
  MyReg : TRegIniFile;
begin
  MyObject := CreateComObject(CLSID_ShellLink);
  MySLink := MyObject as IShellLink;
  MyPFile := MyObject as IPersistFile;
  FileName := 'NOTEPAD.EXE';
  with MySLink do begin
    SetArguments('C:/AUTOEXEC.BAT');
    SetPath(PChar(FileName));
    SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
  end;
  MyReg := TRegIniFile.Create(
        'Software/MicroSoft/Windows/CurrentVersion/Explorer');

  // 下面的这行代码在桌面上生成快捷图标
  Directory := MyReg.ReadString('Shell Folders','Desktop','');

  // 下面的这三行代码在Start Menu中加入相应的ShortCut
  Directory := MyReg.ReadString('Shell Folders','Start Menu','')+'/Whoa!';
  CreateDir(Directory);

  WFileName := Directory+'/FooBar.lnk';
  MyPFile.Save(PWChar(WFileName),False);
  MyReg.Free;
end;
这个生成的快捷方式运行的结果是在Notepad中打开Autoexec.bat文件。

98-11-24 15:14  (这几个也是从网上找的,但我记不清出处了……)
生成非矩形窗口
利用win32 API函数setwindowrgn可以将窗口定义为任何形状,以下是将窗口定义为园角矩形的例子:
procedure TPortForm.FormCreate(Sender: TObject);
var hr :thandle;
begin
  hr:=createroundrectrgn(0,0,width,height,20,20);//定义园角矩形(win API函数)
  setwindowrgn(handle,hr,true); //设置园角窗口
end;
为了使该窗口更好,应在onResize事件处理程序放相同的代码。
(以下为我的示例)
-- var hr :thandle;
-- begin
-- hr:=CreateEllipticRgn(0,0,200,400);
-- setwindowrgn(handle,hr,true); //设置园角窗口

------------------------
getkeyboardstate(ks);//检测键盘函数
if odd(ks[VK_NUMLOCK]) then ...

98-11-20 15:18   以下tips摘自http://ftp.maoming.gd.cn/c/lyzyd/Client.htm
任意打印
  有时我们要打印任意排列的表或往已经印好的登记表上对号入座写上数据时,可以新建一个窗体(假设为Form1),再把Form1的BorderStyle设为bsNone、AutoScroll设为True,接下来再创建一个新窗体(假设为Form2),再建个按钮Button1,编写代码:
procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Width :=900;
  Form1.Height :=800;
  Form1.Print;
end;
接下来你在Form1上对应的位置写上数据,运行后按Button1就会一五一十的打印下来了。
关闭外部应用程序
如何在 Delphi 应用程序中, 去关闭外部已开启的应用程序?
下面给出一段在 Delphi 中关闭计算器程序为例:
var
  HWndCalculator : HWnd;
begin
  // find the exist calculator window
  HWndCalculator := Winprocs.FindWindow(nil, '计算器'); // close the exist Calculator
  if HWndCalculator <> 0 then
    SendMessage(HWndCalculator, WM_CLOSE, 0, 0);
end;

隐藏桌面上的图标--使桌面上的图标消失,连桌面上的右键功能也不能使用
var
  hDesktop : THandle;
begin
  hDesktop := FindWindow('Progman', nil);
  ShowWindow(hDesktop, SW_HIDE);
end;

98-11-16 20:36
今天又被Delphi耍了一回。 :(
在调试程序时,原本好好的一个Dialog,忽然在运行时出现:
Cannot make a visible window modal
真是奇怪,这是什么意思呢?我的调用部分如下:
reportsdlg:=treportsdlg.create(self);
reportsdlg.showmodal;
reportsdlg.free;
当我单步跟踪时,我发现在create之后,将会执行reportsdlg的onshow事件。
这可奇了,从来没见到过create后立该就show的。难道Delphi出现了bug?

心中既然认定了是bug,思路就走向错误的方向。我把reportsdlg里的全部元
件和代码删除,只留下刚建立form时的骨架,再运行,还是老样子!

我打开了老版本的程序,二者仔细比较。终于发现,我误把reportsdlg的form
的visible属性设成了true。

当TForm.visible=true时,调用了create之后,会自动再调用show的。因此不
能再用showmodal来以模态显示它。

98-11-16 23:04
请看下面的语句有什么错误:
with dm.Dw_ioTable do
begin
first;
while not eof do // Delete All
begin
delete;
next;
end;
end;
看出来了吗?应该去掉那个'next'!不然的话,只能删除一半的记录。
chat* fool angela -- 这时候,文安生觉得自己笨得象只小笨猪!

98-11-8 21:42
在使用Dialup控件的过程中,我感觉由于它是个多线程的控件,程序写起来很不凑
手。常常是一个本来很简单的概念,实现起来要在多处进行控制。比如拨号,调用
完异步Dial方法后,指令流立即返回到调用的下一行,而有可能半分多钟之后,拨
号才成功,在这期间主程序只能等待;拨号成功后,只能由ActiveConnection事件
得到信息并取得控制权。这完全不是我们平常所用的思维模式。经过反复试验,我
写了一个DialStatus.pas单元,它既是一个Dialog,又是一个过程的集合。有了它,
无论测试连接状态、拨号、挂断,都只要一条指令就能完成。

98-11-7 23:18
一个月来,写了一个Webmoney,一个Backup it!。加上以前写的,也算有几样“作
品”了。同时经验和体会也有一些:
·写程序时每用一个控件或变量,要起个明明白白的名字,如EditBtn,sPrjName等,
最好要养成一个好的习惯,如integer变量名前可缀以i,string型的缀s,字符串
列表的可缀ss,指针缀p,等等。(其实这都是我个人的想法,并没有见任何官方
的正式文件。)
·写到一些关键复杂的部分,要随手做注释,这同时也可理顺一下自己的思路。几
十行的小程序自然可省去不写,但程序越大,注释的作用就越大,大得超乎想象。
·重复的部分可单列一个过程或函数。可减少出错的机会。
·每个独立的由多个文件组成的工程最好单独放在一个子目录里。最好在工程第一
个Form时,就选Save All,然后建立一个目录,并存入。此后,每当建立并储存
新的单元,都会自动存在这里的。(老生常谈?)
·好象还有一些,但记不得了。将来随时补记吧。

98-11-7 22:43
近日在看程序时忽然明白了一个关窍:那就是MessageBoxMessageDlg好。

唉,我以前写程序在调试时用showmessage()显示信息,正式写时就用
MessageDlg(),但它有个毛病:显示出的按钮总是"Yes","No","OK","Cancel"
字样,令我的号称“全中文”的软件减色不少。为什么不能打出Windows的
标准的带中文按钮的对话框来呢?原来要用MessageBox!比如:
if MessageDlg('是否真的退出?',mtInformation,[mbYes,mbNo],0)=mrYes then close;
用MessageBox写就成了:
if MessageBox(handle,'是否真的退出?',pchar(caption),mb_IconInformation+mb_YesNo)=mrYes then close;
二者差不太多,但还是有区别的:
·MessageDlg的按钮caption是英文,MessageBox是中文(在中文Windows95下)
·MessageDlg带HelpCtx(即Help Context,一般用不着),而MessageBox可以自定对话框标题(常用)
·MessageDlg是Delphi对MessageBox的二次实现,在Uses里要加Dialogs声明

害得我对从前的程序一通好改!

另外,ShowMessage()实际上与MessageDlg同出一辙,这就是为什么它也要Uses Dialogs,同理,
我们也可以写一个自己的ShowMessage:
procedure myShowmessage(msg:string);
begin
MessageBox(handle,pchar(msg),pchar(caption),mb_IconInformation+mb_OK);
end;

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值