数据库有些是char(50)宽度的,但实际上可能会只有几个数字,用DBGrid来显示的时候很不美观,想做一个过程来让DBGrid自动适应列宽。
但是效果总是实现不了,有时缩得太短,更难看,有些又太长。
希望能一起讨论讨论:
QQ : 448195212procedure 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;

解决方案 »

  1.   

    不是用LENGTH,因为这个求出来的是字符串的长度,应该是用objDBGrid.Canvas.TextWidth(....)
      

  2.   

    to:
    netfly(支点),如果是数字,就缩短了。
      

  3.   

    有下载的,
    安装方法:
    完整的打开,然后切换到frame单元,component -> create component template,这样就出现了一个新组建页和创建了新的组建。如果使用的时候编译出现错误,可能是没有uses,要uses DBClient;