有两个疑问:
1.比如我想在datamodule中创建10个query控件,是还是需要先在把这10个query都先定义,如:
query1:Tquery
...........
...........
query10:Tquery;如果可以不用先定义,那么如何来创建呢?
2.如果第1个问题可以不用先预定义,那么如何将Tdatasource的dataset动态的从1中用过来???谢谢.
1.比如我想在datamodule中创建10个query控件,是还是需要先在把这10个query都先定义,如:
query1:Tquery
...........
...........
query10:Tquery;如果可以不用先定义,那么如何来创建呢?
2.如果第1个问题可以不用先预定义,那么如何将Tdatasource的dataset动态的从1中用过来???谢谢.
Query:array[1..10] of TQuery;
for i:=1 to 10 do//初始化
begin
Query[i]:=TQuery.Create;
//这里进行其他属性的设置
end;DataSource1.DataSet:=Query[x];
for i:=1 to 10 do//不用时要释放
begin
if Assigned(Query[i]) then
Query[i].Free;
end;
TQuery.Create创建实例,分配存储
var
QueryList: TStringList; QueryList := TStringList.Create;
//创建
QueryList.AddObject('QueryName1', TQuery.Create);
QueryList.AddObject('QueryName2', TQuery.Create);
QueryList.AddObject('QueryName3', TQuery.Create); //引用
Query := QueryList.Objects[QueryList.IndexOfName('QueryName3')];
Query.Active := False;
Query.SQL.Text := ''; //SQL语句
Query.Active := True; //不能的时候使用如下代码释放掉
for i := QueryList.Count - 1 downto 0 do begin
with TQuery(QueryList.Objects[i]) do begin
if Active then Active := False;
Free;
end;
end;
FreeAndNil(QueryList);
因为我需要的query和clientdataset是相对应关联的.我想将他们写成一个简单的过程.比如我想使用一个的时候,就创建一个,不用时就释放掉.传递参数仅为query\clientdataset的名称,以及SQL语句这三个参数就行了.
参实现吗?
比如:
createquery('query_Stu','cds_Stu','select * from student')
定义函数在函数中:
procedure CreateQuery(qu_name, ds_name, strSQL: string);
var
i: integer;
qu: TQuery;
ds: TClientDataSet;
begin
if slQu.IndexOfName(qu_name) < 0 then
begin
qu := slQu.Objects[slQu.IndexOfName(qu_name)];
qu.SQL.Text := strSQL;
qu.....
ds := slDs......
end
else
begin
qu := TQuery.Create;
qu......
slQu.AddObject(qu_name, qu); ds := TClientDataSet.Create....
end;
end;
if slQu.IndexOfName(qu_name) < 0 then
应该是
if slQu.IndexOfName(qu_name) >= 0 then
你說Query就是一个局部变量,在你需要引用的过程中定义即可。Query:TADOQuery;
可是,Query是TADOQuery
QueryList.Objects[QueryList.IndexOfName('QueryName3')]是TObject類型
兩個類型根本就不符,不能賦值;
另外,如果按以下操作:
Query:TObject;
Query:=QueryList.Objects[QueryList.IndexOfName('QueryName3')];
的話,再現另外一個問題:
Query沒有Active,SQL.Text等屬性,那是TADOQuery的屬性
Query := TADOQuery(QueryList.Objects[QueryList.IndexOfName('Query3')]);
多謝你的提醒,不過
Query := TADOQuery(QueryList.Objects[QueryList.IndexOfName('Query3')]);
這樣應用會出錯的
應將其改為
Query := TADOQuery(QueryList.Objects[QueryList.IndexOf('Query3')]);
並且在應用前,應設置其Connection屬性.