我正在走一个表单的控件列表,当我找到一个TPicture时,我想要更改一个属性(图像,但任何事情都可以作为例子)。
我该如何编码呢?似乎TPciture和TControl不兼容。我可以以某种方式投射吗?
更新: 当我添加此代码时
for i:= 0 to Pred(designerForm.ControlCount) do
if designerForm.Controls[i] is TPicture then
MessageDlg('Picture : ' + designerForm.Controls[i].name,
mtInformation, [mbOK], 0);
其中designerForm是TForm,我在D7中从零到两个错误
[Error] PictureInspEditor.pas(121): Incompatible types: 'TPicture' and 'TControl'
[Fatal Error] E_logger.dpr(22): Could not compile used unit 'PictureInspEditor.pas'
答案 0 :(得分:5)
你确定当你说TPicture
时你真的想说TImage
吗?无论如何,首先你必须检查当前控件是否属于你要评估的类TImage
1}}(在这种情况下)然后您可以以这种方式投射TImage(Controls[i])
检查此示例是否有 TImage
var
i : Integer;
begin
for i := 0 to ControlCount-1 do
if Controls[i] is TImage then
begin
// do your stuff here
TImage(Controls[i]).Picture:=aValue;
end;
end;
<强>更新强>
您无法使用TPicture
将TControl
类与is operator
进行比较,因为TPicture
的类型与TControl
无关。
来自Embarcadero文档
是运算符 .....如果声明的对象类型是 与班级无关 - 也就是说,如果 类型是不同的,一个不是 另一个编辑的祖先 错误结果
答案 1 :(得分:2)
由于TPicture不是来自TControl,Controls[i] is TPicture
无效。
在D2007中TPicture来自TInterfacedPersistent-&gt; TPersistent-&gt; TObject
TPicture = class(TInterfacedPersistent, IStreamPersist)...
因为它不是TControl,所以施放到TControl会导致非常糟糕的事情(可能是AV)
正如RRUZ所说,你可能想要TImage,它有一个TPicture作为它的Picture属性。
答案 2 :(得分:1)
这已经有一段时间了,但是它出现在相关的搜索中,所以我会对它进行抨击...... Ymmv: - )。
我认为正确的比较是:
for i:= 0 to Pred(designerForm.ControlCount) do
if designerForm.Controls[i] is TPicture then
MessageDlg('Picture : ' + designerForm.Controls[i].name,
mtInformation, [mbOK], 0);
if TObject(designerForm.Controls[i]) is TPicture then
所以这两个对象从编译器的角度共享了祖先。虽然TPersistent也可以用作强制转换,但VCL实现公开了允许任何对象在Controls属性使用的Tlist中的方法,因此TObject更安全。
这可能发生在名义上是一个从Delphi 1开始的错误,即iirc,由于从IDE调色板中删除的VCL控件通常按预期加载和保存,因此现在已成为功能。将它作为一项功能可靠地使用需要仔细编程,但是,我也不会尝试这样做。这些手册仅警告,“!不要!修改列表,将其视为只读;让IDE通过属性编辑器管理它”,因此IDE使用的TPersistent和后代不在VCL中跳过很多健全检查。