更新:
Delphi 将varchar 字段的长度作为 Displaylength 的默认值。varchar(255) = 显示长度 = 255。
我可以用“SQL”改变这种行为吗?NO
如果结果只有 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 列。
程序应该接管设计。
我不能通过 pascal 代码执行此操作,也不能在表组件的 Fields 对象上定义它,因为此代码来自许多表,因为这是一个报告生成器。
对于每个报告,我必须使用不同的 SQL 代码。
谁生成了这个“不同的 SQL 代码”?
我认为类似的行用于生成代码(Pascal 代码)。
允许:帕斯卡码
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add ('select name, quantity, value from table');
Query1.Active: = true;
为什么不允许:帕斯卡代码
Columns[index].Width := 99;
您可以通过自动调整列来做到这一点。所有宽一定尺寸的列都将适应它们的实际宽度。这仍然比固定大小 = 99 好。
以下程序已使用 Rad Studio 2007 和 Zeos Components 进行了测试。
Firebird 2.5,在 Windows 2000 计算机上。
- A) Zeos 组件。
- B) DBGrid1 没有活动的数据连接。
- C) Firebird 自动为 varchar (255) 分配大小。
- D) 正在运行的程序。“使用我”用于自动调整列的大小。
由于时间不够,我只创建了 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;
我希望这会有所帮助,或者可能会导致正确的方向。