コントロールにも同様の問題がありました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()レンダリングする前にテキスト コンテンツを微調整する必要があったため、追加しました。しかし、あなたがしていることにはそのコードは必要ありません。WMPaint()したがって、メッセージを宣言して処理する代わりに、メソッドから を投稿WM_PAINTするだけでよいでしょう。申し訳ありませんが、コードをコンパイルしたり、削除して使用したりする時間がありません...PaintMsgDoExit()DoEnter()Render()WMPaint()PostMessage()