自适应列宽有关问题,为什么这个处理过程不能完全实现效果呢

自适应列宽问题,为什么这个处理过程不能完全实现效果呢?
数据库有些是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模板吧