4

TListBox コントロールが lbOwnerDrawVariable に設定された Delphi 6 アプリがあります。実行時に、リスト ボックスに 1 つの文字列を追加します。OnMeasureItem() と OnDrawItem() のイベント ハンドラーがあり、各イベント ハンドラーのコードの最初の行にブレークポイントを設定します。ただし、どちらも呼び出されることはありません。一度もありません。リスト ボックスで明示的なRefreshまたはRepaint呼び出しを行っても、そうではありません。

これは本当に基本的なことなので、これらのイベント ハンドラーの呼び出しを阻害し、その後所有者の描画コードを混乱させる可能性があるのは、何が間違っているのでしょうか? 単一の文字列がリスト ボックスに正しく表示されます。OnClick() イベント ハンドラーを投入して、それが機能するかどうかを確認しました。

4

5 に答える 5

4

OnMeasureItemおよびイベントは、 Windows からのおよびメッセージOnDrawItemに応答して (間接的に) トリガーされます。そのメッセージ、または VCL の内部およびメッセージを除外するメッセージ ハンドラーがアプリにないことを確認してください。WM_MEASUREITEMWM_DRAWITEMCN_MEASUREITEMCN_DRAWITEM

于 2011-12-13T07:20:09.950 に答える
2

問題は、私が使用していた TListBox の Columns プロパティの値が 0 でないことが原因であることがわかりました。オーナー描画に変換する前に列の使用を試していたので、TListBox.Columns プロパティにゼロ以外の値を残していました。明らかに、0 以外の Columns プロパティ値は、オーナー描画関連のイベント トリガーのトリガーを禁止します。そのプロパティをゼロに戻すと、OnMeasureItem() と OnDrawItem() が起動し始めました。

于 2011-12-13T11:19:12.377 に答える
1

ここでうまくいかないことはほとんどありません。これを試すためにテストアプリを設定すると、期待どおりに機能し、イベントハンドラーが呼び出されます。

報告する動作の原因として最も可能性が高いのは、イベントハンドラーが割り当てられる前にアイテムが追加された場合です。これは通常、アイテムが設計時に.dfmファイルに追加された場合に発生します。実行時にアイテムを追加するとします。おそらく、イベントハンドラーが割り当てられる前に、それらを追加するのが早すぎます。ボタンのクリックなど、イベントに応じてアイテムを追加するとどうなりますか。その時点でイベントハンドラーが割り当てられることを確認できるので、それを試してみてください。

それでも問題が解決しない場合は、VCLコードに干渉しているコードがアプリに含まれていることは明らかです。

于 2011-12-13T08:06:01.847 に答える