Delphi t是否将控件设置为图片?
我正在浏览表单的控件列表,当我找到一个TPicture时,我想更改一个属性(image,但对于一个示例来说,任何东西都可以) 我该如何编写代码?似乎TPciture和TControl不兼容。我可以用什么方法投吗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
更新: 当我添加此代码时
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()