나는 을 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
를 사용하여 시도했지만 도움이되지 않습니다 여기
는 단위입니다.
깜박임/흔들림없이 Label1을 이동하는 방법을 제안합니다. 스크롤 할 때 Memo1처럼 매끄럽게 작동합니까?
편집 :
내가 양식에 3 scrollboxes이 각각 하나의 헤더 최대 3 개 메모를 포함하는 것이 디자인은 결국 될 것입니다. 그리고 스크롤은 동일한 스크롤 상자의 모든 메모가 동시에 스크롤되어야하므로 스크롤 상자 여야합니다.
편집 2 : 아래
대답 할 즉, 양식에 다음, 외부 scrollboxes을 형성 또는 패널에 라벨을 넣어 작업과 얼마나 내가 볼 수 없다는 것을 의미 좋은 솔루션을 제공하지만 Scrollbox
의 가운데에 놓인 Labels
을 넣고 Form
에 붙여야합니다. 그리고 나서 Scrollbox's
scroll bars
또는 scroll bars
에 직접 Form
으로 이동하십시오. 이것은 원하는 효과를 얻지 만, Labels
이 더 이상 Scrollbox
의 일부가 아니기 때문에 약간의 불편 함을 더합니다.
스크롤 상자에 레이블을 추가 할 필요가 없습니다. 패널을 컨테이너로 사용하고, 패널 위에 레이블을 배치하고 클라이언트 구성 요소로 스크롤 상자를 패널에 배치하십시오. – sddk
메모를 스크롤하면 스크롤을 허용 할 수 있습니다. 스크롤하면 메모를 스크롤 할 수 있습니다 (역주 : TMemo.Scrollbars 속성 사용). 내장 된 스크롤 기능을 사용하면 스크롤 상자가 전혀 필요 없으며 레이블을 옮길 필요가 없습니다. –
@KenWhite, sddk : 양식에 최대 4 개의 스크롤 상자를 넣을 수 있으며 각 스크롤 상자에 헤더가있는 메모를 최대 3 개까지 가질 수 있습니다. 그래서 그들은 그룹화 된 스크롤 박스에 있어야합니다. 폼/패널에 배치하고 관련 그룹 정보를 스크롤하는 데 필요한 디자인을 유지하는 방법을 알지 못합니다. 질문 편집을 참조하십시오. –