各位大虾,小弟有一个问题想请教一下,我用DBGRID录入时,有些字段很多,自动适应大小时,至于列太窄,不方便录入,我的想法是,我在录入过程中,输入了多少字符,该列随着输入变宽,输完离开后,又恢复到原来的样子,这样就很方便对数据的录入,请问如何根据输入的多少,列宽自动增加,具体如何实现?

解决方案 »

  1.   

    加一个EDIT上去,呵呵~~
    编辑时显示(并拉长),编辑完后隐藏和提交.
      

  2.   

    我的自动调整DBGrid列的程序:
    procedure SetDBGridSize(DataSource:TDataSource;Table:TTable;DBGrid:TDBGrid);
    var i,j : integer;
        FieldWidth  : Array[0..255] of integer;   //Íø¸ñ¿í¶ÈÊý¾Ý
        Bkmk:TBook;
    begin
      if Table.Active then
      begin
        with DBGrid do
        begin
          Bkmk:=Table.GetBook;
          for i:=0 to DataSource.DataSet.FieldCount-1 do
          begin
            FieldWidth[i]:=canvas.TextWidth(DBGrid.Columns[i].Title.Caption) + 4;
            if DataSource.DataSet.Fields[i].DataType=ftDate then
              if canvas.TextWidth('2000/12/12')>FieldWidth[i] then
                FieldWidth[i]:=canvas.TextWidth('2000/12/12')+4;
          end;
          Table.DisableControls;
          Table.First;                                                  // Êý¾ÝÖ¸ÏòÊ×Ò³
          j:=0;
          while not Table.Eof do
          begin
            j:=j+1;
            for i:=0 to DataSource.DataSet.FieldCount-1 do              // Í³¼Æ¸÷Íø¸ñµÄ¿í¶È
              if (DataSource.DataSet.Fields[i].DataType=ftString) or
                 (DataSource.DataSet.Fields[i].DataType=ftinteger) or
                 (DataSource.DataSet.Fields[i].DataType=ftCurrency) then
              begin
                if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4) then
                  FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4);
                if (DataSource.DataSet.Fields[i].DataType=ftCurrency) then
                  if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44) then
                    FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44);
              end;
            Table.next;
            if j>10 then break;
          end;
        end;
        Table.GotoBook(Bkmk);
        Table.FreeBook(Bkmk);
        Table.EnableControls;
      end;
      for i:=0 to DataSource.DataSet.FieldCount-1 do
        DBGrid.Columns[i].Width:=FieldWidth[i];
    end;
      

  3.   

    感谢楼上的兄弟,但问题没有解决。
    2楼的兄弟提出EDIT的思路,可能是一个办法,但怎么做不太明确。
    3楼的兄弟提出的方案是根据字段的类型,确定长度,不适合本题的要求。我已经能够在窗体显示时自动适应列宽度了,但是由于列太多,宽都都自动变窄了,我的想法是,再一次动态调整列宽。根据输入的内容长度,动态变化,离开该列时,该列又回到原来的样子,新的一列进入时,又根据输入的内容动态变化宽度。
    不知我说清楚没有,有没有大虾帮忙解决,直接散分!