2012-04-21 26 views
0

私は次の画像で見ることができるように、TScrollBoxサーフェイス上で実行時にカスタムのTPanelをいくつか作成しようとしています。 ダイナミックなTPanelの動的なTImage?

enter image description here

は、私は次のコードを使用していますこれを取得するには、それが正常に動作します。今

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] - >パン[0]、IMG [1] - >パン[1]、など)を持つすべてのTPanelにTImageのオブジェクトを置くために問題を抱えています。以下の画像を見て:

enter image description here

同じロジックを使用して、私はTImageのだがwはありません成功/を作成しようとしました。

私はこのコードを使用しており、何が問題なのか理解できません。それは私にとってとてもシンプルに見えますが、どういうわけか、それは期待される効果をもたらしません。

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; 

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

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

SOLVED!

+0

SetBounds' –

+0

@DavidHeffernan 'への単一の呼び出しでこれを行うためにおそらくよりよい申し訳ありませんが、私は' SetBounds(1、1、98、148)を使用して試した; 'と' SetBouds(X * 151 、y * 101,100,150) 'を使用します。効果は同じです。 – Wh1T3h4Ck5

+0

もちろん効果は同じです。私はそれがあなたの質問に答えることを意味しませんでした。ちょうどそれはクリーナーです。 –

答えて

1

ああ、私はDelphiでオートコンプリートを取得するには...私は本当に午前どのようにブラインド...

をそれを見つけ、私はPicture.LoadFromFile()の前でimg[0]を使用しました。そして、明らかに私はコードからそれを削除するのを忘れていました。そして、1時間前から、 '接頭辞'はそこにとどまって、すべての画像を同じimg [0]に読み込みました。親や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; 

があったが、どういうわけか、私は削除した、この質問を投稿し、私のDelphiのコードで問題としてそれを見ていない間、[0]の部分をスペーススペース。私はこのコードをフォーマットされた際に明らかに、私はいくつかの部分を削除し、それが君たちの手を煩わせるためにここ

本当に申し訳ありません:(不可能私の質問に答えて作られた、それは私の悪いだった

+2

私が心配している限り、それには何も問題はありません。時には他の人たちは、たとえどんなに珍しいものであっても、自分たちのミスを自分たちよりも容易に見つけ出すことができます。だから、そういう質問を投稿するのは間違いない。 – Tibor

+0

@Tibor、私はそれを理解していますが、 'Parent:= pan [i-1];'行は常に 'pan [0]'のイメージを表示していて、最悪の事は、私は何かを完全に正しいロジックで修正しようとしている間、壁に向かって頭を蹴っていた。私は明らかな間違いを見るのにとても疲れていたと思う。( – Wh1T3h4Ck5

2

Heightを2回、Leftを設定しているようです。

with pan[i-1] do begin 
    Width := 100; 
    Height := 150; 
    Top := x * 151; 
    Height := y * 101; 
    Parent := ScrollBox1; 
end; 
+1

+1あなたの努力のために。ちょうど間違いを発見した。ここには何も間違っていません。別のタイプミスです。上の写真からわかるように、パネルは適切な場所に配置されています。しかし、感謝m8。 – Wh1T3h4Ck5

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; 
+0

+1アドバイスをいただきありがとうございます、あなたは絶対に正しいです。残念ながら、私は苦労してそれを見つけました。 – Wh1T3h4Ck5

関連する問題