我写了两个procedure,目的是想实现,在form打开时通过一个adoquery1查询一个表中所有记录,同时,把表中的一个字段赋给你个数组,然后把其中一个字段值传给另外一个adoqueryanswer,列出一些选项.选中一个选项再把选项值赋给另外一个数组,这样通过两个数组查询记录,就是类似于一个问卷调查系统.两个procedure代码如下:
var
Form1: TForm1;
arrayfield:array of string;
arrayvalue:array of Integer;procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
var strQuestID,strQuestValue :string ;begin with ADOQuery1 do
begin strQuestID := Fieldbyname('QuestID').asstring;
ADOQueryAnswer.SQL.Clear;
ADOQueryAnswer.SQL.Add('select * from QuestionAnswer where QuestID='+strQuestID);
ADOQueryAnswer.Open;
RadioGroup1.Items.Clear;
while not AdoQueryAnswer.Eof do
begin
strQuestValue:= ADOQueryAnswer.FieldByName('QuestValue').AsString;
RadioGroup1.Items.Add(strQuestValue);
AdoQueryAnswer.next;
end;
RadioGroup1.Items.Add('不选');
RadioGroup1.ItemIndex:= RadioGroup1.Items.Count-1;
Edit1.Text:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex];
endend;
procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
var i:Integer;
begin
ADOQuery1.Open;
SetLength(arrayfield,ADOQuery1.RecordCount);
SetLength(arrayvalue,ADOQuery1.RecordCount); for i := Low(arrayfield) to High(arrayfield) do
begin
while not Adoquery1.Eof do
begin
// arrayfield[i] := ADOQuery1.FieldValues['ErrorAttri'];
arrayvalue[i] := 0;
arrayfield[i] :=Adoquery1.FieldByName('ErrorAttri').AsString;
showmessage(arrayfield[i]);
ADoquery1.Next;
end;
end;end;
这两个procedure不同时用就没有错误,但是同时用系统报错ADOQueryAnswer:Cannot perform this operation on an open dataset.请指教
var
Form1: TForm1;
arrayfield:array of string;
arrayvalue:array of Integer;procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
var strQuestID,strQuestValue :string ;begin with ADOQuery1 do
begin strQuestID := Fieldbyname('QuestID').asstring;
ADOQueryAnswer.SQL.Clear;
ADOQueryAnswer.SQL.Add('select * from QuestionAnswer where QuestID='+strQuestID);
ADOQueryAnswer.Open;
RadioGroup1.Items.Clear;
while not AdoQueryAnswer.Eof do
begin
strQuestValue:= ADOQueryAnswer.FieldByName('QuestValue').AsString;
RadioGroup1.Items.Add(strQuestValue);
AdoQueryAnswer.next;
end;
RadioGroup1.Items.Add('不选');
RadioGroup1.ItemIndex:= RadioGroup1.Items.Count-1;
Edit1.Text:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex];
endend;
procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
var i:Integer;
begin
ADOQuery1.Open;
SetLength(arrayfield,ADOQuery1.RecordCount);
SetLength(arrayvalue,ADOQuery1.RecordCount); for i := Low(arrayfield) to High(arrayfield) do
begin
while not Adoquery1.Eof do
begin
// arrayfield[i] := ADOQuery1.FieldValues['ErrorAttri'];
arrayvalue[i] := 0;
arrayfield[i] :=Adoquery1.FieldByName('ErrorAttri').AsString;
showmessage(arrayfield[i]);
ADoquery1.Next;
end;
end;end;
这两个procedure不同时用就没有错误,但是同时用系统报错ADOQueryAnswer:Cannot perform this operation on an open dataset.请指教
var i:Integer;
begin
// ADOQuery1.Open;
试试
SetLength(arrayfield,ADOQuery1.RecordCount);
....
end;
var i:Integer;
begin
// ADOQuery1.Open;
.......AfterOpen以后,为何还要Open;?
ADOQueryAnswer.SQL.Clear;AdoQueryAnswer.First;//再加上这个
while not AdoQueryAnswer.Eof do使用的一般步骤:
Close;
SQL.Clear;
SQL.Add('select ...');
Open;
First;
while not Eof do
begin
...
Next;
end;