OSによる画面の再描画が終わったことを知るには

解決


さとう  2025-05-02 13:16:31  No: 151984  IP: [192.*.*.*]

Delphi7 win10 で
PageControl にTabSheet1 Tabsheet2 があります。
Tabsheet2上のStringGridに
StringGrid.Canvas.MoveTo(x1,y1);
StringGrid.Canvas.LineTo(x2,y2);
で線を引きます。PageControlのActivePageをTabSheet1に切り替え、再びTabSheet2に
戻すと先ほど描画した線が消えます。Canvasへの描画はOSが再描画をしないのは仕様とのことです。
そこで、TabSheet2に切り替えた後、自前で再度描画したいのですが、どのタイミングで描画をすれば
いいのかわかりません。OSでの画面の再描画が終わったことを知る方法はありませんでしょうか。

編集    削除
igy  2025-05-02 14:04:00  No: 151985  IP: [192.*.*.*]

StringGridのDrawCellイベントに描画するコードを書くのでは、ダメですか?

編集    削除
さとう  2025-05-02 14:43:01  No: 151986  IP: [192.*.*.*]

igyさん
ありがとうございます。
確かに線の描画は行われるのですが、セルの描画のたびに線を引きますので、StringGridのすべてのCellの描画が終わった後に一度だけ線を引きたいのですが、すべてのCellの描画が終わったことを知る方法はありませんでしょうか。

編集    削除
igy  2025-05-02 15:23:31  No: 151987  IP: [192.*.*.*]

では、TPageControlのOnChangeイベントでは、ダメですか?

編集    削除
AAAAA  2025-05-02 17:58:26  No: 151988  IP: [192.*.*.*]

  TStringGrid = class(Vcl.Grids.TStringGrid)  //Delphi 7 なら違う
  protected
    procedure Paint; override;
  end;

procedure TStringGrid.Paint;
begin
    inherited;
    Canvas.Pen.Color := clBlack;
    Canvas.MoveTo(0,0);
    Canvas.LineTo(100,100);
end;

Gird描画あとに描画なら
かな

編集    削除
さとう  2025-05-26 09:15:40  No: 152008  IP: [192.*.*.*]

遅くなりました。
AAAAAさん
Delphi 7 での書き方がわからないので、今回は断念します。
igyさん
TabSheet上での描画は、TPageControlのOnChangeイベントの後で起こるようです。
ありがとうございました。

編集    削除
HFUKUSHI  2025-05-26 18:41:52  No: 152011  IP: [192.*.*.*]

Delphi 7だと
  TStringGrid = class(Vcl.Grids.TStringGrid)
の行を
  TStringGrid = class(Grids.TStringGrid)
にしたらどうでしょう?

編集    削除