1

私は 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;

明らかに、フォーム変数の名前は異なりますが、その名前はご存知だと思います。

これを行うと、それらがすべて互いに重なり合うことになります。Top次に配置するプロパティとプロパティに割り当てLeftます。最後に、画像のサイズと一致するように画像のプロパティとプロパティを設定することをお勧めしHeightます。WidthImages[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をデバッグすることができません。

于 2011-09-30T15:43:05.700 に答える
1

それらを画面に表示するにはParent、それぞれのプロパティを設定する必要があります。ただし、イベントがトリガーTImageされた時点ではまだ割り当てられていないため、グローバルフォームポインタ変数を使用することはできません。したがって、代わりにのパラメータとしてOnCreateフォームのポインタを渡します。SelfLoadImages()

別のバグがあります。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 コンポーネントを画面に描画する必要があります。そのためには、グラフィックをロードする親として 1 ピクセルのパネルを作成します。ロード画面のように、画像をデフォルトの TImage プロシージャとして使用できます。

于 2015-08-20T07:58:36.763 に答える
1

TImages をフォームに配置せず、Lo​​adFromFile だけを表示したいのはなぜですか? その方が簡単だと思います。

しかし:あなたは何を達成しようとしていますか?コードから、多くの画像を表示して数えて質問に答えようとしていたことが想像できます...

したがって、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 を作成し (David の回答のように)、LoadImages を呼び出し続けます。

編集:

あなたが学んでいるので、いくつかのアイデア。
オンザフライでビジュアル コントロールを作成するのは、非常に退屈な作業です (もちろん、私の意見では)。

  • オブジェクトの作成、明らかに
  • 親コントロールに割り当てる (フォームはこのパスを必要としません)
  • 視覚的な計画に応じてサイズを調整する
  • 親コントロールの場所に配置する
  • 親コントロールのサイズが変更されたときに再配置および/またはサイズ変更するために、アンカーを設定します (必要な場合)。
  • このすべてが終わったら、やりたいことを実行させます (この場合は、画像を表示します)。

これらのほとんどすべてのステップDavid Heffernan's answerは、そのコードを示しています。しかし、動的レイアウトが本当に必要でない限り、これらすべてを設計時に行う方が実用的です ;-)

于 2011-09-30T21:37:08.743 に答える