求教!!!!关于改变 常量 的值的大问题!!!(100分)

  • 主题发起人 主题发起人 SuKiDelphi
  • 开始时间 开始时间
S

SuKiDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
如:


procedure ChangeConst(const Constant
var Value
Size: Integer)


begin

Move((@Value)^, (@Constant)^, Size);

end;

//---------------------------------

procedure TForm1.Button1Click(Sender: TObject);

const
TestInteger : Integer = 4367;

var
NewInteger : Integer;

begin
NewInteger := 93534;

ChangeConst(TestInteger, NewInteger, SizeOf(Integer));

ShowMessage('After ChangeStringConst (TestInteger): ' + IntToStr(TestInteger));

end;


但当这样声明时:
const
TestInteger = 4367;

上面的 ChangeConst 就用不了.....

但我必须要这样声明(TestInteger = 4367;)
因为我要用到 Case 语句, 如:
Case ** of
TestInteger : ****
end;

我用 TestInteger 来保存了用户的设置, 而不用变量来保存了用户的设置..


请问有什么方法可改常量的值...
 
常量要具有变量的性质,难。
 
常量如果要改变就不叫常量了,应该用变量了.
 
如果常量都可以随便改。我认为极大的破坏了程序的严谨性。
虽然通过一些特殊的手段可以进行修改。
 
const
TestInteger = 4367;
编译器把TestInteger看作Word做了声明,所以实际上只有Integer类型一半的大小而已。
 
用常量的目的就是不允许改变其值,你为什么即要用常量,又要改变其值呢?直接用变量不行吗?
 
要改的话,还是直接用变量吧,不过我还是欣赏楼主的这种精神,[:)],反其道而行之,说不定会发现新大陆
 
因为我要用到 Case 语句, 如:
Case ** of // 按用户的设定..做不同的功能...
TestInteger : // 这里的值..用户可以改的
end;

不知有什么方法可以知, 在本程序中,全局常量分配的地址..
我想...不行就直接改常量的地址的值就可以了..

还有更方便的方法吗?...
 
Delphi5可以直接改变常量的值

后来的版本需要打开编译器开关..

代码如下:
{$J+}
const
I: Integer = 1;
{$J-}
begin
Inc(I);
ShowMessage(IntToStr(I));
end;
 
暈,改常量值,頭一回聽說。。。如果能改了,兄弟通知我一聲。
 
const
TestInteger:Integer = 4367;

procedure ChangeConst(const OldValue;NewValue:Integer);
var
P:Pointer;
begin
P:=@OldValue;
Integer(P^):=Integer(NewValue);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(TestInteger));
ChangeConst(TestInteger,24);
ShowMessage(IntToStr(TestInteger));
end;
 
再来一个通用的,最好别这样做,否则很危险的。

const
TestInteger:Integer = 4367;

procedure ChangeConst(const OldValue,NewValue;const Size:Integer);
var
P:Pointer;
begin
P:=@OldValue;
Move(NewValue,P^,Size);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
NewValue:Integer;
begin
NewValue:=3333444;
ShowMessage('The old value is :'+IntToStr(TestInteger));
ChangeConst(TestInteger,NewValue,SizeOf(NewValue));
ShowMessage('The New value is :'+IntToStr(TestInteger));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
NewValue:string;
begin
NewValue:='This is a string';
ShowMessage('The old value is :'+IntToStr(TestInteger));
ChangeConst(TestInteger,NewValue,SizeOf(NewValue));
ShowMessage('The New value is :'+string(TestInteger));
end;
 
const MaxValue = 237;这类Constants是True Constants ,是不能被改变值的。就像Boolean类型中True和False一样,是不能被改变的。
 
如果这样定义:
const
TestInteger:Integer = 4367;



Case ** of // 按用户的设定..做不同的功能...
TestInteger : // 这里的值..用户可以改的
end;

就会出现编译时出错....


必须要这样定义:
const
TestInteger = 4367;
 
该结帖了吧!!
 
..
mov adc,eax
push eax
pop edx
..
 
project->option->compiler->Assginable Typed constant(打勾,可以修改常量)
 
嘿嘿!修改改常量的值,头一回听说.记得上课那会老师讲常量的定义就是不可更改的
 
我试试....
 
后退
顶部