스크롤바로 인해 VCL 스타일을 사용할 때보기 흉한 창 업데이트-해결 방법?

레나테 샤프

Delphi 버전 10.3.3 (커뮤니티).

아래는 원하지 않는 동작을 표시하는 양식 단위입니다. 버튼과 스크롤 박스 만 있습니다. 양식의 프로젝트에서 VCL 스타일이 활성화되어 있고 창이 큰 경우 (예 : 최대화 됨) 스크롤 막대로 스크롤하면 창 업데이트가 지연되어 용납 할 수 없을 정도로보기 흉하게 보입니다. 마우스 휠을 사용하면 괜찮습니다. 또한 seBorder가 scrollbox의 StyleElements에서 제거되면 동작이 사라집니다. 사람들이 깜박임에 대해 불평하는 게시물을 보았고이 버그가 이미보고되었다고 생각합니다.

아무도이 문제를 해결하는 방법을 알고 있습니까? 소스 코드를 보면 나무의 숲을 볼 수 없습니다. :).

편집 : Listbox-View에서 스크롤 상자를 3 배 넓게 만들었는데 그 효과가 더 눈에.니다. 다음은 2 개의 스크린 샷입니다. 첫 번째는 테스트 앱에서, 두 번째는 실제 앱에서 가져온 것으로 페인팅이 조금 더 복잡합니다.

unit UStoryTest;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TfrmSTest = class(TForm)
    Scroller: TScrollBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure PaintBoxPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure ScrollerMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  private
    { Private declarations }
    Picturelist, Colorlist: TList;
    ScrollerSize: integer;
    Procedure DisplayStoryBoard;
    procedure DisplayListbox;
  public
    { Public declarations }
  end;

var
  frmSTest: TfrmSTest;

implementation

{$R *.dfm}

procedure TfrmSTest.Button1Click(Sender: TObject);
begin
  if Scroller.Align = alRight then

    DisplayStoryBoard
  else
    DisplayListbox;
end;

procedure TfrmSTest.DisplayStoryBoard;
var
  i, x, dx: integer;
  aP: TPaintbox;
begin
  for i := 0 to Picturelist.Count - 1 do
    TControl(Picturelist[i]).Parent := nil;
  Scroller.Align := alNone;
  Scroller.Height := MulDiv(ScrollerSize,Monitor.PixelsPerInch,96);
  Scroller.VertScrollBar.Visible := false;
  Scroller.HorzScrollBar.Visible := true;
  Scroller.AutoScroll := true;
  Scroller.HorzScrollBar.Tracking := true;
  Scroller.Align := alBottom;
  dx := 10;
  x := dx - Scroller.HorzScrollBar.Position;
  Scroller.DisableAlign;
  for i := 0 to Picturelist.Count - 1 do
  begin
    aP := TPaintbox(Picturelist[i]);
    aP.Parent := Scroller;
    aP.SetBounds(x, dx, aP.Width, aP.Height);
    x := x + aP.Width + dx;
  end;
  Scroller.EnableAlign;
  Scroller.Invalidate;
end;

procedure TfrmSTest.DisplayListbox;
var
  i, x, y, dx: integer;
  aP: TPaintbox;
begin
  for i := 0 to Picturelist.Count - 1 do
    TControl(Picturelist[i]).Parent := nil;
  Scroller.Align := alNone;
  Scroller.Width := MulDiv(3*ScrollerSize,Monitor.PixelsPerInch,96);
  Scroller.HorzScrollBar.Visible := false;
  Scroller.VertScrollBar.Visible := true;
  Scroller.AutoScroll := true;
  Scroller.VertScrollBar.Tracking := true;
  Scroller.Align := alRight;
  dx := 10;
  y := dx - Scroller.VertScrollBar.Position;
  Scroller.DisableAlign;
  x := dx;
  for i := 0 to Picturelist.Count - 1 do
  begin
    aP := TPaintbox(Picturelist[i]);
    aP.Parent := Scroller;
    aP.SetBounds(x, y, aP.Width, aP.Height);
    x := x + aP.Width + dx;
    if x + aP.Width > Scroller.Width then
    begin
      x := dx;
      y := y + aP.Height + dx
    end;
  end;
  Scroller.EnableAlign;
  Scroller.Invalidate;
end;

procedure TfrmSTest.FormCreate(Sender: TObject);
var
  i: integer;
  aP: TPaintbox;
begin
  Picturelist := TList.Create;
  Colorlist := TList.Create;
  ScrollerSize:=200;
  for i := 0 to 120 do
  begin
    aP := TPaintbox.Create(self);
    aP.Height := ScrollerSize - 40;
    aP.Width := aP.Height;
    aP.OnPaint := PaintBoxPaint;
    aP.Tag := i;
    Picturelist.Add(aP);
    Colorlist.Add(Pointer(RGB(random(255), random(255), random(255))));
  end;
