帮我看看这段代码

toolscool 2002-09-14 04:23:32
var
S: string ; //--保存从表中读出的值
text:string;
lbl:^tlabel;
begin
text:=dbcombobox1.Text ;

//-------------------读问题列表的值---------------
while not adoquery1.Eof do
begin
with adoquery1 do
begin
close;
sql.Clear ;
sql.Text:= 'select ques from quest where name='''+text+'''';
open;
end;
s:=adoquery1.fieldbyname('ques').Value ;
showmessage(s);

//----------------动态生成控件-----------------
lbl:=allocmem(sizeof(Tlabel));
lbl^:=Tlabel.create(self);
with lbl^ do
begin
parent:=controlbar1;
caption:=s;
font.Name :='楷体-gb2312';
font.Size :=11;
// font.Style.fsbold;
end; }

//-----------------读下一条记录-----------------
adoquery1.Next ;
end;

end;
我要的是这样的结果:即从一个表中一条一条读出某个符合条件的值,读出一条记录动态生成一个控件,直到把所有符合条件的值读出并生成相应的控件,控件数是不确定的,视符合条件的记录数而定。先谢过!
...全文
69 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huhu123456789 2002-09-14
  • 打赏
  • 举报
回复
var
S: string ; //--保存从表中读出的值
text:string;
lbl:^tlabel;
begin
text:=dbcombobox1.Text ;

//-------------------读问题列表的值---------------
while not adoquery1.Eof do
begin
with adoquery1 do
begin
close;
sql.Clear ;
sql.Text:= 'select ques from quest where name='+text+';
open;
end;
s:=adoquery1.fieldbyname('ques').Value ;
showmessage(s);

//----------------动态生成控件-----------------
lbl:=allocmem(sizeof(Tlabel));
lbl^:=Tlabel.create(self);
with lbl^ do
begin
parent:=controlbar1;
caption:=s;
font.Name :='楷体-gb2312';
font.Size :=11;
// font.Style.fsbold;
end; }

//-----------------读下一条记录-----------------
adoquery1.Next ;
end;

end;
试一下啊!!!!
思维方法有问题啊!
`
王集鹄 2002-09-14
  • 打赏
  • 举报
回复
//大小写要和系统保持一致,否则当用其他语言时将会有麻烦
var
I: Integer; //只用一次的数据没有必要在声明变量
begin
I := 0;
with ADOQuery1 do begin
SQL.Text := Format('select ques from quest where name=%s', //不要用''''+X+''''有漏洞
[QuotedStr(DBComboBox1.Field.AsString)]); //直接操作SQL.Text没有必要SQL.Clear;
Open;
while not Eof do begin
with TLabel.Create(Self) do begin
Parent := Self; //ControlBar1;
Font.Name := '楷体-gb2312';
Font.Size := 11;
Caption := FieldByName('ques').Value;
Left := I;
I := I + Width + 4;
end;
Next;
end;
Close; //之后关闭
end;
end;
toolscool 2002-09-14
  • 打赏
  • 举报
回复
我照你的代码测试了,能找到第一条符合条件的值,但出错
提示:invalid variant type conversion
去掉循环则运行正常
hansonboy 2002-09-14
  • 打赏
  • 举报
回复
with adoquery1 do
begin
close;
sql.Clear ;
sql.Text:= 'select ques from quest where name='''+text+'''';
open;
end;
var
S: string ; //--保存从表中读出的值
text:string;
lbl:^tlabel;
begin
text:=dbcombobox1.Text ;

//-------------------读问题列表的值---------------
while not adoquery1.Eof do
begin
s:=adoquery1.fieldbyname('ques').Value ;
showmessage(s);

//----------------动态生成控件-----------------
lbl:=allocmem(sizeof(Tlabel));
lbl^:=Tlabel.create(self);
with lbl^ do
begin
parent:=controlbar1;
caption:=s;
font.Name :='楷体-gb2312';
font.Size :=11;
// font.Style.fsbold;
end; }

//-----------------读下一条记录-----------------
adoquery1.Next ;
end;

end;



还有label显示的位置要设否则你建立了一些label,但只能显示到一个,知道是什么原因了吧?
xxyzjf 2002-09-14
  • 打赏
  • 举报
回复
很好,你说循环没有执行.是因位你将ADOQUERY的SQL重新给值.
记住,先设置SQL,再循环,否则,你得到你是一个,而非多个TABLE.
xxyzjf 2002-09-14
  • 打赏
  • 举报
回复
如果没有说错的话,你能只可以看到一个TABLE或者你的TABLE.CAPTION是是一样的.
xxyzjf 2002-09-14
  • 打赏
  • 举报
回复
我想你的错误是逻辑的,应该先设置ADOQUER.SQL,然后OPEN.再FIRST adn then next the source .
var
S: string ; //--保存从表中读出的值
text:string;
lbl:^tlabel;
begin
text:=dbcombobox1.Text ;
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add(''select ques from quest where name='''+text+'''');
open;
first;
while not adoquery.eof do
begin
s:=adoquery1.fieldbyname('ques').Value ;
showmessage(s);

//----------------动态生成控件-----------------
lbl:=allocmem(sizeof(Tlabel));
lbl^:=Tlabel.create(self);
with lbl^ do
begin
parent:=controlbar1;
caption:=s;
font.Name :='楷体-gb2312';
font.Size :=11;
end;
end;
end;
end;
toolscool 2002-09-14
  • 打赏
  • 举报
回复
循环中的语句好象没有执行 showmessage('text'), 都没有显示
sunny518 2002-09-14
  • 打赏
  • 举报
回复
不错啊 出了什么问题啊
fwwxxjingling 2002-09-14
  • 打赏
  • 举报
回复
关注一下!!

5,943

社区成员

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

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