Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi t是否将控件设置为图片?_Delphi - Fatal编程技术网

Delphi t是否将控件设置为图片?

Delphi t是否将控件设置为图片?,delphi,Delphi,我正在浏览表单的控件列表,当我找到一个TPicture时,我想更改一个属性(image,但对于一个示例来说,任何东西都可以) 我该如何编写代码?似乎TPciture和TControl不兼容。我可以用什么方法投吗 更新: 当我添加此代码时 for i:= 0 to Pred(designerForm.ControlCount) do if designerForm.Controls[i] is TPicture then MessageDlg('Picture : ' + de

我正在浏览表单的控件列表,当我找到一个TPicture时,我想更改一个属性(image,但对于一个示例来说,任何东西都可以)

我该如何编写代码?似乎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'

你确定当你说
t图片
也许你真的想说吗?无论如何,你必须首先检查当前控件是否属于你想要评估的类
TImage
(在这种情况下),然后你可以用这种方式强制转换
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;
更新 您不能使用
is操作符将
TPicture
类与
t控件进行比较,因为
TPicture
的类型与
t控件
无关

从文件中

如果声明的对象类型是 与类无关-即,如果 类型是不同的,其中一个不是 另一个的祖先是一个汇编 错误结果


由于t图片没有从t控件中降级,
Controls[i]为t图片
无效

在D2007中,图像从着色面持久->持久->对象下降

TPicture = class(TInterfacedPersistent, IStreamPersist)...
由于它不是一个TControl,强制转换到TControl会导致非常糟糕的事情(可能是AV)


正如RRUZ所说,你可能想要TImage取而代之,它的图片属性是TPicture。

这已经有一段时间了,但它在相关搜索中出现了,所以我将尝试一下。。。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实现公开了允许任何对象位于控件属性使用的Tlist中的方法,因此ToObject更安全


这种情况的发生名义上是一个从Delphi1开始的bug,iirc,现在可以作为特性了,因为从IDE调色板中删除的VCL控件通常按照预期加载和保存。要将它作为一种功能可靠地使用,需要仔细的编程,但这里没有描述,我也不会尝试这样做。这些手册只是警告,换言之,“!不要!修改列表,将其视为只读;让IDE通过属性编辑器对其进行管理”,这样IDE使用的、不在VCL中的持久和后代就可以跳过许多健全性检查。

对不起,我不知道如何在注释中格式化代码,所以我更新了这个问题。请你看一下好吗?谢谢当我在浏览控件(或组件)时,我只能检查它是否为图片,而不是图片(尽管我确实想访问图片)?啊!!Timage有一个城市,而不是v.v时间来重新思考+1。。。啊!!Timage有一个城市,而不是v.v时间来重新思考MAWG:我不知道。对我来说似乎是个真正的问题+1将其返回到0。查看您的编辑,我猜-1是因为没有添加代码,使问题变得模糊。A-1似乎是合理的,因为问题的前提是无效的。它错误地暗示遍历控制列表产生了一个TPicture,然后询问如何转换,而实际上控制列表一开始并不包含这样的内容。for循环必须从0到ControlCount-1。您忽略了
Pred()