3

私は1つの小さな問題に遭遇しました。いくつかのコントロールを動的に生成し、それらをTScrollboxコンポーネントに配置しています。しかし、スクロールボックスが表示されている場合、ユーザーは作成および配置されている各コントロールを明確に確認できることに気付きました。そのため、多くの作業が行われているように見え、遅いです。

スクロールボックスを非表示にして、その上にすべてのコントロールを生成しました。これにより、時間が大幅に短縮され、ちらつきなどが発生しませんでした。しかし、ここに問題があります。スクロールボックスを再度表示すると、実際にフォームのサイズを変更するまで、そのスクロールバーは表示されません。(スクロールボックスの配置はalClient

これを修正する方法について何かアイデアはありますか?

塗り直しを試みましたが、うまくいきませんでした。更新も機能しませんでした。

ありがとうございました

編集:

TScrollBox(Form1.FindComponent('termai')).Visible:= false;
for I := 0 to mazgas.GrafasPagalVarda(sActiveGrafas).Termai.Count - 1 do
begin
    fNaujasTermas(i,oHook);
end;
TScrollBox(Form1.FindComponent('termai')).Visible := true;

上記のコードは、スクロールボックスを非表示および表示する方法を示しています。
fNaujasTermasいくつかのトラックバー、画像、編集を含むパネルを生成します。

ステップバイステップの説明があるかどうかはわかりません。多くのコントロールを備えたパネルを生成し、ScrollBoxを親として設定する手順を作成するだけです。何かを生成する前にスクロールボックスを非表示にし、すべてが完了したら再表示します。
ところで、パネルは整列してalTopいます。したがって、新しいパネルが作成されてスクロールボックスに配置されるたびに、他のすべてのパネルが下に移動する間、そのパネルは上部に表示されます。

これが私がスクロールボックス自体を作成した方法です

pTermai := TScrollBox.Create(Self);
pTermai.Parent := pLeft;
pTermai.Align := alClient;
pTermai.Name := 'termai';
pTermai.BorderStyle := bsNone;
pTermai.VertScrollBar.Increment := 40;

EDIT2:私はこれを再現する方法を知っていると思います。
スクロールボックスに新しいパネルを追加するとき、そのスクロールボックスにすでにあるすべてのコントロールの高さの合計にはカウントされないようです。

例を挙げると。1つのパネルの高さが200pxだとします。
ScrollBoxの高さは300pxです。

したがって、合計で400pxの高さになる2つのパネルを作成した後、2番目のパネルの半分が表示されていなくても、scrollboxにはスクロールバーが表示されません。パネルをもう1つ追加すると、合計600ピクセルになります。スクロールボックスには、3つではなく、2つのパネルごとにのみスクロールするように見えるスクロールバーが表示されます。このようなウィンドウをスクロールしようとすると、値が再計算され、すべてが適切に表示されます。

したがって、主な問題は、スクロールボックスにスクロールバーを「時間内に」表示して、パネルが半分カットされないようにする方法です。

4

2 に答える 2

5

Realign()から継承するメソッドを呼び出すことにより、スクロールボックスにスクロールバーのプロパティを再計算するように要求できますTWinControl。ちらつきを最小限に抑えるには、次のように、まだ見えない状態でこれを行う必要があります。

ScrollBox.Visible := False;
try
  // create your new panel ...
finally
  ScrollBox.Realign;
  ScrollBox.Visible := True;
end;
于 2010-04-20T06:43:30.467 に答える
1

コメントで言ったように、私は問題を再現することができません。問題を再現する方法を段階的に説明すると役立ちます。

しかし、フォームのサイズを変更すると問題が解決すると言う場合は、単にフォームのサイズを変更してみませんか?たぶん、を使用して0ピクセルのサイズ変更を試みることができますSetWindowPos。また、試してみてくださいScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);

于 2010-04-18T17:00:25.253 に答える