0

OK、次の画像に示すように、実行時にTScrollBoxサーフェスにカスタム数のTPanelを作成しようとしています。

ここに画像の説明を入力してください

これを取得するために、私は次のコードを使用していますが、それは正常に機能します。

var
  pan: array of TPanel;
  maxp, i, x, y: Integer;

...

maxp := 10;
SetLength(pan, maxp);

for i := 1 to maxp do begin
  // x is correct value; doesn't cause problem
  // y is correct value; doesn't cause problem
  pan[i-1] := TPanel.Create(form1);
  with pan[i-1] do begin
    Width := 100;
    Height := 150;
    Top := x * 151;
    Left := y * 101;
    Parent := ScrollBox1;
    end;
  end;

現在、同じインデックス(img [0]-> pan [0]、img [1]-> pan [1]など)を持つすべてのTPanelにTImageオブジェクトを配置するのに問題があります。次の画像を見てください。

ここに画像の説明を入力してください

同じロジックを使用して、TImageを作成しようとしましたが、成功しませんでした。

私はこのコードを使用していますが、何が問題なのか理解できません。それは私にはとても単純に見えますが、どういうわけかそれは期待される効果を提供しません。

var
  pan: array of TPanel;
  img: array of TImage;
  maxp, i, x, y: Integer;

...

maxp := 10;
SetLength(pan, maxp);
SetLength(img, maxp);

for i := 1 to maxp do begin
  // x is correct value; doesn't cause problem
  // y is correct value; doesn't cause problem
  pan[i-1] := TPanel.Create(form1);
  with pan[i-1] do begin
    Width := 100;
    Height := 150;
    Top := x * 151;
    Left := y * 101;
    Parent := ScrollBox1;
    end;
  img[i-1] := TImage.Create(form1);
  with img[i-1] do begin
    Width := 98;
    Left := 1;
    Height := 148;
    Top := 1;
    // in original code next line had img[0]. which caused problem
    Picture.LoadFromFile('some_image_file');
    Parent := pan[i-1];
    end;
  end;

どういうわけか、すべてのTImageオブジェクトを最初のTPanel(pan [0])の同じ場所に配置します。それは言うので私には混乱しますParent := pan[i-1];が、何らかの理由でそれは常にTImageをpan[0]に入れます。ブレークポイントを使用して、すべてのforループサイクル(最後にApplication.ProcessMessagesを追加)の後に何が起こっているかを確認しようとしました。実際には10種類の画像が作成されますが、pan[0]に配置されます。もちろん、最後には、pan[0]にロードされた最後の画像だけが表示されます。

私の質問は、(同じ配列インデックスを持つ)動的TPanelごとに1つの動的TImageを作成する方法ですか?

解決しました!

4

3 に答える 3

5

withそしてアドバイスの言葉-ブロックを取り除きます。それらは最初は無実で単純に見えるかもしれませんが、長期的には、トラブルシューティングが難しいずさんなコードを書くためだけに役立ちます。代わりに明示的な変数参照を使用していれば、この問題はそもそも発生しなかったでしょう。

var
  Panels: array of TPanel;
  Panel: TPanel;
  Images: array of TImage;
  Image: TImage;
  maxp, i, x, y: Integer;

...

maxp := 10;
SetLength(Panels, maxp);
SetLength(Images, maxp);

for i := 1 to maxp do begin
  Panel := TPanel.Create(form1);
  Panels[i-1] := Panel;
  Panel.Parent := ScrollBox1;
  Panel.SetBounds(...);
  Image := TImage.Create(form1);
  Images[i-1] := Image;
  Image.Parent := Panel;
  Image.SetBounds(...);
  Image.Picture.LoadFromFile('some_image_file');
end;
于 2012-04-22T04:38:30.157 に答える
2

設定はHeight2回で、設定しないLeftので、そうです。

with pan[i-1] do begin
  Width := 100;
  Height := 150;
  Top := x * 151;
  Height := y * 101;
  Parent := ScrollBox1;
end;
于 2012-04-21T22:17:25.920 に答える
1

ああ、私はそれを見つけました...私は本当に盲目です...

デルファイでオートコンプリートを取得するためにimg[0]、の前で使用しましたPicture.LoadFromFile()。それから、明らかに私はそれをコードから削除するのを忘れました、そして1時間前からその「プレフィックス」はそこにとどまり、すべての画像を同じimg[0]にロードしました。ParentまたはPos/Sizeプロパティに何か問題があると確信しており、これについてはあまり気にしないことに焦点を当ててきました。

私は実際に持っていた

  with img[i-1] do begin
    Width := 98;
    Left := 1;
    Height := 148;
    Top := 1;
    img[0].Picture.LoadFromFile('some_image_file');
    Parent := pan[i-1];
    end;

しかし、どういうわけか、この質問を投稿しているときにそのimg [0]の部分を削除しましたが、Delphiコードでは問題とは見なされていません。明らかに、このコードをフォーマットしているときに、いくつかの部分を削除したため、ここでの質問に答えることができませんでした:(

ご迷惑をおかけして本当に申し訳ありません、それは私の悪いことでした。

于 2012-04-21T22:20:39.553 に答える