アップデート:
Delphiは、デフォルトでDisplaylengthのvarcharフィールドの長さを取ります。varchar(255)= Displaylength=255。
「SQL」でこの動作を変更できますか?いいえ
結果の長さが99文字しかない場合、長さvarchar(255)=255およびDisplaylength=255です。
比較してください!
許可された:
select left(name,99), quantity, value from table;
- SQLは、データセットをすばやく配信する必要があります(レポートのデザインではありません)。
- 各varcharフィールドのテーブルごとに、追加のSQLステートメントを設定する必要があります
(xname,99)
- 切り捨てられた(おそらく重要な)情報を表示できますか?一度もない。
許可されていない:
Columns[index].Width = 99;
- レポートのデザインが簡単になります。
- より簡単なSQLステートメントの選択:
select name, quantity, value from table
- マウスで列を展開するだけで、非表示の情報が表示されます。
- 適切な設計:DBGridの列サイズは、一度に少なくとも2つの列を表示できるサイズにする必要があります。
プログラムが設計を引き継ぐ必要があります。
これはレポートジェネレータであるため、このコードは多くのテーブルから取得されるため、パスカルコードでこれを行うことも、テーブルコンポーネントのFieldsオブジェクトで定義することもできません。
レポートごとに異なるSQLコードを使用する必要があります。
この「異なるSQLコード」を生成するのは誰ですか?
コード(パスカルコード)の生成にも同様の行が使われていると思います。
許可:パスカルコード
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add ('select name, quantity, value from table');
Query1.Active: = true;
許可されない理由:パスカルコード
Columns[index].Width := 99;
あなたは列の自動調整でそれを行うことができます。特定のサイズより幅の広いすべての列は、実際の幅に合わせて調整されます。これは、固定サイズ=99よりも優れています。
次のプログラムは、RadStudio2007およびZeosコンポーネントでテストされています。
Windows2000コンピュータ上のFirebird2.5。
- A)Zeosコンポーネント。
- B)DBGrid1アクティブなデータ接続がありません。
- C)Firebirdはvarchar(255)のサイズを自動的に割り当てました。
- D)実行中のプログラム。「useMe」は、列のサイズを自動的に設定するために使用されます。
時間の不足のため、2つのデータフィールドのみを作成しました。
ダウンロードにソースコード全体が必要な場合は、お知らせください。
unit FBAuto;
{
~Zarko Gajic
About Delphi Programing
http://delphi.about.com
customized 2013
moskito-x software
}
interface
uses
Math,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, ExtCtrls, StdCtrls, ZAbstractRODataset,
ZAbstractDataset, ZDataset, ZConnection;
type
TAutoColumnWidth = record
Index : integer;
Width : integer;
end;
TForm1 = class(TForm)
DBGrid1: TDBGrid;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
DataSource1: TDataSource;
CBuseMe: TCheckBox;
DBGrid2: TDBGrid;
ZQuery2: TZQuery;
DataSource2: TDataSource;
IntegerField1: TIntegerField;
StringField1: TStringField;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure CBuseMeClick(Sender: TObject);
private
{ Private declarations }
procedure SetFit;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
AutoColumnWidth : TAutoColumnWidth;
useMe :Boolean;
procedure TForm1.SetFit;
var
i:integer;
begin
if NOT CBuseMe.Checked then begin
for i := 0 to DBGrid1.Columns.Count - 1 do begin
if DBGrid1.Columns[i].Field.Size > 300 then
DBGrid1.Columns[i].Width := DBGrid1.Columns[i].Field.Size;
end;
end else begin
useMe:=true;
for i := 0 to DBGrid1.Columns.Count - 1 do begin
AutoColumnWidth.Index:=-1;
if DBGrid1.Columns[i].Field.DisplayWidth > 200 then AutoColumnWidth.Index:=i;
if AutoColumnWidth.Index > -1 then begin
AutoColumnWidth.Width := -1;
DBGrid1.Repaint;
DBGrid1.Columns[AutoColumnWidth.Index].Width := AutoColumnWidth.Width+ 5;
end;
end;
useMe:=false;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ZQuery1.Active:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AutoColumnWidth.Index := -1;
AutoColumnWidth.Width := -1;
useMe:=false;
end;
procedure TForm1.CBuseMeClick(Sender: TObject);
begin
setFit;
end;
procedure TForm1.DBGrid1DrawColumnCell(
Sender: TObject;
const Rect: TRect;
DataCol: Integer;
Column: TColumn;
State: TGridDrawState);
begin
if useMe then begin
if DataCol = AutoColumnWidth.Index then
begin
if Assigned(Column.Field) then
begin
AutoColumnWidth.Width := Max(AutoColumnWidth.Width, DBGrid1.Canvas.TextWidth(Column.Field.DisplayText));
end;
end;
end;
end;
end.
ニーズに合わせて200以上を設定できます。
if DBGrid1.Columns[i].Field.DisplayWidth > 200 then AutoColumnWidth.Index:=i;
これが少し役立つか、正しい方向につながることを願っています。