Delphi----心得02

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的背景”,
“利用后台线程优化数据库查询”......太好了。我打算把它放在“技术文档”
中,供朋友们下载。有时间的话,也会有选择地翻译几个,给英语不太好的朋
友提供一些方便。:)
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值