DbGrid问题(50分)

  • 主题发起人 主题发起人 luaijun
  • 开始时间 开始时间
L

luaijun

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TFrmUse_def2.SetTableName(ss:string);
var buf:string[100];
cot,cott:integer;
begin
Table2.TableName:=ss;
Table2.Active:=true;
DBGrid1.Columns.Clear;
DBGrid1.Columns.Add.FieldName:='A1';
DBGrid1.Columns.Items[0].Title.Caption:='编 号';
DBGrid1.Columns.Items[0].Title.Alignment:=taCenter;
DBGrid1.Columns.Items[0].ReadOnly:=false;
DBGrid1.Columns.Add.FieldName:='A2';
DBGrid1.Columns.Items[1].Title.Caption:='姓 名';
DBGrid1.Columns.Items[1].Title.Alignment:=taCenter;
DBGrid1.Columns.Items[1].ReadOnly:=false;
cot:=3;
cott:=2;
Table1.First;
while NOT Table1.Eof do
begin
if Table1.FieldByName('s_static').AsString='T' then
begin
buf:=trim(Table1.FieldByName('s_name').AsString);
DBGrid1.Columns.Add.FieldName:='A'+trim(IntToStr(cot));
DBGrid1.Columns.Items[cott].Title.Caption:=buf;
DBGrid1.Columns.Items[cott].Title.Alignment:=taCenter;
cott:=cott+1;
end;
Table1.Next;
cot:=cot+1;
end;
end;
procedure TFrmUse_def2.Button3Click(Sender: TObject);
var ch:TFrmUse_def3;
begin
Close;
ch:=TFrmUse_def3.Create(Application);
ch.SetTableName(Table2.TableName);
end;
上面程序中,Table1为一sql数据库中的一个表

程序运行后,DbGrid1显示Table1中部分字段,输入记录,进入下一条时,产生异常,说A4必须输入内容
可这时A4是没有的
在下一个窗口才会出现A4,下一个窗口TFrmUse_def3的SetTableName和这个一样,只是条件不一样
,因而字段不一样,前两个字段一样,它会有A4出现
请都各位大侠,为什么
 
cot何意,为什么放在IF的外面呢,它为什么与COTT不同,
最后两句话看不懂不知所云何物,写清楚点吧。表结构是什么。
纯属感觉,COT放在IF外面有问题(因为看不明白).
 
<H1>
I can not see!
</H1>
 
A4是不是非空的字段,如果是的话,当然会出错了。
 
>>可这时A4是没有的
这个“没有”是没有在DBGrid中出现,但是实际的表里有啊;
如果A4字段在建表的时候就指定不能为空,肯定会出这个错的,所以你应该保证给A4赋值。
从你的实际代码来看,其实cott变量可以省掉,这样写——
DBGrid1.Columns.Items[DBGrid1.Columns.Count - 1].Title.Caption:=buf;
 
这段代码的意思是从Tabel1中取出相应字段,编辑(FrmUse_def2)主要是录入
表的结构是根据Talbel1的字段动态生成的,Table1的字段+A1+A2
在FrmUse_def3中会对满足另一条件的字段进行编辑

Table2是临时生成的,在FrmUse_def1生成的如下所示:
pocedure TFrmUse_def1.Button1Click(Sender: TObject);
var ss,ss1:string[100];
bl:String;
vii,cot:integer;
ch:TFrmUse_def2;
begin
ss:='工资表'+trim(Edit1.Text)+'年'+trim(Edit2.Text)+'月'+'.dbf';
if FileExists(ss) then
begin
vii:=MessageDlg('该工资表已存在,覆盖吗?',mtWarning,[MbYes,mbNo],0);
if vii=mrNo then exit;
end;
Table2.FieldDefs.Clear;
Table2.TableName:=ss;
Table2.FieldDefs.Add('A1',ftstring,10,true);//编号
Table2.FieldDefs.Add('A2',ftstring,10,true);//姓名
cot:=3;
Table1.First;
while NOT Table1.Eof do
begin
ss1:='A'+trim(IntToStr(cot));
cot:=cot+1;
bl:=Table1.FieldByName('s_type').AsString;//类型
vii:=Table1.FieldByName('s_width').AsInteger;//宽度
if bl='T' then
Table2.FieldDefs.Add(ss1,ftstring,vii,True)
else
Table2.FieldDefs.Add(ss1,ftfloat,0,True);
Table1.Next;
end;
Table2.CreateTable;
Close;
ch:=TFrmUse_def2.Create(Application);
ch.SetTableName(ss);
end;
 
luaijun:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部