const 到底怎么用?

cooling 2002-08-16 01:39:37
unit Unit1;

interface

{ 记住在uses部分中包括 ShellAPI}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ShellAPI, StdCtrls;

{自定义消息,当小图标捕捉到鼠标事件时Windows向回调函数发送此消息}
const MY_MESSAGE = WM_USER + 100;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormPaint(Sender: TObject);
private
procedure OnIconNotify(var Message: TMessage);
message MY_MESSAGE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}


{当小图标捕捉到鼠标事件时进入此过程}
procedure TForm1.OnIconNotify(var Message: TMessage);
const
Busy : Boolean = false;
begin
if not Busy then
begin
Busy := true;
if Message.LParam=WM_LBUTTONDOWN then
if Application.MessageBox('Are you sure','Exit', MB_YESNO)=IDYES then Close;
Busy := false;
end;
end;

{当主Form建立时通知Windows加入小图标}
procedure TForm1.FormCreate(Sender : TObject);
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid); // nid变量的字节数
nid.Wnd := Handle; // 主窗口句柄
nid.uID := -1; // 内部标识,可设为任意数
nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指?
nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指?

nid.szTip := 'This is a test application'; // 提示字符串
nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息
nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有?

if not Shell_NotifyIcon(NIM_ADD, @nid) then begin
ShowMessage('Failed!');
Application.Terminate;
end;
{将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;

{程序被关闭时通知Windows去掉小图标}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid); // nid变量的字节数
nid.cbSize := sizeof(nid); // nid变量的字节数
nid.uID := -1; //内部标识,与加入小图标时的数一致
nid.Wnd := Handle; //主窗口句柄
Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标
Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标
end;

{主窗口初始化完毕并显示时将激活Paint重画事件,此时将主窗口隐藏}
procedure TForm1.FormPaint(Sender: TObject);
begin
Hide;
end;

end.



这个是我看到的,试试看不行。好象const是不能在被赋值的吧。但我看到过很多都这么写:

比如
procedure TForm1.OnIconNotify(var Message: TMessage);
const
Busy : Boolean = false;
begin
if not Busy then
begin
Busy := true; // **** Left side cannot be assigned to****
if Message.LParam=WM_LBUTTONDOWN then
if Application.MessageBox('Are you sure','Exit', MB_YESNO)=IDYES then Close;
Busy := false;
end;
end;

Busy是const定义的,为什么下面还能赋值呢?
不过我在delphi6里编译通不过。
Left side cannot be assigned to

还请大家帮我看看。
...全文
48 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
siao 2002-08-16
  • 打赏
  • 举报
回复
好像是-1有问题吧!
我也做过这样的习作!但是现在不在身边!你试试看吧他设别的值
正常一点的!
cooling 2002-08-16
  • 打赏
  • 举报
回复
我照 dedema(思想恐龙) 的方法做了,第一个问题解决了。但是下面还有问题。我没有碰到过。谢谢大家再帮我看看。


{当主Form建立时通知Windows加入小图标}
procedure TForm1.FormCreate(Sender : TObject);
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid); // nid变量的字节数
nid.Wnd := Handle; // 主窗口句柄
nid.uID := -1; // 内部标识,可设为任意数
nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指?
nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指?

nid.szTip := 'This is a test application'; // 提示字符串
nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息
nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有?

if not Shell_NotifyIcon(NIM_ADD, @nid) then begin
ShowMessage('Failed!');
Application.Terminate;
end;
{将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;

还有这里:

nid.uID := -1; // 内部标识,可设为任意数

这里提示出错了。
说是Constant expression violates subrange bounds

到底为什么呢 ?
newnewworm 2002-08-16
  • 打赏
  • 举报
回复
const 是静态的 常量
var 变量
cooling 2002-08-16
  • 打赏
  • 举报
回复
《Delphi技术手册》
这本书是不是没有电子版的呀。我在网上找不到。
chll 2002-08-16
  • 打赏
  • 举报
回复
const
Busy : Boolean = false;
在后面的代码中, 对Busy进行了赋值. 缺省情况下, Delphi允许你这样做. 而且, 这样可以使下次调用TForm1.OnIconNotify()时, Busy保持上次修改后的值. 这相当于使用了一个全局变量.
关于这个技巧更多知识, 可以查看《Delphi技术手册》. 这种技巧的准确名称是"带类型常量".
dedema 2002-08-16
  • 打赏
  • 举报
回复
const也可以被赋值的,叫做可赋值常量,相当于C语言中的静态变量。
不过,要进行相应设置。方法是:菜单上的:project->options->
Compiler,然后让Assignable typed constantst选中,就可以了。
或者采用zswang(伴水)(准备去流浪) 的方法,给它加上个{$j+}的编绎
指示!
王集鹄 2002-08-16
  • 打赏
  • 举报
回复
unit Unit1;

interface

var
I1: Integer = 2002; //对于单元变量是可以赋初值的

implementation

var
I2: Integer = 2003; //对于单元变量是可以赋初值的

function f: Boolean;
//var
// J: Integer = 10; //对于函数变量却不可以
const
J: Integer = 10; //但通过类型常量来赋初值//这样就相当于静态变量//如果编译环境是{$J+}则可以修改其值
begin
end;

end.
macula55 2002-08-16
  • 打赏
  • 举报
回复
const是定义常量的,常量是不能被负值的。
将const改为var吧,他是定义变量的。
王集鹄 2002-08-16
  • 打赏
  • 举报
回复
procedure TForm1.OnIconNotify(var Message: TMessage);
{$J+} //如果你的编辑环境是Delphi6//可能这段代码是在Delphi5下调试的
const
Busy : Boolean = false;
//Delphi6默认为{$J-},而Delphi5默认为{$J+}
//具体资料请你参考Help
luoweicaisd 2002-08-16
  • 打赏
  • 举报
回复
把const改成var吧
票票飞扬 2002-08-16
  • 打赏
  • 举报
回复
const定义的当然不能赋值,
所以编译通不过。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