一个程序出错,请高手帮帮忙!!急! Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiDB/html/delphi_20061220090748211.html
我想从库中的数据表导到stringgrid,想做成比较直观一点的输入界面,把时间字段(sjd)作为行,把数据项目和数据编号字段作为两列输出,可是运行下面的程序时出错,原因是写到ADO_sjz时找不到fieldbyname,但我上次也是遇到这种情况我就照样写进去,结果就得了,可这次就是不得!请帮帮忙看一下哪里出错,若有怎么更好的更方便的更为直观的数据输入界面的控件请告诉我好吗?因为要做一个不同时段对同样的多条数据项目输入数据!要能让用户一眼就能看完各时段的数据和输入各时段的数据.以下是程序:
procedure Tsjxmzlr.Button1Click(Sender: TObject);
var
i:integer;
j:integer;
begin
with ADOQ_sjz do
begin
ADOQ_sjz.Close;
ADOQ_sjz.SQL.Clear;
ADOQ_sjz.SQL.Text := 'select phid,sjmc from hymcb where lxmc=:lxmc';
ADOQ_sjz.Parameters.ParamByName('lxmc').Value := trim(cb_lx.Text);
ADOQ_sjz.Open;
for i:=0 to ADOQ_sjz.RecordCount-1 do
begin
SG_sjz.Cells[0,i] := ADOQ_sjz.fieldbyname('phid').AsString;
SG_sjz.Cells[1,i] := ADOQ_sjz.fieldbyname('sjmc').AsString;
ADOQ_sjz.Next;
end;
end;
with ADOQ_sjz do
begin
ADOQ_sjz.Close;
ADOQ_sjz.SQL.Clear;
ADOQ_sjz.SQL.Text := 'select sjd from sjb where bd=:bd';
ADOQ_sjz.Parameters.ParamByName('sjd').Value := trim(CBB_bd.Text);
ADOQ_sjz.Open;
for j:=0 to ADOQ_sjz.RecordCount-1 do
begin
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error] sjzlr.pas(118): Incompatible types: 'TStrings' and 'String'
ADOQ_sjz.Next;
end;
end;
你这里With do没什么用,你下面的程序试试
procedure Tsjxmzlr.Button1Click(Sender: TObject);
var
i:integer;
j:integer;
begin
ADOQ_sjz.Close;
ADOQ_sjz.SQL.Clear;
ADOQ_sjz.SQL.Text := 'select phid,sjmc from hymcb where lxmc=:lxmc';
ADOQ_sjz.Parameters.ParamByName('lxmc').Value := trim(cb_lx.Text);
ADOQ_sjz.Open;
for i:=0 to ADOQ_sjz.RecordCount-1 do
begin
SG_sjz.Cells[0,i] := ADOQ_sjz.fieldbyname('phid').AsString;
SG_sjz.Cells[1,i] := ADOQ_sjz.fieldbyname('sjmc').AsString;
ADOQ_sjz.Next;
end;
ADOQ_sjz.Close;
ADOQ_sjz.SQL.Clear;
ADOQ_sjz.SQL.Text := 'select sjd from sjb where bd=:bd';
ADOQ_sjz.Parameters.ParamByName('sjd').Value := trim(CBB_bd.Text);
ADOQ_sjz.Open;
for j:=0 to ADOQ_sjz.RecordCount-1 do
begin
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error] sjzlr.pas(118): Incompatible types: 'TStrings' and 'String'
ADOQ_sjz.Next;
end;
end;
也不行啊!
还是那个错误!
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error]
找到错误啦 应该是.ASSTRING; 你少打个S, 呵呵,不细心
提示说你的类型不对哦,你试一下把
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;
改成:
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').Value
不对,我都试了还是不行!
主要是写到这里ADOQ_sjz时后面的不弹出fieldbyname,所以后面也就没有Value和asstring了!为什么呢?
我的也不弹出,但是写下去就行 DELPHI对ADO的技术支持不太好.但是后面能弹出Value和asstring
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring
property Cols[Index: Integer]: TStrings;
两个类型不一致
可以了,是这里出错:SG_sjz.Cols[j]应该改为:SG_sjz.CELLs[j,0]这们就能运行,不过得来的界面不能输入数据,怎么办啊?我是想让用户在比较直观的界面上输入数据的!大家有怎么更好的办法吗?
比如: 1:30 2:00 2:30 3:00
项目一 20 30 20 30
项目二 20 30 10 30
项目三 20 50 10 20
项目四 54 30 90 10
在数据库中数据项目是一个字段,时间是一个字段,数据值是一个字段.
这种怎么做啊?
应该是.asstring;而不是.astring; 你再好好看看你的程序
现在我是从数据库中取出形成了这样的一张表,但不能录入数据!怎么办!意思是说上面的程序只能显示个空表了?各位高手帮帮忙!
你用的是TStringGrid吧,这个是不能接受输入的
你可以在OnDblClick事件中获取当前选中的Cell,然后弹出输入对话框接受用户输入,然后重写Cells[i,j]的值,最后提交数据库时自己通过程序控制SQL
要录入还是用DBGRID,
或者你另外再开一个EDIT的窗口,当用户点击STRINGGRID的一个单元格的时候,将单元格的值送到EDIT窗口中,在这个EDIT中修改,然后保存到数据库中,再回显.
procedure TForm15.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
stringgrid1.InstanceSize;
edit1.Text :=stringgrid1.Cells[acol,arow];
a:=acol;
b:=arow;
end;
回显操作:strtofloat(stringgrid1.Cells[a,b]):=edit1.text ; //a,b是全局变量.
呵呵,告诉你不能弹出fieldbyname是因为没有在fields editor里面加fields,TStringGrid吧,在options 里面把goediting true就行了。
procedure Tsjxmzlr.Button1Click(Sender: TObject);
var
i:integer;
j:integer;
begin
ADOQ_sjz.Close;
ADOQ_sjz.SQL.Clear;
ADOQ_sjz.SQL.Text := 'select phid,sjmc from hymcb where lxmc=:lxmc';
ADOQ_sjz.Parameters.ParamByName('lxmc').Value := trim(cb_lx.Text);
ADOQ_sjz.Open;
//这里,习惯问题
ADOQ_sjz。First;
for i:=0 to ADOQ_sjz.RecordCount-1 do
begin
SG_sjz.Cells[0,i] := ADOQ_sjz.fieldbyname('phid').AsString;
SG_sjz.Cells[1,i] := ADOQ_sjz.fieldbyname('sjmc').AsString;
ADOQ_sjz.Next;
end;
ADOQ_sjz.Close;
//这里要清楚参数****************************************************
Query1.Params.Clear;
ADOQ_sjz.SQL.Clear;
ADOQ_sjz.SQL.Text := 'select sjd from sjb where bd=:bd';
ADOQ_sjz.Parameters.ParamByName('sjd').Value := trim(CBB_bd.Text);
ADOQ_sjz.Open;
for j:=0 to ADOQ_sjz.RecordCount-1 do
begin
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error] sjzlr.pas(118): Incompatible types: 'TStrings' and 'String'
ADOQ_sjz.Next;
end;
end;
TString 类型,需要创建实例
SG_sjz.Cols[j].Add(ADOQ_sjz.fieldbyname('sjd').astring)
可DBGRID怎么实现这种表格形式录入呢?我是想用这种表格形式录入的!怎么办啊?有没有怎么控件直接支持这种呢?
如果像liu_yq(春风不语的)所说的那样做的话太麻烦了,这样用户输入上百条数据不是太麻烦!所以希望各位高手帮忙!
问题是你为什么一定要用STRINGGRID.而不用DBGRID.
我就是为了不编辑才用的STRINGGRID.
DbGrid有一定难度,不知道能实现不
像楼主这样用表格某字段的数据来做列的,不知道能否通过Grid自动更新
比如: 1:30 2:00 2:30 3:00
项目一 20 30 20 30
项目二 20 30 10 30
项目三 20 50 10 20
项目四 54 30 90 10
假设修改了第一个cell的数据,可能生成的SQL找不到1:30这个字段
我具体没试过这种方法,如果可行,就权当我上面说的是废话了,我也搬根凳子学习下
这种输入方式比较直观,就是因为我在一个软件里看到的,所以就想这样来做,若这些都不行的话,能不能用第三方控件来做呢?若能是哪种控件呢?大家有没有用过啊,有的话就告诉我啊??
将stringgrid的options里的goediting设成true就可以了。
对于不想让用户编辑的表格单元在StringGrid1SelectCell事件里
将canselect设成false
SG_sjz.Cols[0][j] := ADOQ_sjz.fieldbyname('sjd').AsString;//显示在第一列j行
非常感谢jsqth() 的教导!可以实现了我的想法!也谢谢大家的指导!