Const定义的变量 在 Delphi6 下不能用了??

kylix2001 2001-07-09 04:30:43
如:
const
i:integer=0;

......

i := 2;
//这句出错:Left side cannot be assiened to

我现在的机子暂时没D5(还没装),所以没法试,但我记得D5下是没错的。


...全文
668 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
kylix2001 2001-07-20
  • 打赏
  • 举报
回复
给分了。
kylix2001 2001-07-13
  • 打赏
  • 举报
回复
完全同意Tod(菜鸟),Borland已经不推荐const i:integer = 1;的这种类型了。
所以在D6中,默认是{$J-}。详见:http://www.csdn.net/develop/article/8/8808.shtm
光明山人 2001-07-11
  • 打赏
  • 举报
回复
这是D5的HELP:

Type Switch
Syntax {$J+} or {$J-}
{$WRITEABLECONST ON} or {$WRITEABLECONST OFF}
Default {$J+}
{$WRITEABLECONST ON}
Scope Local
The $J directive controls whether typed constants can be modified or not. In the {$J+} state, typed constants can be modified, and are in essence initialized variables. In the {$J-} state, typed constants are truly constant, and any attempt to modify a typed constant causes the compiler to report an error.
In previous versions of Delphi and Borland Pascal, typed constants were always writeable, corresponding to the {$J+} state. Old source code that uses writeable typed constants must be compiled in the {$J+} state, but for new applications it is recommended that you use initialized variables and compile your code in the {$J-} state.

我稍译一下吧,译得不好不许骂我:
<--开始-->
$J伪指令控制类型常量能否被修改。设定{$J+}时,类型常量能被修改,其本质上是一个初始化了的变量。设定{$J-}时,类型常量是真正的常量,如果试图在程序中修改它会引起编译错误。
在以前版本的Delphi和Borland Pascal中,类型常量总是可写的,相当于{$J+}状态。使用可写类型常量的旧版源程序必须在{$J+}状态下编译,但是推荐新应用程序使用初始化的变量并在{$J-}状态下编译。
<--结束-->

我注意到D5默认状态为{$J+},D6还没用,不知道,应该如kylix2001所说,变成了{$J-}
initialized variables应该指的是:
var
i: Integer = 1;

liguang 2001-07-11
  • 打赏
  • 举报
回复
const i:integer=1这样的语句用处太多了,感觉D6真的是莫名其妙这样做。
Tod 2001-07-11
  • 打赏
  • 举报
回复
补充一点:在delphi6里const i:integer=1这样的用法确实不行了,必须要像var i:integer=1才行,而且不能是本地变量。
Tod 2001-07-11
  • 打赏
  • 举报
回复
我是菜鸟,但这个问题我可以回答,看来各位大虾有时候简单问题也搞不清啊!
const是定义常量的关键字,但本人从学delphi开始(始于delphi3)就知道:
形如“const i:integer=1;”的格式并不表示i为常量,而是叫做“类型常量”,是一种新的数据结构,可以看作是初始化了的变量。
系统只会对该类型常量初始化一次,而不论该类型常量被调用多少次!!
kylix2001 2001-07-10
  • 打赏
  • 举报
回复
是啊是啊,不问这个问题,我都不知道还有这个东东。:)
我是根据 {$WRITEABLECONST ON} 才找到 {$J+}的。
myxfang 2001-07-10
  • 打赏
  • 举报
回复
看了delphi帮助,终于明白了
加了{$J+}常量可以当变量,不加只能是只读

In the default {$J+} compiler state, typed constants can have new values assigned to them; they behave essentially like initialized variables. But if the {$J-} compiler directive is in effect, typed constants cannot change value at runtime; they are, in effect, read-only variables.
kylix2001 2001-07-10
  • 打赏
  • 举报
回复
楼上的兄弟,我不知道你的Object Pascal学得如何。
你还是把上面的例子趋试试吧?试试就知道了。:)

AdminBO 2001-07-10
  • 打赏
  • 举报
回复
兄弟,const是常量不是变量,const没有类型,var有类型!
const
s=ddddddddddddddd....
var
i:integer=0;
you try
基本的定义要搞清楚!
kylix2001 2001-07-10
  • 打赏
  • 举报
