高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

フレームって難しい・・・?

 フォームに貼り付けることが出来るTFrameコンポーネント、タブ型エディタの各タブに自動的に配置するようにすると、便利です。が、どうも使い方がちょっと難しいようです。
 フレームにTEditorをのせて、フォーム幅に合わせて動的に変更しようと思ったんですが…。

  Editor.WrapOption.WrapByte:=
      (Editor.ClientWidth -
        (Editor.Leftbar.LeftMargin +
          Editor.Leftbar.RightMargin +
          Editor.Leftbar.Column * Editor.Canvas.TextHeight('1') +
          Editor.Margin.Left
        )
        ) div Editor.Canvas.TextWidth('W');

このコードをどこか(メインフォームのOnResizeでも、フレームのOnResizeでも)に書いて実行すると、フレームを破棄するときにエラーが起こるようです。

 if InDestroy then exit; // InDestroyはデストラクタの最初にTrueにするBoolean変数

コードを実行する前に、デストラクタが呼ばれたあとは実行しないように、Ifをもうけてもダメです。原因は分かりませんが、

  Editor.WrapOption.WrapByte := 999;

 や

  Editor.WrapOption.WrapByte := Editor.ClientWidth;

などとやると大丈夫なので、どうやらEditor.Canvasを呼び出したのが問題だったようです。

14:22追記 どうやらコードを書いただけで、エラーになるようですね(呼び出したかどうかに関係なく)。TEditorのコードに何か抵触する部分があるのか、どっちにしてもコードに問題があるようです。最適化を切ってもダメでした。