Delphi中如何通过一个变量引用另一个变量?
问题描述
我想在逻辑语句里把一个变量赋值给另一个变量,之后通过后者修改原变量,这样能把我的代码缩短75%以上,但我不知道怎么实现。
我想要的效果示例:
procedure TfrmExample.Proc(Sender: TObject); var iVar1, iVar2: Integer; begin iVar1 := 0; iVar2 := 0; if TRUE then begin iVar2 := iVar1; end; // 希望通过修改iVar2来改变iVar1的值 Inc(iVar2); end;
我是不是需要用某种特殊的数据类型来定义iVar1?
下面是我尝试但失败的代码:
procedure TfrmExample.ProcWrong(Sender: TObject); var iVar1: Integer; TVar2: TObject; begin iVar1 := 0; if TRUE then begin // 这里提示类型不兼容 TVar2 := iVar1; end; // TObject不能用Inc函数 Inc(TVar2); end;
解决方法
在Pascal(Delphi)里,普通的值类型赋值只会复制数值,修改新变量不会影响原变量。要实现“通过一个变量修改另一个变量”的需求,你需要用指针或者引用关联方式。
方法1:使用指针(Pointer)
Integer类型对应的指针是PInteger,代码示例:
procedure TfrmExample.Proc(Sender: TObject); var iVar1: Integer; pVar2: PInteger; // 定义Integer类型的指针变量 begin iVar1 := 0; pVar2 := nil; // 初始化指针为空 if TRUE then begin pVar2 := @iVar1; // 让指针指向iVar1的内存地址 end; // 先判断指针是否有效,再修改原变量 if Assigned(pVar2) then begin Inc(pVar2^); // ^符号表示取指针指向的变量,执行后iVar1的值会变为1 end; end;
方法2:使用absolute关键字(共享内存)
如果你的Delphi版本支持,可以用absolute让两个变量共享同一块内存空间:
procedure TfrmExample.Proc(Sender: TObject); var iVar1: Integer; iVar2: Integer absolute iVar1; // iVar2和iVar1共用内存 begin iVar1 := 0; if TRUE then begin // 无需额外赋值,iVar2已经和iVar1关联 end; Inc(iVar2); // 修改iVar2的同时,iVar1的值也会变成1 end;
为什么之前的尝试失败?
你用TObject接收Integer变量完全错误:TObject是类类型,Integer是值类型,两者类型不兼容,无法直接赋值;另外Inc函数仅支持数值类型,不能作用于对象,所以会报错。
内容的提问来源于stack exchange,提问作者99Emeralds
相关产品推荐
相关产品推荐

