自适应列宽有关问题,为什么这个处理过程不能完全实现效果呢
自适应列宽问题,为什么这个处理过程不能完全实现效果呢?
数据库有些是char(50)宽度的,但实际上可能会只有几个数字,用DBGrid来显示的时候很不美观,想做一个过程来让DBGrid自动适应列宽。
但是效果总是实现不了,有时缩得太短,更难看,有些又太长。
希望能一起讨论讨论:
QQ : 448195212
procedure TTestFrm.MakeDBGridColumnsAutoFixItsWidth(objDBGrid:T用);
var
cc : integer;
i,tmpLength : Integer;
objDataSet : TDataSet;
aDgCLength : array of integer;
tmpStr : String;
begin
cc := objDbGrid.Columns.Count - 1;
objDataSet := objDbGrid.DataSource.DataSet;
setlength(aDgCLength,cc+1);
//
for i := 0 to cc do
begin
aDgCLength[i] := length(objDbGrid.Columns[i].Title.Caption);
end;
objDataSet.First;
while not objDataSet.Eof do
begin
//
for i :=0 to cc do
begin
tmpStr := objDataSet.Fields.Fields[i].AsString;
tmpStr := DM.MyDeleteSpace(tmpStr);
showmessage(tmpStr);
tmpLength := length(tmpStr);
//showmessage( '111: '+intToStr(length(objDataSet.Fields.Fields[i].AsString)));
if tmpLength> aDgCLength[i]
then
begin
aDgCLength[i] := tmpLength;
//showmessage(intToStr(aDgCLength[i])); //------??
end;
end;
objDataSet.Next;
end;
//showmessage(intToStr(aDgCLength[i]));
for i := 0 to cc do
begin
objDbGrid.Columns[i].Width := aDgCLength[i];
objDbGrid.Columns[i].Title.Alignment := tacenter;
end;
objDbGrid.Options := [dgTitles,dgIndicator,dgColumnResize,dgColLines,
dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];
end;
------解决方案--------------------
不是用LENGTH,因为这个求出来的是字符串的长度,应该是用objDBGrid.Canvas.TextWidth(....)
------解决方案--------------------
用dbGridEh模板吧
数据库有些是char(50)宽度的,但实际上可能会只有几个数字,用DBGrid来显示的时候很不美观,想做一个过程来让DBGrid自动适应列宽。
但是效果总是实现不了,有时缩得太短,更难看,有些又太长。
希望能一起讨论讨论:
QQ : 448195212
procedure TTestFrm.MakeDBGridColumnsAutoFixItsWidth(objDBGrid:T用);
var
cc : integer;
i,tmpLength : Integer;
objDataSet : TDataSet;
aDgCLength : array of integer;
tmpStr : String;
begin
cc := objDbGrid.Columns.Count - 1;
objDataSet := objDbGrid.DataSource.DataSet;
setlength(aDgCLength,cc+1);
//
for i := 0 to cc do
begin
aDgCLength[i] := length(objDbGrid.Columns[i].Title.Caption);
end;
objDataSet.First;
while not objDataSet.Eof do
begin
//
for i :=0 to cc do
begin
tmpStr := objDataSet.Fields.Fields[i].AsString;
tmpStr := DM.MyDeleteSpace(tmpStr);
showmessage(tmpStr);
tmpLength := length(tmpStr);
//showmessage( '111: '+intToStr(length(objDataSet.Fields.Fields[i].AsString)));
if tmpLength> aDgCLength[i]
then
begin
aDgCLength[i] := tmpLength;
//showmessage(intToStr(aDgCLength[i])); //------??
end;
end;
objDataSet.Next;
end;
//showmessage(intToStr(aDgCLength[i]));
for i := 0 to cc do
begin
objDbGrid.Columns[i].Width := aDgCLength[i];
objDbGrid.Columns[i].Title.Alignment := tacenter;
end;
objDbGrid.Options := [dgTitles,dgIndicator,dgColumnResize,dgColLines,
dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];
end;
------解决方案--------------------
不是用LENGTH,因为这个求出来的是字符串的长度,应该是用objDBGrid.Canvas.TextWidth(....)
------解决方案--------------------
用dbGridEh模板吧