(对不起,我写错了)我急切需要一个控件!

forever 2000-01-11 04:34:00
在进行数据库程序开发过程中,经常要写大量的Form, 而且这些Form上的Field又特别多,为此经常要摆上大量的edit, label等,(我一般!不!用数据感知控件,除了只读用DBgrid),哪位高手可以提供一个类似于Delphi 的Object Inspector的控件(感知数据或不感知都要).

说句实话,Venna的思路我也曾有过这样的想法但实际操作起来很困难,好象应该继承TCustomGrid来干这个事情,但有很多问题要解决:时间的输入(是Float而不是string型的Date);参照表的数据可以在某一行下拉出来;以及类似于Object Inspector的嵌套属性;三个小省略号引入更复杂的属性设置问题等等。
我总怀疑应该有这样的控件。
...全文
171 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
barton 2000-01-13
  • 打赏
  • 举报
回复
哦,PropGrid行吗?完全可以做出Inspector的效果.深度历险有.
Venne 2000-01-12
  • 打赏
  • 举报
回复
//********************************************
//这个单元是我用TSTRINGGRID来做你想要的效果(肯定没实现,但是提供解决问题的思路)
//我原本打算写成一个控件,可是我想在表单上直接
//写出来快一点,假设这个控件多个DATASET属性,
//过程和函数的操作应该是一样.基本上你提到的问题
//我都做了一些,例如浮点数的处理,只要得到数据库
//中的定义就可以了.里面有一个过程是获得这个数据的.
//另外是对不同数据字段的不同处理方式,例如在
//DATE字段生成一个DATETIMEPICKER(拣现成的),
//如果用心,应该可以写一个像你所说那样功能的东东,至于
//嵌套表什么,没有基础又从那里来呢?你不如自己动手
//先写一个基础的,然后在此基础上,不断扩展你的控件,
//应该可以达到你想要的效果的.
//我觉得D1不能和D5一较长短吧!但没有D1那里来D5呢?
//用别人的控件固然好,快,但失去一个学习提高的机会
//我觉得蛮可惜的.我不是来挣分,只是大家交流一下,祝工作顺利!
//
//
//这个例子需要在表单上放置一个TSTRINGGRID,TTABLE,TDBNAVIGATOR,
//TDATASOURCE,没有其他属性设置,基本上都是缺省的.你试一试吧!
//另外找一个有DATE字段的表来试这个例子.
//********************************************

unit newgrid;

interface

uses
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.
fstao 2000-01-12
  • 打赏
  • 举报
回复
你用Infopower控件或用DevExpress控件:
InfoPower下载地址为:http://delphi5.4u.ru/,这个控件比较简单,容易使用
DevExpress下载地址为:http://heguohua.topcool.net/,这个比较复杂
jiangtao 2000-01-11
  • 打赏
  • 举报
回复
用Dream Collection就可以
www.dreamcompany.com
kxy 2000-01-11
  • 打赏
  • 举报
回复
DrawControl控件包,去找找吧.

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