用Dream Collection就可以
www.dreamcompany.com

解决方案 »

  1.   

    你用Infopower控件或用DevExpress控件:
    InfoPower下载地址为:http://delphi5.4u.ru/,这个控件比较简单,容易使用
    DevExpress下载地址为:http://heguohua.topcool.net/,这个比较复杂
      

  2.   

    //********************************************
    //这个单元是我用TSTRINGGRID来做你想要的效果(肯定没实现,但是提供解决问题的思路)
    //我原本打算写成一个控件,可是我想在表单上直接
    //写出来快一点,假设这个控件多个DATASET属性,
    //过程和函数的操作应该是一样.基本上你提到的问题
    //我都做了一些,例如浮点数的处理,只要得到数据库
    //中的定义就可以了.里面有一个过程是获得这个数据的.
    //另外是对不同数据字段的不同处理方式,例如在
    //DATE字段生成一个DATETIMEPICKER(拣现成的),
    //如果用心,应该可以写一个像你所说那样功能的东东,至于
    //嵌套表什么,没有基础又从那里来呢?你不如自己动手
    //先写一个基础的,然后在此基础上,不断扩展你的控件,
    //应该可以达到你想要的效果的.
    //我觉得D1不能和D5一较长短吧!但没有D1那里来D5呢?
    //用别人的控件固然好,快,但失去一个学习提高的机会
    //我觉得蛮可惜的.我不是来挣分,只是大家交流一下,祝工作顺利!
    //
    //
    //这个例子需要在表单上放置一个TSTRINGGRID,TTABLE,TDBNAVIGATOR,
    //TDATASOURCE,没有其他属性设置,基本上都是缺省的.你试一试吧!
    //另外找一个有DATE字段的表来试这个例子.
    //********************************************unit newgrid;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, DBTables, Grids, ExtCtrls, DBCtrls,DBiTypes,DbiErrs,DbiProcs,
      ComCtrls;
    type FieldRec=record
         fieldtype:TFieldtype;
         size:integer;
         digital:integer;
    end;type
      TForm1 = class(TForm)
        Table1: TTable;
        DataSource1: TDataSource;
        DBNavigator1: TDBNavigator;
        Panel1: TPanel;
        Grid: TStringGrid;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
        procedure GridSelectCell(Sender: TObject; ACol, ARow: Integer;
          var CanSelect: Boolean);
      private
        { Private declarations }
        procedure LoadDataValue;
        procedure LoadDataStructure;
        procedure showFields(T:TTable);
        procedure TheDatechange(Sender:Tobject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      fieldArray:array of FieldRec;
      CurrentIndex:Integer;
      DateEdit:TDateTimePicker;
    implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    var
      i:integer;
    begin
    table1.Active :=true;
      Grid.ColWidths[1]:=Grid.Width - grid.DefaultColWidth ;
      SetLength(fieldarray,Table1.fields.count);
      for i:=0 to table1.FieldDefs.Count-1 do begin
       Grid.RowCount :=i+1;
        Grid.Cells[0,i]:='   '+table1.FieldDefs.Items[i].Name ;
      end;
      Table1.First ;
    LoadDataStructure;
      LoadDataValue;
      CurrentIndex:=0;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
    Table1.Active :=false;
      Setlength(fieldarray,0);
    end;//这里判断虽然多,但是常用的也不算太麻烦,
    //一点点加功能喽!
    procedure TForm1.LoadDataValue;
    var
      i:integer;
      NowValue:string;
      pc1,pc2:integer;
      floatFormat:String;
    begin
      NowValue:='';
      for i:=0 to table1.FieldDefs.Count-1 do begin
      With table1.fieldbyname(table1.FieldDefs.Items[i].name) do begin
      if Value<>NULL then
      case DataType of
    ftUnknown:begin
           NowValue:='UNKNOWN'
          end;
    ftString:begin
           NowValue:=Value;
          end;
    ftSmallint,ftInteger,ftWord:begin
           NowValue:=inttostr(Value);
          end;
    ftBoolean:begin
           if value then
           NowValue:='TRUE'
           else
            NowValue:='False';
          end;
    ftFloat,ftCurrency:begin
    pc1:=fieldarray[i].size;
    pc2:=fieldArray[i].digital ;
            NowValue:=floattoStrf(value,ffNumber,pc1,pc2);
          end;
    ftBCD:begin
           NowValue:='BCD'
          end;
    ftDate:begin
           NowValue:=DateToStr(Value);
          end;
    ftTime:begin
           NowValue:=TimetoSTr(Value);
          end;
    ftDateTime:begin
           NowValue:=DateTimeToStr(value);
          end;
    ftBytes:begin
           NowValue:='BYTES'
          end;
    ftVarBytes:begin
           NowValue:='VARBYTES'
          end;
    ftAutoInc:begin
           NowValue:=inttostr(value);
          end;
    ftBlob:begin
           NowValue:='BLOB'
          end;
    ftMemo:begin
           NowValue:='MEMO';
          end;
    ftGraphic:begin
           NowValue:='GRAPHIC'
          end;
    ftFmtMemo:begin
           NowValue:='FORMAT MEMO'
          end;
    ftParadoxOle:begin
           NowValue:='PARADOX OLE'
          end;
    ftDBaseOle:begin
           NowValue:='DBASE OLE'
          end;
    ftTypedBinary:begin
           NowValue:='TBINARY'
          end;
    ftCursor:begin
           NowValue:='CURSOR'
          end;
    ftFixedChar:begin
           NowValue:='FIXEDCHAR'
          end;
    ftWideString:begin
           NowValue:=value;
          end;
    ftLargeInt:begin
           NowValue:=inttostr(value);
          end;
    ftADT:begin
           NowValue:='ADT'
          end;
    ftArray:begin
           NowValue:='ARRAY'
          end;
    ftReference:begin
           NowValue:='REFERENCE'
          end;
    ftDataSet:begin
           NowValue:='DATASET'
          end;
    ftOraBlob:begin
           NowValue:='ORACLE BLOB'
          end;
    ftOraClob:begin
           NowValue:='ORACLE CLOB'
          end;
    ftVariant:begin
           NowValue:='VARIANT'
          end;
    ftInterface:begin
           NowValue:='INTERFACE'
          end;
    ftIDispatch:begin
           NowValue:='ID DISPATCH'
          end;
    ftGuid:begin
           NowValue:='GUID'
          end;
      end else
         NowValue:='';
      end;
      Grid.Cells[1,i]:=NowValue ;
      end;end;procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    begin
    LoadDataValue;
    end;procedure TForm1.LoadDataStructure;
    var
      i:integer;
    begin
      for i:=0 to table1.fields.count-1 do begin
    fieldArray[i].fieldtype :=table1.Fields[i].DataType ;
      end;
      Showfields(Table1);
    end;//从BDE的API中获得表信息.
    procedure TForm1.showFields(T: TTable);
    var
       curProp: CURProps;
       pfldDes, pCurFld: pFLDDesc;
       i: Integer;
       MemSize: Integer;
       FieldList: string;
    begin
      Check(DbiGetCursorProps(T.Handle, curProp));  MemSize := curProp.iFields * SizeOf(FLDDesc);
      pfldDes := AllocMem(MemSize);
      try
        pCurFld := pfldDes;
        Check(DbiGetFieldDescs(T.Handle, pfldDes));
        I := 0;
        FieldList := '';
        while (i < curProp.iFields) do begin
          fieldArray[i].size :=pCurFld^.iUnits1;
          fieldArray[i].digital :=pCurFld^.iUnits2;
          // 移动指针到下一个记录
          inc(pCurFld);
          inc(i);
        end;
      finally
        FreeMem(pfldDes, MemSize);
      end;
    end;procedure TForm1.GridSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    var
      Nowfieldtype:TFieldType;
      NowRect:TRect;
    begin
      NowFieldtype:=FieldArray[CurrentIndex].fieldtype ;
      Case NowFieldType of
        ftDate,ftDateTime,fttime:begin
         DateEdit.free;
        end;
        ftBoolean:begin
        end;
      end;
      NowFieldtype:=FieldArray[ARow].fieldtype ;
      Case NowFieldtype of
        ftDate,ftTime,ftDateTime:begin
          DateEdit:=TDateTimePicker.Create (Grid);
          DateEdit.parent:=Grid;
          NowRect:=Grid.CellRect (1,ARow);
          DateEdit.SetBounds (NowRect.Left ,NowRect.Top,NowRect.Right-NowRect.Left ,NowRect.Bottom-NowRect.Top );
          DateEdit.SetFocus ;
          DateEdit.OnChange :=TheDateChange;
        end;
        ftBoolean:begin
        end;
      end;
      CurrentIndex:=ARow;
    end;procedure TForm1.TheDatechange(Sender: Tobject);
    begin
    With Sender as TDateTimePicker do begin
       Grid.Cells[1,CurrentIndex]:=DatetoStr(Date);
      end;
    end;end.
      

  3.   

    哦,PropGrid行吗?完全可以做出Inspector的效果.深度历险有.