私はをTScrollBox
に入力してテキストを表示し、先頭にTLabel
をヘッダ情報として使用します。メモはスクロールボックスよりも広い場合があり、もちろんHorizontal scroll bar
を使ってメモのテキストを左右にスクロールすることができます。 私はいつもボックスを表示領域にスクロールするために中央にヘッダーとしてラベルを持っている。私はLabel1.Left:= (Scrollbox1.Width div 2) - (Label1.Width div 2);
を設定することでこれを行うことができますが、それは動作しますが、それはちらつきのようなもので、前後にスクロールするときに揺れます。メモはスムーズに動いて、ラベルは動かない。ラベルをスクロールボックスの中央にスムーズに保つにはどうすればいいですか?
ここ単位です:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TScrollBox=Class(VCL.Forms.TScrollBox)
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
private
FOnScrollHorz: TNotifyEvent;
public
Property OnScrollHorz:TNotifyEvent read FOnScrollHorz Write FonScrollHorz;
End;
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Label1: TLabel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure ScrollBox1Resize(Sender: TObject);
private
procedure MyScrollHorz(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TScrollBox.WMHScroll(var Message: TWMHScroll);
begin
inherited;
if Assigned(FOnScrollHorz) then FOnScrollHorz(Self);
end;
procedure TForm1.MyScrollHorz(Sender: TObject);
begin
Label1.Left:= (Scrollbox1.Width div 2) - (Label1.Width div 2);
end;
procedure TForm1.ScrollBox1Resize(Sender: TObject);
begin
Label1.Left:= (Scrollbox1.Width div 2) - (Label1.Width div 2);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ScrollBox1.OnScrollHorz := MyScrollHorz;
end;
end.
とDFM:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 212
ClientWidth = 458
Color = clBtnFace
DoubleBuffered = True
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object ScrollBox1: TScrollBox
Left = 0
Top = 0
Width = 458
Height = 212
HorzScrollBar.Smooth = True
HorzScrollBar.Tracking = True
Align = alClient
BiDiMode = bdLeftToRight
DoubleBuffered = True
ParentBiDiMode = False
ParentDoubleBuffered = False
TabOrder = 0
OnResize = ScrollBox1Resize
ExplicitHeight = 337
object Label1: TLabel
Left = 192
Top = 30
Width = 69
Height = 13
BiDiMode = bdLeftToRight
Caption = 'Details header'
ParentBiDiMode = False
end
object Memo1: TMemo
Left = 24
Top = 70
Width = 700
Height = 89
Lines.Strings = (
'Details...')
TabOrder = 0
end
end
end
私はDoubleBuffered
を使用してみましたが、助けにはなりません。
スクロールするときにMemo1と同じようにスムーズに、ちらつき/揺らさずにLabel1を移動する方法はありますか?
EDIT:
設計は、最終的に、私は、フォーム上の3又はscrollboxesを有し、それぞれがヘッダと3枚のメモまで含まれていることであろう。同じスクロールボックス内のすべてのメモを同時にスクロールする必要があるため、スクロールはスクロールボックスで行う必要があります。それが意味私は外scrollboxes、それはフォーム上に、フォームまたはパネル上のラベルを置くとでどのように動作するかを見ていない:
EDIT 2:DO以下
の回答良い解決策を提供しますが、Scrollbox
の中心にあるLabels
を置いてForm
に置く必要があります。 Scrollbox's
scroll bars
またはscroll bars
のいずれかに直接移動します(Form
)。これは望ましい効果を得ますが、Labels
にはもうScrollbox
の一部ではないという少しの不便が加わります。
スクロールボックスにラベルを貼る必要はありません。パネルをコンテナとして使用し、ラベルをパネルの上に置き、スクロールボックスをクライアントコンポーネントとしてパネルに配置します。 – sddk
メモをスクロールするには、スクロールバーを使用してスクロールバーを使用してスクロールすることができます(皮肉なことに、TMemo.Scrollbarsプロパティを使用)。その内蔵スクロールを使用する場合、スクロールボックスはまったく必要なく、ラベルを移動する必要はありません。 –
@KenWhite、sddk:フォームには最大4つのスクロールボックス、各スクロールボックスにはヘッダー付きで最大3つのメモを持つことができます。だから彼らはグループ化されたスクロールボックスに入る必要があります。私はフォーム/パネルにそれらを配置し、関連するグループ化された情報をスクロールして必要なデザインを維持する方法を見ていません。質問の編集を参照してください。 –