(对不起,我写错了)我急切需要一个控件! 用Dream Collection就可以www.dreamcompany.com 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你用Infopower控件或用DevExpress控件:InfoPower下载地址为:http://delphi5.4u.ru/,这个控件比较简单,容易使用DevExpress下载地址为:http://heguohua.topcool.net/,这个比较复杂 //********************************************//这个单元是我用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. 哦,PropGrid行吗?完全可以做出Inspector的效果.深度历险有. 报错:测试连接失败,因为初始化提供程序时发生错误。 update 中,等号左边有一项是空值,则左边结果也为空,如何解决?! socket问题 关于dbgrideh的问题 很急的查询问题,望高手进来看一看 如何用Tquery控件来将一个图片存入数据库中?解决立即结贴! 请问在三层架构中,客户端如何执行服务器端的方法? 问一个非常简单的问题:Delphi区分大小写吗? 寻找富文本控件 TBatchMove如何实现大表的数据转换 谁能帮我!我实在是不知道该怎么做了! 在DELPHI中任何实现UDP网络编程?
InfoPower下载地址为:http://delphi5.4u.ru/,这个控件比较简单,容易使用
DevExpress下载地址为:http://heguohua.topcool.net/,这个比较复杂
//这个单元是我用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.