この Delphi コードを C++ Builder XE で使用しようとしました。言語を手動で C++ Builder 言語に変換します。
この手順は正しく機能していました。DBGrid を保持するフォームを最大化しようとすると、この手順により、グリッド幅に従って列幅が正常に分割されました。ただし、フォームの右または左でマウス コントロールを使用してフォーム幅を最小化しようとすると、この手順では列幅が各列の値の長さやラベルの長さに調整されませんでした。
それを修正する方法はありますか?または、このような問題を解決する別の手順を持っている人はいますか?
編集:わかりました、これがコードです。上記のコードを次のコードに手動で変換しました。
void __fastcall TfmMain::FixGridColumnsWidth(TDBGrid *DBGrid)
{
int TotalColumnWidth, ColumnCount, GridClientWidth, Filler, i;
ColumnCount = DBGrid->Columns->Count;
if (ColumnCount == 0)
exit;
// compute total width used by grid columns and vertical lines if any
TotalColumnWidth = 0;
for ( i = 0; i <=ColumnCount-1; i++)
TotalColumnWidth = TotalColumnWidth + DBGrid->Columns->Items[i]->Width;
if ( DBGrid->Options.Contains(dgColLines) )
// include vertical lines in total (one per column)
TotalColumnWidth = TotalColumnWidth + ColumnCount;
// compute grid client width by excluding vertical scroll bar, grid indicator,
// and grid border
GridClientWidth = DBGrid->Width - GetSystemMetrics(SM_CXVSCROLL);
if ( DBGrid->Options.Contains(dgIndicator) ) {
GridClientWidth = GridClientWidth - IndicatorWidth;
if ( DBGrid->Options.Contains(dgColLines) )
GridClientWidth--;
}
if ( DBGrid->BorderStyle == bsSingle ) {
if ( DBGrid->Ctl3D ) { // border is sunken (vertical border is 2 pixels wide)
GridClientWidth = GridClientWidth - 4;
}
else { // border is one-dimensional (vertical border is one pixel wide)
GridClientWidth = GridClientWidth - 2;
}
}
// adjust column widths
if ( TotalColumnWidth < GridClientWidth ) {
Filler = (GridClientWidth - TotalColumnWidth) / ColumnCount;
for ( i = 0; i <= ColumnCount-1; i++ )
DBGrid->Columns->Items[i]->Width = DBGrid->Columns->Items[i]->Width + Filler;
}
else
if ( TotalColumnWidth > GridClientWidth ) {
Filler = (TotalColumnWidth - GridClientWidth) / ColumnCount;
if ( (TotalColumnWidth - GridClientWidth) % ColumnCount != 0 )
Filler++;
for ( i = 0; i <= ColumnCount-1; i++ )
DBGrid->Columns->Items[i]->Width = DBGrid->Columns->Items[i]->Width - Filler;
}
}
前もって感謝します。