Загрузка изображений в TImage, через массив - PullRequest
1 голос
/ 30 сентября 2011

Я очень новичок в Delphi, делаю проект для моего уровня А. Когда я запускаю свой код, изображения просто не отображаются, я смотрю везде, и мой учитель не может мне помочь. Может кто-нибудь сказать мне, что мне не хватает?

    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 голосов
/ 30 сентября 2011

Чего не хватает, так это того, что вам нужно сообщить изображению, какой элемент управления является его родителем, чтобы оно могло появиться на экране. Сделайте это так:

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 голос
/ 20 августа 2015

Компонент TImage должен быть нарисован на экране, для этого сделайте 1-пиксельную панель в качестве родительской для загрузки графики. как на экране загрузки, поэтому изображения могут использоваться в качестве процедур TImage по умолчанию.

1 голос
/ 01 октября 2011

Вам необходимо установить свойство Parent каждого TImage, чтобы увидеть их на экране. Однако вы не можете использовать глобальную переменную указателя формы, потому что она еще не была назначена при запуске события OnCreate. Поэтому передайте указатель Self формы в качестве параметра LoadImages().

У вас есть другая ошибка - вы объявили массив из 12 элементов TImage, но объявили массив из 7 элементов String для путей к изображениям. То, как вы используете 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;
1 голос
/ 01 октября 2011

Почему вы просто не помещаете свои изображения в форму, а просто загружаете файлы, которые хотите показать? Покажите мне, что было бы легче.

Но: что вы пытаетесь достичь? Из кода я могу представить, что вы пытались показать несколько изображений, чтобы люди посчитали их и ответили на вопрос ...

Итак, если вы добавите (и разместите) 11 пустых (без изображения) изображений в форме, вы можете сделать:

// 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;

Если вам все еще нужно создавать изображения на лету, просто создайте 12 изображений один раз в FormCreate (как в ответе Дэвида) и продолжайте вызывать LoadImages.

РЕДАКТИРОВАТЬ:

Некоторые идеи, поскольку вы учитесь.
Создание визуальных элементов управления на лету - очень скучная (на мой взгляд, конечно) задача, которая включает в себя:

  • Создание объекта, очевидно
  • Присвоение его родительскому элементу управления (формы не нуждаются в этом проходе)
  • Определение размера в соответствии с вашим визуальным планированием
  • Поместив его на место родительского элемента управления, вы хотите, чтобы он был
  • Установите его якоря, чтобы он мог перемещаться и / или изменять размер при изменении размера родительского элемента управления (при необходимости)
  • Только после всего этого заставляйте его делать то, что вы хотите (в данном случае показывать изображения).

Почти все эти шаги Ответ Дэвида Хеффернана показывает код для него. Но если вам действительно не нужен динамический макет, делать все это во время разработки более практично; -)

...