Arrays 通过阵列将图像加载到TImage
我是德尔福的新手,为我的a级水平做一个项目。当我运行代码时,图像根本不显示,我到处都找过,我的老师也帮不了我。谁能告诉我我错过了什么Arrays 通过阵列将图像加载到TImage,arrays,delphi,delphi-7,timage,Arrays,Delphi,Delphi 7,Timage,我是德尔福的新手,为我的a级水平做一个项目。当我运行代码时,图像根本不显示,我到处都找过,我的老师也帮不了我。谁能告诉我我错过了什么 const Animal : array[0..6] of string = ('Bears','Dogs','Cats','Chickens','Horses','Cows','Monkeys'); ImagePaths : array [0..6] of string = ('im
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
结束
这个想法是,一个随机选择的动物的随机数的图像显示给一个孩子,然后计数和输入,如果这有帮助的话。非常感谢您的帮助
编辑
由于这只是一个原型,我已将其全部复制到一个新的应用程序中,这是我没有包含的全部代码:
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;
同样的错误也在发生,我恐怕太无知了,无法按照我确信非常清楚的说明进行操作。似乎缺少的是,您需要告诉图像哪个控件是它的父控件,以便它可以显示在屏幕上。这样做:
Images[l].Parent := TheForm;
显然,表单变量将有不同的名称,但我相信您知道它的名称
当你这样做的时候,你会发现它们最终都是在彼此之上的。然后将顶部
和左侧
属性分配到位置。最后,您可能需要设置图像的高度
和宽度
属性,以匹配图像的尺寸,图像[l].Picture.Height
和图像[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。缺少的是,您需要告诉图像哪个控件是其父控件,以便它可以显示在屏幕上。这样做:
Images[l].Parent := TheForm;
显然,表单变量将有不同的名称,但我相信您知道它的名称
当你这样做的时候,你会发现它们最终都是在彼此之上的。然后将顶部
和左侧
属性分配到位置。最后,您可能需要设置图像的高度
和宽度
属性,以匹配图像的尺寸,图像[l].Picture.Height
和图像[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。为什么不在表单上输入时间,只从文件中加载要显示的时间? 在我看来那会更容易些 但是:你想完成什么?从代码中,我可以想象你试图向人们展示一些图像,数一数,然后回答问题 因此,如果在表单中添加(并定位)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
编辑:
一些想法,因为你正在学习。动态创建视觉控件是一项非常枯燥的任务(当然,在我看来),包括:
- 显然是在创建对象
- 将其分配给父控件(窗体不需要此过程)
- 根据您的视觉规划调整大小
- 将其放置在您想要的父控件的位置
- 设置其定位,以便在调整父控件的大小时(如果需要)重新定位和/或调整其大小
- 只有在完成所有这些之后,才能让它执行您希望它执行的操作(在本例中,显示图像)
几乎所有这些步骤都显示了它的代码。但是,除非您真的需要动态布局,否则在设计时执行所有这些操作更为实际;-) 为什么不在表单上写上时间,只从文件中加载要显示的时间? 在我看来那会更容易些 但是:你想完成什么?从代码中,我可以想象你试图向人们展示一些图像,数一数,然后回答问题 因此,如果在表单中添加(并定位)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
编辑:
一些想法,因为你正在学习。动态创建视觉控件是一项非常枯燥的任务(当然,在我看来),包括:
- 显然是在创建对象
- 将其分配给父控件(窗体不需要此过程)
- 根据您的视觉规划调整大小
- 将其放置在您想要的父控件的位置
- 设置其定位,以便在调整父控件的大小时(如果需要)重新定位和/或调整其大小
- 只有在完成所有这些之后,才能让它执行您希望它执行的操作(在本例中,显示图像)
几乎所有这些步骤都显示了它的代码。但是,除非您真的需要动态布局,否则在设计时执行所有这些操作更为实际;-) 您需要设置每个
TImage
的Parent
属性,以便在屏幕上看到它们。但是,您不能使用全局表单指针变量,因为在触发OnCreate
事件时尚未分配该变量。因此,将表单的Self
指针作为LoadImages()
的参数传递
您还有一个错误-您声明了一个12元素TImage
数组,但为图像路径声明了一个7元素字符串数组。按照您使用Random()
的方式,如果它生成的值大于6,您将超出字符串
数组的范围
请尝试以下方法:
const
...
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..6] of TImage;
procedure LoadImages(AParent: TWinControl);
var
i, k: integer;
begin
Randomize;
k := Random(7);
for i := 0 to k do
begin
Images[i] := TImage.Create(nil);
Images[I].Parent := AParent;
// set other properties, like Left/Top...
Images[l].Picture.LoadFromFile(ImagePaths[i]);
end;
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
...
LoadImages(Self);
end;
您需要设置每个
TImage
的Parent
属性,以便在屏幕上看到它们。但是,您不能使用全局表单指针变量,因为当OnCr