TControl为TPicture?

时间:2011-04-15 03:21:01

标签: delphi

我正在走一个表单的控件列表,当我找到一个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'

3 个答案:

答案 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;

<强>更新  您无法使用TPictureTControl类与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中跳过很多健全检查。