【发布时间】:2017-06-10 16:48:46
【问题描述】:
由于Vcl.Forms.TScrollBox 没有BeginUpdate / EndUpdate 方法,我使用此代码来减少在TScrollBox 容器的子查看器中加载文档时的闪烁:
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 中的更新?
【问题讨论】:
-
很难说没有复制。
-
亲爱的大卫,我的问题不是提到的崩溃,而是
MyLockWinControl中是否存在错误,或者是否有更好的方法来停止和恢复TScrollBox中的更新。 -
这取决于前提条件。例如,如果从线程调用该函数,那么就会出现问题。是吗?我认为在没有给出任何上下文的情况下询问单个功能是否被孤立是徒劳的。无论如何,如果这是您想问的问题,那很好。但我帮不了你。如果有更好的方法来停止闪烁?几乎可以确定。但是,正如所问的,我不能帮助你。祝你好运。
-
如果运行良好,则没有错误。如果存在可重现的崩溃,那么某处存在错误 - 但不一定在这里。如果您说崩溃与它无关,那么问题是什么?如果是,那么让我们看看是什么导致了崩溃。
-
仅供参考,
if WC.Handle = 0永远不会为真。Handlegetter 如果没有分配新的 HWND,则分配一个新的 HWND,如果发生错误则引发异常。要测试 HWND 是否已分配而不分配新的,请改用if WC.HandleAllocated。
标签: delphi flicker delphi-10.1-berlin tscrollbox