ホスト アプリケーション画面の中央にフォームを配置するためのユーティリティ関数が dll に含まれています。RAD Studio XE2 を使用しています。ホスト アプリケーションが非 VCL であり、TForm のフォーム配置パラメータが正しく機能しないため、手動で行う必要があります。以下のコードは機能します。どちらの関数も静的に宣言されており、以前にアプリケーション ハンドル プロパティをホスト アプリに設定しました。
void MyClass::GetAppCenter(POINT * pos) {
RECT Rect;
GetWindowRect(Application->Handle, &Rect);
pos->x = (Rect.left + Rect.right) / 2;
pos->y = (Rect.top + Rect.bottom) / 2;
}
void MyClass::PlaceForm(TForm * f) {
POINT pos;
GetAppCenter(&pos);
for (int i = 0; i < Screen->MonitorCount; i++) {
TRect r = Screen->Monitors[i]->WorkareaRect;
if (r.Contains(pos)) {
f->Left = (r.Left + r.Right) / 2 - f->Width / 2;
f->Top = (r.Top + r.Bottom) / 2 - f->Height / 2;
return;
}
}
}
私の最初の GetAppCenter コードは代わりに Rect * を使用し、正しい値を返しましたが、f->Left を設定すると Access Violation 例外がスローされました。誰でも理由を説明できますか?
// original version
void OasisUtils::GetOasisCenter(POINT * pos) {
RECT *Rect;
GetWindowRect(Application->Handle, Rect);
pos->x = (Rect->left + Rect->right) / 2;
pos->y = (Rect->top + Rect->bottom) / 2;
delete Rect; // tried with and without this
}