定義済みの列を持つ TDBGrid を持っていますが、幅を正しく設定できません。フォーム デザイナで列の Width プロパティをいじって、設計時に幅を適切に表示することができますが、実行時には、何らかの理由で列が大幅に広くなる傾向があり、スクロール バーが表示されます。グリッドの下部にあります。特にグリッドに 1 つまたは 2 つしかない場合、試行錯誤をせずに列のサイズを正しく設定する方法はありますか?
5 に答える
フォームの OnResize イベント内でこの手順を使用します
procedure AutoStretchDBGridColumns(Grid: TDBGrid; Columns, MinWidths: Array of integer);
var
x, i, ww: integer;
begin
// Stretches TDBGrid columns
// Columns contains columns to stretch
// MinWidths contains columns minimum widhts
// To stretch grids columns 1,2 and 5 automatically and set minimum widths to 80, 150 and 150 call
// AutoStretchDBGridColumns(DBGrid1, [1,2,5], [80, 150, 150]);
Assert(Length(Columns) = Length(MinWidths), 'Length(Columns) <> Length(MinWidths)');
ww := 0;
for i := 0 to Grid.Columns.Count - 1 do
begin
if Grid.Columns[i].Visible then
ww := ww + Grid.Columns[i].Width + 1; //** +1 for grid line width
end;
if dgIndicator in Grid.Options then
ww := ww + IndicatorWidth;
x := (Grid.ClientWidth - ww) div Length(Columns);
for i := 0 to High(Columns) do
Grid.Columns[Columns[i]].Width := Max(Grid.Columns[Columns[i]].Width + x, MinWidths[i]);
end;
いくつかの欠点がありますが、十分に機能します。
私は問題の答えを知っていると思います。私は数年間同じ問題を抱えていました。デモ データを入れると、列幅のサイズを変更します (設計時) が、Delphi のバグとして、入力した幅が Delphi が列に割り当てるデフォルトの幅と同じであると思われます。 dfm ファイル - dfm をテキストとして表示するとわかるように。
私の解決策は、Delphi が幅を強制的に格納するように (または dfm を直接編集するように)、幅を 1 ピクセル広くまたは狭く設定し、実行時に設定されるようにすることです。設定しない場合、Delphi は実行時に計算された幅を割り当てますが、これはデータによって変わる可能性があるため、望ましくありません。簡単な解決策ですが、理解するのに長い時間がかかりました。
それは可能ですが、表示できる可能性のあるすべてのレコードのすべてのフィールドの幅を確認する必要があります。
レコードセットをほとんどフィルタリングしないアプリケーションがまだたくさんあるという事実を考えると、これは、スクロールバーを取り除くためだけに、無数のレコードをチェックする必要があることを意味する可能性があります。
一度に表示しすぎる情報が多すぎると思ったことはありませんか?
考えられる代替案は、列に収まらないフィールドのヒントテキストを表示することです。
私はそのような代替手段を使用しましたが、ソースを確認する必要があります。明日、サンプルコードを入手できます。
--jeroen
JPの答えはかなり良い解決策です。ウィンドウに収まるように、必要に応じて列を手動で拡大または縮小する必要があります。垂直スクロール バーの幅を取得するための Windows API 呼び出しがあります。次に、表示されている行を見て、垂直スクロール バーが表示されているかどうかを確認できます。
もう 1 つの手法は、各列の幅を相対的に計算することです。次に、サイズを変更するときに同じ比率を維持します。