回复
其实我就是从coDelphi.com看到了一个程序,就试了一下,才发现这个问题的。
这是一个关于扑获power键的程序,如下:(声明:来自coDelphi.com)

“//”后的话是我写的

unit CPower;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
procedure WMPowerBroadcast(var message: TMessage); message WM_POWERBROADCAST;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMPowerBroadcast(var message: TMessage);
{$J+} //我加了这句后,D6下就对了!
const SkipNextPowerMsg:boolean=True; //这句在D6下出错!
//另外,请大家分析一下,上面的这句定义是不是类似C++中的Static 局部变量??
begin
if SkipNextPowerMsg then
begin
SetForegroundWindow(Self.Handle);
if Application.MessageBox('是否关闭系统?','警告',MB_OKCANCEL + MB_DEFBUTTON2)<>IDOK then
begin
message.Result := BROADCAST_QUERY_DENY;
SkipNextPowerMsg:=not SkipNextPowerMsg;
end
else
Close;
end
else
SkipNextPowerMsg:=not SkipNextPowerMsg;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Self.Visible:=False;
end;

end.
kylix2001 2001-07-10
  • 打赏
  • 举报
回复
Thinks INeedCa(缺钙) !
:)
INeedCa 2001-07-10
  • 打赏
  • 举报
回复
To Kylix2001

是的,只有全局变量才可以被初始化。下面是我在Borland新闻组上的帖子和一个老外的回帖。
----------------------
"Rannce" <Rannce@21cn.com> wrote:
> {$J+} compiler state is default in D5, and it's changed to {$J-}
> is the default state in D6?

Correct. The default has changed.

--
Dave Nottage
-----------------------------------------------
kylix2001 2001-07-09
  • 打赏
  • 举报
回复
简化一下问题:
var
Form1: TForm1;

const
i:integer=0;

procedure TForm1.Button1Click(Sender: TObject);
begin
i:= 10 ; //D6下,在这一句出错 。D5下没错。
ShowMessage(IntTostr(i));
end;
改成:
----------------------------------------------------
var
Form1: TForm1;

var
i:integer=0;

procedure TForm1.Button1Click(Sender: TObject);
begin
i := 10; //no problem
ShowMessage(IntTostr(i));
end;
或者:
-----------------------------
var
Form1: TForm1;
{$J+}
const
i:integer=0;

procedure TForm1.Button1Click(Sender: TObject);
begin
i := 10; //no problem
ShowMessage(IntTostr(i));
end;

=====================================
各位大虾继续讨论吧。:)
blucecat 2001-07-09
  • 打赏
  • 举报
回复
 回复人:javis(蓝枫) (2001-7-9 16:47:24) 得0分
就知道有人要问,试试这个,在D5中
procedure TForm1.Button2Click(Sender: TObject);
begin
i:=10;
ShowMessage(IntTostr(i-1));//这个i是var或const根本没关系,因为这句根本没对i赋值,当然正确了,
end;
kylix2001 2001-07-09
  • 打赏
  • 举报
回复
to INeedCa(缺钙):
我刚刚试了一下,如果是全局变量,
var
i :Integer = 0;
没错。是局部变量的话,就出错了。(D6下)

kylix2001 2001-07-09
  • 打赏
  • 举报
回复
To C_Sharp(...):
OK了。 刚看了看帮助。
{$WRITEABLECONST ON}和{$J+}是等价的!!加上就好了。
D6缺省是{$J-},D5可能缺省是{$J+} 。所以才会出现这个问题。呵呵。问题解决!!

kylix2001 2001-07-09
  • 打赏
  • 举报
回复
To C_Sharp(...):
我试试。
To javis(蓝枫):
知道你就说啊?D5下我当然知道能用了,我经常用的。你说说D6下为什么不能用吧?
to blucecat(阿水爱cat):
学习一下吧?(呵呵,开玩笑)。
Apollo47 2001-07-09
  • 打赏
  • 举报
回复
简单一句话:不能对常量赋值。
这是常识,你难道不知道吗?

INeedCa 2001-07-09
  • 打赏
  • 举报
回复
D5认为这是变量第一次初始化。与
var
i :Integer = 0;
是一样的。

D6里可能作了限制,呵呵,我也觉得D5这样处理很不怎么好。唔,我去看看What's New.
加载更多回复(10)

5,388

社区成员

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

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