有两个疑问:
1.比如我想在datamodule中创建10个query控件,是还是需要先在把这10个query都先定义,如:
query1:Tquery
...........
...........
query10:Tquery;如果可以不用先定义,那么如何来创建呢?
2.如果第1个问题可以不用先预定义,那么如何将Tdatasource的dataset动态的从1中用过来???谢谢.

解决方案 »

  1.   

    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;
      

  2.   

    query变量需要类型定义,
    TQuery.Create创建实例,分配存储
      

  3.   

    谢谢stherix ;如果不是query1-query10,而是表达程序员自己可以意思的query名称的时候怎么办?????neweipeng :参不参讲详细一点,比如举例子什么的.
      

  4.   

    可以使用StringList
    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);
      

  5.   

    谢谢楼上的朋友的指点.我的想法是这样的
    因为我需要的query和clientdataset是相对应关联的.我想将他们写成一个简单的过程.比如我想使用一个的时候,就创建一个,不用时就释放掉.传递参数仅为query\clientdataset的名称,以及SQL语句这三个参数就行了.
    参实现吗?
    比如:
    createquery('query_Stu','cds_Stu','select * from student')
      

  6.   

    使用chris_mao 的方法仍然可以呀。不过需要改一改。我觉得可以这样:定义两个 StringList:slQu, slDs,并在Form1.FormCreate中创建。
    定义函数在函数中:
    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;
      

  7.   

    晕,打错了,上面的
    if   slQu.IndexOfName(qu_name)   <   0   then 
    应该是
    if   slQu.IndexOfName(qu_name)   >=   0   then 
      

  8.   

    晕哦,QueryList.AddObject('QueryName1', TQuery.Create);调试没有通过参数不够.
      

  9.   

    QueryList.AddObject('QueryName1', TQuery.Create(Nil));
      

  10.   

    不好意思,我在五楼里忘了给TADOQuery.Create加参数 
      

  11.   

    chris_mao :请问您代码中的Query 是哪儿来的呀?
      

  12.   

    Query就是一个局部变量,在你需要引用的过程中定义即可。Query:TADOQuery;
      

  13.   

    chris_mao   : 
       你說Query就是一个局部变量,在你需要引用的过程中定义即可。Query:TADOQuery;
    可是,Query是TADOQuery
         QueryList.Objects[QueryList.IndexOfName('QueryName3')]是TObject類型
    兩個類型根本就不符,不能賦值;
       另外,如果按以下操作:
       Query:TObject;
       Query:=QueryList.Objects[QueryList.IndexOfName('QueryName3')];
       的話,再現另外一個問題:
       Query沒有Active,SQL.Text等屬性,那是TADOQuery的屬性
      

  14.   

    做一次类型转换就可以了呀;
    Query := TADOQuery(QueryList.Objects[QueryList.IndexOfName('Query3')]);
      

  15.   

    chris_mao :
    多謝你的提醒,不過
    Query := TADOQuery(QueryList.Objects[QueryList.IndexOfName('Query3')]);
    這樣應用會出錯的
    應將其改為
    Query := TADOQuery(QueryList.Objects[QueryList.IndexOf('Query3')]);
    並且在應用前,應設置其Connection屬性.