Windows 销毁组件()并重新绘制c++;建设者

Windows 销毁组件()并重新绘制c++;建设者,windows,c++builder,Windows,C++builder,在c++Builder中,我有一个带有TPageControl的表单,其中有几个带有ScrollBox alClient的TTabSheet。在这些滚动框中,每个滚动框都动态绘制了几个TStringGrid,并根据OpenDialog读取的二进制文件填充它们的信息 对于动态创建组件,我编写了函数 void __fastcall TForm1::DynamicDraw() ScrollBox->DestroyComponents(); DynamicDraw(); v

在c++Builder中,我有一个带有TPageControl的表单,其中有几个带有ScrollBox alClient的TTabSheet。在这些滚动框中,每个滚动框都动态绘制了几个TStringGrid,并根据OpenDialog读取的二进制文件填充它们的信息

对于动态创建组件,我编写了函数

    void __fastcall TForm1::DynamicDraw()

    ScrollBox->DestroyComponents();
    DynamicDraw();

void uu fastcall TForm1::DynamicDraw()
它获取文件并在所有TTabSheet(带依赖项)上绘制

出现此问题的原因是用户可以删除/添加TStringGrid,从而在所有其他TTabSheet中生成依赖项问题

为了解决这个问题,我决定调用这个函数

    void __fastcall TForm1::DynamicDraw()

    ScrollBox->DestroyComponents();
    DynamicDraw();

滚动框->销毁组件();
DynamicDraw();

对于每个TTabsheet。但是,即使激活了双缓冲,也会在当前选项卡中产生“闪烁”


有什么想法或信息可以避免这个问题吗?

发送ScrollBox
WM_SETREDRAW
消息,在进行更新时临时禁用屏幕绘制:

SendMessage(ScrollBox->Handle, WM_SETREDRAW, FALSE, 0);
try {
    ScrollBox->DestroyComponents();
    DynamicDraw();
}
__finally {
    SendMessage(ScrollBox->Handle, WM_SETREDRAW, TRUE, 0);
    ScrollBox->Update();
}

它起作用了!但是,对于TstringGrid创建的DynamicCall,我必须迭代ScrollBox->Component[i]并为ScollBox中的每个新网格调用Invalidate()。对不起,我的意思是
Repaint()
Update()
仅处理挂起的绘制消息,但
Repaint()
调用
Invalidate()
Update()
强制重新绘制。