关于 TLabel.Caption的指针。(110分)

  • 主题发起人 主题发起人 puzzle
  • 开始时间 开始时间
P

puzzle

Unregistered / Unconfirmed
GUEST, unregistred user!
我打算传送Label.Caption的指针到一个函数,让他可以修改。
写了一段测试代码,可通不过,当家帮忙看看。

var
ps: ^string;
begin
ps:= @(Label1.Caption)
// 出错!如何写!!
ps^:= 'hello!'
end;

如果是
var
ps: ^string;
ss: string;
begin
ps:= @ss
// 正确!!
ps^:= 'hello!'
.... //ss 可以被修改
end;

请问类中的这类字符串如何得到指针呀!
 
TLabel的Caption是属性,不是一般的字符串。

property Caption: TCaption;

对它的读写操作都由VCL完成,只能Read和Write,不能用对付一般字符串的指针。
还是老老实实的用:
var
mstr:String;
...
mstr:=Label1.Caption;

//进行针对mstr的操作

Label1.Caption:=mstr;
...
 
没别的办法?!
 
1 先用字符串取得 caption 值。然后把字符串传过去。最后判断是否修改。

2 把类转换成 TControl,然后把 TControl 传过去。函数里操纵 TControl.Caption,
这适用于所有从 TControl 派生的子类。
 
to mikedeakins
可是我不能确定我这个参数一定是从tControl继承下来的呀!
比如 TStatusBar 就不是。
我原来都打算传递TObject 指针了,可是传进去没用呀!除非我写一个大大的case来判断不同的classname,
还有有别的办法吗?
 
to jqw:
灌水呢?!正如 creation-zy 说的,单纯的string 你能用pchar,可是TLabel.Caption这类的string,是不行的。
下次说话负点儿责任。
 
属性与一般的变量是不一样的,属性不一定会在内存中分配了空间,因为 read 方法
可能只是从对象的其它状态判断计算出一个值,放在寄存器中作为返回值。因此对属性
取指针是没有意义的,所以属性也不能作为 var 实参传递给函数或过程的。
还不太清楚你要这样做的目的。希望改变运行时不确定的控件的 Caption 属性?
 
传递 TObject 指针是个好办法啊,也不用大大的 Case 去判断 ClassName,强制转换就
可以了。

procedure SetCaption(obj: TObject)
begin
(TLabel) obj.Caption = '';
end;
 
因为,Caption其实只是过程调用的地址入口,
真实的变量是位于Private域的的FCaption。
封装的目的是故意不上你得到FCaption的地址。
建议使用其他方法。
 
多人接受答案了。
 
后退
顶部