我是delphi的新手,为我的A级做一个项目。当我运行我的代码时,图像没有显示,我到处寻找,我的老师无法帮助我。谁能告诉我我错过了什么?
const
Animal : array[0..6] of string = ('Bears','Dogs','Cats','Chickens','Horses','Cows','Monkeys');
ImagePaths : array [0..6] of string
= ('img0.JPG', 'img1.JPG', 'img2.JPG', 'img3.JPG', 'img4.JPG', 'img5.JPG',
'img6.JPG');
var i:integer;
Images : array [0..11] of TImage;
procedure LoadImages;
var
k,l:integer;
begin
Randomize;
k:=Random(11);
for l:= 0 to k do
begin
Images[l] := TImage.Create(nil);
Images[l].Picture.LoadFromFile(ImagePaths[i])
end
端;
procedure TForm4.FormCreate(Sender: TObject);
begin
randomize;
i:=random(6);
QuestionLbl.Caption:=Format('How many %s are there?',[Animal[i]]);
LoadImages;
end;
这个想法是,为孩子显示随机选择的相同动物的随机数量的图像然后计数和输入,如果这有帮助的话。非常感谢任何帮助。
修改。
因为这只是一个原型我将它全部复制到一个新的应用程序,这是我没有包含的所有代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,jpeg, ExtCtrls;
type
TForm1 = class(TForm)
QuestionLbl: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
同样的错误正在发生,我担心我太无知,无法遵循我确定非常明确的指示。
答案 0 :(得分:4)
似乎缺少的是您需要告诉图像哪个控件是其父控件,以便它可以显示在屏幕上。这样做:
Images[l].Parent := TheForm;
显然你的表单变量会有不同的名称,但我相信你知道它的名字。
当你这样做时,你会发现它们最终都是彼此重叠的。然后分配到Top
和Left
属性以进行定位。最后,您可能希望设置图片的Height
和Width
属性以匹配图片的尺寸,Images[l].Picture.Height
和Images[l].Picture.Width
。
我无法想象为什么您的代码会产生访问冲突,但这可能与您提出的问题无关。以下代码证明我上面所说的是正确的:
procedure TMyForm.FormCreate(Sender: TObject);
var
Image: TImage;
begin
Image := TImage.Create(Self);
Image.Parent := Self;
Image.Picture.LoadFromFile('C:\desktop\image.jpg');
Image.Top := 0;
Image.Left := 0;
Image.Height := Image.Picture.Height;
Image.Width := Image.Picture.Width;
end;
如果没有完整的代码,我无法调试您的AV。
答案 1 :(得分:1)
为什么你不把TImages放在表格上,而只是LoadFromFile你想要展示的? 在我看来会更容易。
但是:你想要完成什么?从代码中,我可以想象你试图向人们展示一些图像并计算它们并回答问题......
因此,如果您在表单中添加(并定位)11个空(无图像)TImages,您可以执行以下操作:
// Any trouble in copying your FormCreate header, David? ;-)
procedure TMyForm.FormCreate(Sender: TObject);
begin
Images[0] := Image_N1; // First TImage
Images[1] := Image_N2;
Images[2] := Image_N3;
// Do that until the 12 slots are filled
// As a exercise for Danny Robinson( the OP ), you can do that in a for..do using
// the Form.Components array property to automate it instead of
// doing one-at-a-line
end;
procedure ClearImages;
var I: Integer;
begin
for I = Low(Images) to High(Images) do
begin
Images.Picture.Graphic := Nil;
end;
end;
procedure LoadImages;
var
k,l:integer;
begin
ClearImages;
Randomize;
k:=Random(11);
for l:= 0 to k do
begin
Images[l].Picture.LoadFromFile(ImagePaths[i])
end;
end;
如果您仍然需要动态创建TImages,只需创建12 TImages 一次在FormCreate上(如David的回答)并继续调用LoadImages。
编辑:
一些想法,因为你正在学习。
即时创建可视化控件是一项非常无聊(当然,我认为)的任务,包括:
几乎所有这些步骤David Heffernan's answer都显示了它的代码。但是,除非你真的需要动态布局,否则在设计时做所有这些都更实用; - )
答案 2 :(得分:1)
您需要设置每个Parent
的{{1}}属性才能在屏幕上看到它们。但是,您不能使用全局表单指针变量,因为在触发TImage
事件时尚未分配它。因此,请将表单的OnCreate
指针作为Self
的参数传递。
您还有另一个错误 - 您声明了一个12个元素的LoadImages()
数组,但为图像路径声明了一个7个元素的String数组。您使用TImage
的方式,如果它生成的值超过6,您将超出Random()
数组的范围。
请改为尝试:
String
答案 3 :(得分:1)
必须在屏幕上绘制TImage组件, 为此,请将1像素面板作为加载图形的父级。 就像在加载屏幕中一样,图像可以用作默认的TImage程序。