首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否停止并恢复TScrollBox中的更新?

是否停止并恢复TScrollBox中的更新?
EN

Stack Overflow用户
提问于 2017-01-25 21:22:12
回答 2查看 808关注 0票数 1

由于Vcl.Forms.TScrollBox没有BeginUpdate / EndUpdate方法,因此在TScrollBox容器的子级查看器中加载文档时,我使用以下代码来减少闪烁:

代码语言:javascript
复制
procedure MyLockWinControl(const WC: Vcl.Controls.TWinControl; ALock: Boolean);
begin
  if (not Assigned(WC)) or (WC.Handle = 0) then EXIT;
  if ALock then
    WC.Perform(WM_SETREDRAW, 0, 0)
  else
  begin
    WC.Perform(WM_SETREDRAW, 1, 0);
    RedrawWindow(WC.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
  end;
end;

procedure TFormMain.LoadDocFile(const ADocFile: string);
begin
  Screen.Cursor := crHourGlass;
  try
    MyLockWinControl(ScrollBox, True);
    try
      DoLoadDocFile(ADocFile);
    finally
      MyLockWinControl(ScrollBox, False);
    end;
  finally
    Screen.Cursor := crDefault;
  end;
end;

这很好用,除非在极少数情况下,应用程序会在MyLockWinControl(ScrollBox, False);上重现崩溃

因此,我的问题是:MyLockWinControl中是否存在错误,或者是否有更好的方法来停止并恢复TScrollBox中的更新

EN

回答 2

Stack Overflow用户

发布于 2017-02-08 17:06:34

我已经非常可靠地使用了以下代码(使用TScrollBox):

代码语言:javascript
复制
  SendMessage(scrollbox.Handle, WM_SETREDRAW, 0, 0);
  try
    //do some stuff with the scrollbox here
  finally
    SendMessage(scrollbox.Handle, WM_SETREDRAW, 1, 0);
    RedrawWindow(scrollbox.Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
  end;

您的代码(通过MyLockWinControl过程)似乎基本上做了同样的事情-除了使用Perform (直接向控件发送消息)而不是SendMessage (使用Windows消息队列)。您还提到,您使用的组件不是TScrollBox,而是一个派生组件-所以问题很可能也存在于此。

我能建议的唯一一件事就是在你的代码周围放置一个try/except块,并捕获/记录错误。这可能会进一步洞察问题的症结所在……

票数 2
EN

Stack Overflow用户

发布于 2017-02-04 05:59:04

我尝试的第一件事是将您对RedrawWindow的调用替换为对WC.Invalidate的调用。

我不得不假设,除了直接调用RedrawWindow时不能可靠地完成的API重绘之外,TWinControl还在做一些事情。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41852729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档