コントロールにも同様の問題がありました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
するだけでよいでしょう。申し訳ありませんが、コードをコンパイルしたり、削除して使用したりする時間がありません...PaintMsg
DoExit()
DoEnter()
Render()
WMPaint()
PostMessage()