1

問題

さて、ユーザーが TStringGrid コンポーネントで特定のセル (複数選択ではなく単一選択) を選択したときに呼び出されるダイアログ フォームを設計しました。

このダイアログ フォームは、選択されたセルの 1 つの中心に配置されます。

しかし、それは起こりません:(

考えられる解決策 = 私がしたいこと

で取得したものではなく、セルの画面位置、つまり絶対画面座標を取得したいと思いますCellRect()

私がしていること

セルの中心を計算するには、現在、次のコンポーネントの座標をそのように合計する必要があります。

TRect pos;

pos = table->CellRect(Col,Row);

pos.Left += form->Left + panel->Left + frame->Left + table->Left;
pos.Right += pos->Left;

pos.Top += form->Top + panel->Top + frame->Top + table->Top;
pos.Bottom += pos->Top;

次に、ダイアログを中央に配置します。

dialog->Left = (pos->Left + pos->Right)/2 - dialog->Width/2;
dialog->Top = (pos->Top + pos->Bottom)/2 - dialog->Height/2;

なんらかの理由で、Col と Row はダイアログの正しい位置にオフセットを追加するため、Col と Row の値を大きくすると、ダイアログの位置が正しい位置 (選択されたセルの中心) からかなり離れた位置に設定されます。

 ___screen________________________________________
|                                                 |
|   ___form___________________________________    |
|  |                                          |   |
|  |                                          |   |
|  |   ___panel____________________________   |   |
|  |  |                                    |  |   |
|  |  |   ___frame_______________          |  |   |
|  |  |  |                       |         |  |   |
|  |  |  |                       |         |  |   |
|  |  |  |  ___table_________    |         |  |   |
|  |  |  | |                 |   |         |  |   |
|  |  |  | |       _cell_    |   |         |  |   |
|  |  |  | |      |______|   |   |         |  |   |
|  |  |  | |                 |   |         |  |   |
|  |  |  | |_________________|   |         |  |   |
|  |  |  |_______________________|         |  |   |
|  |  |____________________________________|  |   |
|  |                                          |   |
|  |                                          |   |
|  |__________________________________________|   |
|_________________________________________________|

そして、テーブルまたは選択したセルの画面位置がある場合

上記の合計のコンポーネント座標が少なくなるため、これらのオフセットエラーの実装と検出が非常に簡単になります...

4

1 に答える 1