我想从库中的数据表导到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;
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;
解决方案 »
- 高分解决我的问题(可能死锁造成),欢迎讨论,讨论效果好再加分!
- Delphi5_ADO_MTS_COM_design电子书
- 如何遍历我制定目录下的所有文件名(我想得到所有的文件名,然后通过一定的条件,删除我不要的文件。)
- 菜鸟 的 疑惑
- 在Win2000Server下建了一个NT型dcom服务程序,我怎样可以在客户端通过匿名的方式来访问它呢.
- ADO 转换问题
- WinSight32里面的字体实在是太难看,有没有办法改字体?
- 为什么我报表时的PageFooter显示不出来?
- 为什么AdoTable.Locate('Oper_Name',Edit1.Text,[loCaseInsensitive]) 有时候出错,有时候不出错?
- 如何使Memo摆脱64k的限制,不要RichEdit,最后40分了
- 为什么我的日期判断得不到想要的结果
- ccrun(老妖)(www.ccrun.com)进来一下
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;
改成:
SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').Value
比如: 1:30 2:00 2:30 3:00
项目一 20 30 20 30
项目二 20 30 10 30
项目三 20 50 10 20
项目四 54 30 90 10
在数据库中数据项目是一个字段,时间是一个字段,数据值是一个字段.
这种怎么做啊?
或者你另外再开一个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是全局变量.
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;
我就是为了不编辑才用的STRINGGRID.
项目一 20 30 20 30
项目二 20 30 10 30
项目三 20 50 10 20
项目四 54 30 90 10假设修改了第一个cell的数据,可能生成的SQL找不到1:30这个字段
我具体没试过这种方法,如果可行,就权当我上面说的是废话了,我也搬根凳子学习下
对于不想让用户编辑的表格单元在StringGrid1SelectCell事件里
将canselect设成false