end;

procedure TfrmSTest.FormDestroy(Sender: TObject);
begin
  Picturelist.Free;
  Colorlist.Free;
end;

procedure TfrmSTest.FormShow(Sender: TObject);
begin
  DisplayStoryBoard;
end;

procedure TfrmSTest.PaintBoxPaint(Sender: TObject);
var
  aP: TPaintbox;
begin
  if Sender is TPaintbox then
  begin
    aP := TPaintbox(Sender);
    aP.Canvas.Brush.Color := TColor(Colorlist[aP.Tag]);
    aP.Canvas.Pen.Color := clLime;
    aP.Canvas.Rectangle(aP.ClientRect);
    aP.Canvas.Font.Color := clWhite;
    aP.Canvas.Font.Style := [fsBold];
    aP.Canvas.TextOut(3, 3, IntToStr(aP.Tag));
  end;
end;

procedure TfrmSTest.ScrollerMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var SB: TControlScrollbar;
begin
  if (Scroller.Align=alBottom) then
  SB:=Scroller.HorzScrollBar
  else
  SB:=Scroller.VertScrollBar;
  SB.Position:=SB.Position-WheelDelta;
  Handled:=true;
end;

initialization

ReportMemoryLeaksOnShutDown := true;

end.

좀 더 편안하게하기위한 형식은 다음과 같습니다.

object frmSTest: TfrmSTest
  Left = 0
  Top = 0
  Caption = 'frmSTest'
  ClientHeight = 291
  ClientWidth = 505
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object Scroller: TScrollBox
    Left = 0
    Top = 98
    Width = 505
    Height = 193
    Align = alBottom
    DoubleBuffered = False
    ParentDoubleBuffered = False
    TabOrder = 0
    OnMouseWheel = ScrollerMouseWheel
    ExplicitLeft = 2
  end
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
end

레나테 샤프

아무도이 문제가없는 것 같습니다. 완벽하지는 않지만 훨씬 더 나은 해결책을 찾았으므로 완전성을 위해 여기에 내 대답이 있습니다. 모든 공간에 대해 죄송합니다. 시간을내어 생각해 주신 모든 분들께 감사드립니다.

inherited를 호출하고 업데이트하여 WM_VScroll 및 WM_HScroll을 처리하는 TScrollbox 하위 항목을 만듭니다. 무효화하거나 다시 칠하지 마십시오.

스크롤 상자는 양식의 OnCreate, 양식에 대한 상위 세트에서 만들 수 있습니다. 스크롤 옵션을 전환하면 차이가있을 수 있습니다.

interface

type
  TScrolloption = (soVCL, soNew);

TStyleScroller = class(TScrollbox)
  private
  protected
    procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL;
    procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
  public
    Scrolloption: TScrolloption;
    Constructor Create(AOwner: TComponent); override;
  end;

implementation

{ TStyleScroller }

constructor TStyleScroller.Create(AOwner: TComponent);
begin
  inherited;
  Scrolloption := soNew;
end;

procedure TStyleScroller.WMHScroll(var Msg: TWMHScroll);
begin
  inherited;
  if Scrolloption = soNew then
    update;
end;

procedure TStyleScroller.WMVScroll(var Msg: TWMVScroll);
begin
  inherited;
  if Scrolloption = soNew then
    update;
end;

end.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Git을 사용할 때 "오류 : 잘못된 인덱스 – 치명적 : 인덱스 파일 손상"해결 방법

유창한 스크롤을 유지하기 위해 복잡한 콘텐츠로 UITableViewCell을 만드는 방법

업데이트를 저장하려고 할 때 동일한 기본 키로 인해 엔티티 연결 오류

마이크로 서비스-보안 및 사용자 인증을 해결하는 방법은 무엇입니까?

VCL 스타일을 사용할 때 제목 표시 줄에 프로그램 아이콘이 궁금해 보입니다.

사용자가 섹션으로 스크롤 할 때 위치 해시 업데이트

해결 방법 : 사용자 정의보기로 양방향 데이터 바인딩을 구현할 때 " 'android : text'속성에 대한 getter를 찾을 수 없습니다."

창이로드 될 때 innerHTML = 'null'에 대한 해결 방법

React에서 props 또는 state를 통해 스타일을 업데이트 할 때 자식을 다시 렌더링하지 않는 방법은 무엇입니까?

Inno Setup 스크립트에서 VCL 스타일을 사용하기 위해 VclStylesinno.dll을 어디에서 찾을 수 있습니까?

