1

我对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

4 回答 4

4

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

Images[l].Parent := TheForm;

显然你的表单变量会有一个不同的名字,但我相信你知道它叫什么。

当你这样做时,你会发现它们最终都重叠在一起。然后分配给TopLeft属性以定位。最后,您可能希望设置图像的HeightWidth属性以匹配图像的尺寸,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。

于 2011-09-30T15:43:05.700 回答
1

为什么你只是不把你的 TImages 放在表单上,​​而只是 LoadFromFile 你想显示的那些?在我看来,这会更容易。

但是:你想要完成什么?从代码中,我可以想象你试图向人们展示一些图像并计算它们并回答问题......

因此,如果您在表单中添加(并定位)11 个空(无图像)TImage,您可以执行以下操作:

// 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,只需在 FormCreate 上创建 12 个 TImages(如大卫的回答)并继续调用 LoadImages。

编辑:

一些想法,因为你正在学习。
即时创建视觉控件是一项非常无聊(当然,在我看来)的任务,包括:

  • 创建对象,显然
  • 将其分配给父控件(表单不需要此通道)
  • 根据您的视觉规划调整大小
  • 将其定位在您想要的父控件的位置
  • 设置它的锚点,以便在调整父控件大小时重新定位和/或调整大小(如果需要)
  • 只有在这一切之后,让它做你想做的事情(在这种情况下,显示图像)。

几乎所有这些步骤大卫赫弗南的回答都显示了它的代码。但是,除非你真的需要动态布局,否则在设计时做所有这些更实用;-)

于 2011-09-30T21:37:08.743 回答
1

您需要设置Parent每个属性TImage才能在屏幕上看到它们。OnCreate但是,您不能使用全局 Form 指针变量,因为在触发事件时它还没有被赋值。所以将表单的Self指针作为参数传入LoadImages()

您还有另一个错误 - 您声明了一个 12 元素TImage数组,但为图像路径声明了一个 7 元素字符串数组。您使用的方式Random(),如果它生成一个高于 6 的值,您将超出String数组的范围。

试试这个:

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;
于 2011-09-30T23:22:40.053 回答
1

TImage 组件必须在屏幕上绘制,因为这样做使一个 1pixel 面板作为父级来加载图形。就像在加载屏幕中一样,因此图像可以用作默认的 TImage 程序。

于 2015-08-20T07:58:36.763 回答