Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
Arrays 通过阵列将图像加载到TImage_Arrays_Delphi_Delphi 7_Timage - Fatal编程技术网

Arrays 通过阵列将图像加载到TImage

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

我是德尔福的新手,为我的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
结束

这个想法是,一个随机选择的动物的随机数的图像显示给一个孩子,然后计数和输入,如果这有帮助的话。非常感谢您的帮助

编辑

由于这只是一个原型,我已将其全部复制到一个新的应用程序中,这是我没有包含的全部代码:

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