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

时间:2011-09-30 15:32:48

标签: arrays delphi delphi-7 timage

我是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;

同样的错误正在发生,我担心我太无知,无法遵循我确定非常明确的指示。

4 个答案:

答案 0 :(得分:4)

似乎缺少的是您需要告诉图像哪个控件是其父控件,以便它可以显示在屏幕上。这样做:

Images[l].Parent := TheForm;

显然你的表单变量会有不同的名称,但我相信你知道它的名字。

当你这样做时,你会发现它们最终都是彼此重叠的。然后分配到TopLeft属性以进行定位。最后,您可能希望设置图片的HeightWidth属性以匹配图片的尺寸,Images[l].Picture.HeightImages[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程序。