컨텍스트 창을 사용하여 전체 로그 멜-스펙트로 그램을 분할하는 방법 (모든 오디오에 대해 동일한 수의 세그먼트를 보장)?

스크롤 사용 방법, 창 크기를 조정할 때

Pyinstaller가 앱을 빌드 한 후 디자인이보기 흉 해짐

스크롤로 업데이트하기 위해 React Hooks 사용하기

영역에서 업데이트 할 때 0 번째 인덱스에서만 업데이트됩니다. 해결 방법은 무엇입니까?

svelte / store 업데이트 방법으로 객체를 업데이트 할 때 스프레드 연산자를 사용해야합니까?

이미 스타일 템플릿을 사용중인 창에 추가 스타일을 추가하는 방법

필요한 해결 방법 또는 솔루션 : NetBeans 12.0 용 플러그인을 업데이트 할 수 없음

비밀번호를 업데이트 할 때 사용자 로그 아웃을 해결하는 방법은 무엇입니까?

jQuery 및 CSS를 사용하여 창을 아래로 스크롤 할 때 div 숨기기 해제

CSS : 스크롤바를 가져 오는 대신 창을 사용하여 수평으로 크기를 조정하기 위해 배치 된 div를 얻는 방법

iScroll을 사용할 때 팝업 창에서 스크롤 방지

일부 코드를 사용한 다음 루프에서 다시 사용합니다. 보기 흉해 보입니다. 개선 할 방법이 있습니까?

글 머리 기호로 자체 제작 스타일의 이상한 동작을 해결하는 방법

동일한 타임 스탬프에 대해 여러 항목이있을 때 시간을 업데이트하는 방법

Android 사용자 정의 보기: LiveData 및 데이터 바인딩을 통해 사용자 정의 열거형 속성을 업데이트하는 방법

웹사이트 크롤링을 위한 자바스크립트 옵션 선택을 자동화하기 위해 Apify SDK를 사용하는 방법

CSS와 함께 플렉스 레이아웃을 사용할 때 스크롤바 문제를 해결하는 방법은 무엇입니까?

콤보 상자에서 사용 가능한 모든 VCL 스타일을 나열하고 ComboBoxChange 이벤트에서 C++ Builder에서 해당 스타일을 적용하려면 어떻게 해야 합니까?

TOP 리스트

  1. 1

    셀레늄의 모델 대화 상자에서 텍스트를 추출하는 방법은 무엇입니까?

  2. 2

    Webpack 4가 분할 모듈로 취급하는 원시 JSON 파일을 배포하는 방법은 무엇입니까?

  3. 3

    Windows에서 Apache Kafka 오류-주 클래스 QuorumPeerMain을 찾거나로드 할 수 없습니다.

  4. 4

    Zookeeper Cluster를 시작합니다. 오류 : 주 클래스 org.apache.zookeeper.server.quorum.QuorumPeerMain을 찾거나로드 할 수 없습니다.

  5. 5

    어떻게 reslove: InvalidArgumentError: 그래프 실행 오류가 발생합니까?

  6. 6

    PyCharm에서 프로젝트를 제거하는 방법은 무엇입니까?

  7. 7

    Python : 특정 범위를 초과하면 플롯의 선 색상을 변경할 수 있습니까?

  8. 8

    동적 링크 작동 방식, 사용법 및 dylib를 만드는 방법과 이유

  9. 9

    화살표와 테두리가있는 CSS 전용 툴팁

  10. 10

    웹 사이트 로딩 속도를 높이는 방법을 알려주세요.

  11. 11

    응답에 대한 JMESPath 필터링

  12. 12

    D3 JS에서 하프 도넛 원형 차트 값 표시

  13. 13

    Joomla 3의 단일 기사에서 소셜 미디어 아이콘을 게시 취소하는 방법은 무엇입니까?

  14. 14

    scipy.misc 이미지 함수의 AttributeError, ImportError (예 : imread, imresize, imsave, imshow 등)

  15. 15

    Xcode 6 Beta 4 Broke stringWithContentsOfURL : encoding : error :

  16. 16

    Java에서 HSSFCell의 최대 길이 늘리기

  17. 17

    Mac에서 python import nltk 오류

  18. 18

    오류 CS0019 : '<'연산자를 'string'및 'int'유형의 피연산자에 적용 할 수 없습니다.

  19. 19

    Libavformat은 RTP 스트림을 너무 빠르게 기록합니다(너무 높은 FPS).

  20. 20

    Linux 시스템에 대해 OPEN_MAX는 어디에 정의되어 있습니까?

  21. 21

    스프링 부트에서 application.properties 값을 동적으로 변경

뜨겁다태그

보관