我的控件也有类似的问题TRichEdit
。我发现它不会自己绘制,除非它是可见的(在我的应用程序中并非总是如此)。而且我发现它有时会出现错误,直到用户将焦点放在它上面。 两者都很烦人。
对我有用的是创建我自己的类并为其添加一个Render()
方法。这样,我可以告诉它在我想要的任何时候进行绘制(例如,在调整表单大小时,或者当组件不可见时)。
这是我所做的一个非常精简的版本:
interface
uses
Winapi.Messages, Vcl.ComCtrls;
type
TMyRichEdit = class(TRichEdit)
private
procedure WMPaint(var Message: TMessage); message WM_PAINT;
public
procedure DoExit; override;
procedure DoEnter; override;
procedure Render;
end;
var
PaintMsg: TMessage;
implementation
procedure TMyRichEdit.DoEnter;
begin
inherited;
WMPaint(PaintMsg);
end;
procedure TMyRichEdit.DoExit;
begin
inherited;
WMPaint(PaintMsg);
end;
procedure TMyRichEdit.Render;
begin
WMPaint(PaintMsg);
end;
procedure TMyRichEdit.WMPaint(var Message: TMessage);
begin
// eliminated custom code to tweak the text content...
inherited;
end;
initialization
PaintMsg.Msg := WM_PAINT;
PaintMsg.WParam := 0;
PaintMsg.LParam := 0;
PaintMsg.Result := 0;
end.
我添加WMPaint()
是因为我需要在呈现之前调整文本内容的方式。但是你正在做的事情不需要这些代码。因此,您可以只发布from和方法,而不是声明WMPaint()
和处理消息。抱歉,我没有时间编译代码或尝试消除和使用...WM_PAINT
PaintMsg
DoExit()
DoEnter()
Render()
WMPaint()
PostMessage()