98-7-20 1:09 怎样设置一个Form的长宽的最大和最小值(从D201tech.hlp翻译) 在开始加入: TForm1 = class(TForm) private { Private declarations } procedure WMGetMinMaxInfo(var MSG: Tmessage); message WM_GetMinMaxInfo; ... 然后: procedure TForm1.WMGetMinMaxInfo(var MSG: Tmessage); Begin inherited; with PMinMaxInfo(MSG.lparam)^ do begin with ptMinTrackSize do begin X := 300; Y := 150; end; with ptMaxTrackSize do begin X := 350; Y := 250; end; end; end; 98-7-18 16:21 看了以前从网上下载的Tipexplr.zip。顾名思义,这是一个Delphi的Tips的管理 软件。带全部源码,才58K。它本身带有50个左右的很有用的小技巧,分成16大类,每个 条目都很好查。更妙的是,你可以动态更新Tips数据库。哎呀,我从前怎么没注意呢? 98-7-18 0:27 见到7月13日的《电脑报》上,有广西黄慧强的文章《在Delphi中支持文件拖放的程序》 试了一下,真的很好。突然很想知道他从什么地方学到的这些专业技巧。 unit drag_support_demo; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,shellapi, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure wmdropfiles(var message:tmessage);message wm_dropfiles; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Dragacceptfiles(form1.handle,true); end; procedure tform1.wmdropfiles(var message:tmessage); var p:array[0..254] of char; i:word; begin inherited; memo1.lines.clear; {$IFDEF WIN32} I:=dragqueryfile(message.wparam,$ffffffff,nil,0); {$ELSE} I:=dragqueryfile(message.wparam,$ffff,nil,0); {$ENDIF} caption:=inttostr(i); for i:=0 to i-1 do begin dragqueryfile(message.wparam,i,p,255); memo1.lines.add(strpas(p)); end; end; end. 98-7-17 18:05 刚才看到《电脑报》上的一篇文章, 差点晕过去。题目是《用Delphi实现超级链接》,是上海的汪箴 先生的。请看我7月3日的笔记:恰好比电脑报发表日期早10天。真不知是不是他......也许是我太多 心了?但不管怎么说,我很想也完全有资格发表这篇文章。要不,我有了好的主意,不把它先放在网 上,先投稿,等发表再说? 98-7-17 8:1 昨晚轻松地把GameMenu搞定了(见“我的作品”)。这个程序的主要思路是: 1.使用SystemParametersInfo()的SPI_SETSCREENSAVEACTIVE参数,使程序不响应Win95。 2.用HideTray和ShowTray过程,隐藏任务条。 3.程序运行时,最大化窗口,无标题。 4.提供加密存放的口令保护。 5.有运行日志功能。 这样,使用者就无法在程序运行的过程中,轻易地中止、切换程序,或是通过开始菜单运行其它程序。 另外,程序中还用到其它的一些小技巧。如有人需要源码,请发email。欢迎在信中简要介绍一下自己 :) 98-7-15 14:48 朋友找我做个小程序,要求只在win95中显示一个游戏菜单,别的程序通通不能调用,也不能激活开始 菜单。我记得见过一篇文章,大概是用SystemParametersInfo(),反正准能查到,就一口答应了。在 Win32API联机帮助里查到SPI_SETSCREENSAVEACTIVE参数,可怎么做都是不行.终于找到<电脑报>的这 篇文章,是上海的汪箴朋友的.原来要用SCREENSAVERRUNNING参数!要命的是,在帮助文件里没有! 唉,Delphi的帮助文件确实是错漏很多,... 附,具体实现方法:(我把原文的方法做了一点改进,详见<电脑报>6月8日"软件世界") 设置: systemparametersinfo(spi_screensaverrunning,1,nil,0); 取消: systemparametersinfo(spi_screensaverrunning,0,nil,0); 98-7-13 23:51 上大学时曾学过Pascal,但很快就忘光了;既然要学好Delphi,那就再补习一下吧. 字符串处理函数 copy(str,pos,num) 从str字符串的pos处开始,截取num个字符的串返回. 假设str为'abcdef',copy(str,3,2)='cd',copy(str,4,10)='def' concat(str1,str2{,strn}) 把各自变量连接起来,返回连接后的字符串(长度不能超过255) length(str) 返回str的字符个数,即其长度. pos(obj,target) 在target字符串中找出第一个出现obj的第一个字符位置,如果找不到,返回0. 数学函数 abs(x) 绝对值 arctan(x) 反正切 cos(x) exp(x) e的x次幂 frac(x) 取小数部分 int(x) 取整 ln(x) 自然对数 sin(x) sqr(x) x*x sqrt(x) 平方根 其它 pred(x) pred('D')='C', pred(true)=1; succ(x) succ('Y')='Z', succ(pred(x))=x ord(x) 求x在字符集中的序号,如ord('A')=65 chr(x) chr(65)='A' round(x) 四舍五入 trunc(x) trunc(4.8)=4,trunc('-3.6')=-3 upcase(x) upcase('a')='A' hi(I) hi($2A30)=$2A lo(I) lo($2A30)=$30 random(n) 产生[0,n)间的随机整数 sizeof(name) 求出某类型或变量在内存中占用的字节数 swap(num) swap($3621)=$2136 98-7-13 23:51 加密/解密一个字符串(摘自D201tech.hlp) { Begin code } program Crypt; uses WinCRT; const C1 = 52845; C2 = 22719; function Encrypt(const S: String; Key: Word): String; var I: byte; begin Result[0] := S[0]; for I := 1 to Length(S) do begin Result[I] := char(byte(S[I]) xor (Key shr 8)); Key := (byte(Result[I]) + Key) * C1 + C2; end; end; function Decrypt(const S: String; Key: Word): String; var I: byte; begin Result[0] := S[0]; for I := 1 to Length(S) do begin Result[I] := char(byte(S[I]) xor (Key shr 8)); Key := (byte(S[I]) + Key) * C1 + C2; end; end; var S: string; begin Write('>'); ReadLn(S); S := Encrypt(S,12345); WriteLn(S); S := Decrypt(S,12345); WriteLn(S); end. 98-7-3 11:49 真是太丢人了.我犯了一个简单的错误,竟然用了好长时间才找出.但我想也许会有 别的朋友也会遇到,不妨把它写下. 事情是这样的:从昨天下午,我发现Delphi中按CTRL-F查找时,不论输入什么,总是 有错误提示 Tried to search marked block but it is invalid. 我想,有可能这两天安装某软件,造成系统文件不一致.于是我重新安装了一遍Delphi. 还是照旧.于是我进入纯MSDOS方式,键入命令 copy /windows/sysbckup/*.dll /windows/system 也不行.又打开Delphi的所有有关选项设置的对话框,也没找到有相关的信息.最后, 我想,是不是就在Find对话框中?再次Find,看到对话框里的Scope组中不知何时选了 selected text,(难怪!)改成Global,按OK.真相大白. 98-7-2 21:02 在程序中调用浏览器 一直很羡慕别人能在程序中加入一个有主页地址的Label,点它会直接进入Win95 的缺省浏览器。“这里面用了什么高级系统调用呢?”想啊想啊...... 你有没有听说过“精诚所至,金石为开”?我就是。因为我终于想到了!请看: 1、在Form上放一个Label1,Caption设为一个URL,如 http://afg.yeah.net 在Font选项中选中下划线。 2、双击它,进入onClick事件。加上: ShellExecute(Handle, nil,pchar(Label1.caption),'','', 0); 3、在程序开头部份的uses子句中加上 shellapi。 运行。怎么样?感觉很好吧。另外,如果想调用Email程序也很简单,只要这样写 mailto:afg@163.net 就搞定了。至于其它Internet服务如ftp,telnet,gopher,news...应该同样道理吧。 98-7-1 21:41 今天上传了rxlib.zip。别小看它,我认为这是一个相当好而全的元件库。 因主页空间有限,只好删除……安装步骤如下:(我只在Delphi3.0下安装过) 1、解压至一个新的子目录中,运行rxinst.exe,此后会自动安装在delphi 3/rx下。 2、将rx/units下的Rxctl.dpl,Rxdb.dpl,Rxtools.dpl拷贝到windows/system目录。 3、在菜单"File/Open..."下打开Rxctl.dpk,选Compile.用同样方法compile另两个 文件Rxdb.dpk和Rxtools.dpk. 4、打开Dclrxctl.dpk,单击Install按钮。经过几秒钟后,Delphi提示:已正确安 装如下组件:...... 5、如法安装Dclrxdb.dpk,Dclrxtls.dpk。 好了,看一下VCL组件工具条的最右边,已经多了RX Controls,RX DBAware,RX tools 三组共58种功能强大的组件,够爽吧?用一下看。(遗憾的是只有俄文的说明。) 98-7-1 10:10 FileGetAttr函数的注意事项 FileGetAttr(FileName)返回filename指定的文件的属性.在Delphi的Demo fmxutils.pas里有这样一个实用函数: function HasAttr(const FileName: string; Attr: Word): Boolean; begin Result := (FileGetAttr(FileName) and Attr) = Attr; end; 但我在实际使用中,却得到了错误的结果:当filename不存在时,result恒大于0! 这是因为FileGetAttr在遇到一个错误时,会返回-1,而-1即$FFFF,或$FFFFFFFF, 和任意非0值相与,当然都会大于0了. 98-6-30 23:43 Vitual Key 键值列表 如果你要编写OnKeyDown一类的过程,那就一定用得着它。 98-8-12 9:15 今天我发现, 这里的列表并不全; 真正全的在Windows.pas里。仔细一看,里面 好东西多多:有Windows错误代码的简要说明,还有各类纸张的名称、大小…… 所有和windows有关的常量的定义和注释都能在里面找得到,有些还有用ASCII 码画的表格呢! 98-6-30 23:32 如何自动注册(login)一个有口令保护的Paradox表? 首先,这个table的属性必须为false(否则在一开始就会提示输入口令),然后 把这两条指令放入form的onCreate中去: Session.AddPassword('My secret password'); Table1.Active := True; 关闭这个table时,可以用下面命令清除口令 RemovePassword('My secret password'); 或用这条命令清除所有口令 RemoveAllPasswords; (注:以上均只对Paradox适用) 98-6-30 23:24 运行中拖动一个元件(翻译) 在一个新的Form中放入一个Panel,加入如下代码: procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; { a magic number } begin ReleaseCapture; panel1.perform(WM_SysCommand, SC_DragMove, 0); end; 运行,你当然知道这时应该拖动它。怎么样?Delphi真是神奇。 98-6-30 1:35 StatusLine在运行时竟然可以通过鼠标拖动改变大小! 通过设置SizeGrip为true(这也是投省值)来实现。真有趣。利用这个特性, 可以用在开发中,实现一些有用的功能。 98-6-28 21:58 几个新函数EncodeDate,Assigned EncodeDate(Year, Month, Day: Word): TDateTime; 给定year,month,day,这个函数可以返回一个TDateTime类型。 相关函数:DateToStr,EncodeTime,DecodeDate。 Assigned(p:pointer):boolean; 如果p为nil,返回false;否则返回true.但它无法判断p是否一个合法的指针。 示例: var P: Pointer; begin P := nil; if Assigned (P) then Writeln ('You won''t see this'); GetMem(P, 1024); {P valid} FreeMem(P, 1024); {P no longer valid and still not nil} if Assigned (P) then Writeln ('You''ll see this'); end; 98-6-26 22:13 今晚在浏览Delphi的Online Help时,又发现了两个很好用的内部函数: High()和Low() 先说High:High(X)函数返回参数的取值范围内的最大值,其类型为X,或X的 索引。X既可以是一个类型标识,也可以是一个变量,其类型必须为下面之一: 变量类型 High(X)的返回值 ------------------------------------------- 序数类型 这一类型的最高取值 数组类型 数组索引的最大值 字符串类型 这一字符串声明过的长度 动态数组 返回实际元素个数的负值 字符串参数 返回实际元素个数的负值 示例: function Sum( var X: array of Double): Double; var I: Word; S: Double; begin S := 0; { Note that open array index range is always zero-based. } for I := 0 to High(X) do S := S + X[I]; Sum := S; end; Low(X)的含义可以参考上面的描述,但正好相反。 98-6-25 0:52 TBitmap.Transparent和TransparentColor 在查看Delphi的Help时发现,设置TBitmap.Transparent为true,再适当设置 TBitmap.TransparentColor,可做出具有透明效果的Bitmap来。 98-6-24 23:22 今天看到一张光盘上有不少Delphi的技术文件,其中有一个是D201tech.hlp, 顾名思义,是关于Delphi2.01的。打开一看,竟有许多对我而言非常有用的条 目。如“自动连接Paradox数据库”,“virtual key键值列表”,“从BLOB字 段中取得Bitmap”,“加密/解密字符串”,“使用Bitmap做为FORM的背景”, “利用后台线程优化数据库查询”......太好了。我打算把它放在“技术文档” 中,供朋友们下载。有时间的话,也会有选择地翻译几个,给英语不太好的朋 友提供一些方便。:)
Delphi----心得02
最新推荐文章于 2020-10-31 17:03:02 发布