是这样的, 我写了一个执行存储过程的类继承TADOStoredProc, 存储过程是有很多输入参数的嘛, 这些参数的读写是通过Index的方式的, 比如 
  TMyStoredProc.Params[Index] = Value, 问题来了, Index一般都是1, 5, 6, 9这样没有意义的数字, 现在我的想法是用枚举来做Index, 比如
  Type Param = (Name, Age, Height);
那我这可以这么用
  TMyStoredProc.Params[Name] = Value 当然Params的Write Procedure的签名就变了
  由SetParams(I: Inetger; V: Variant) -> SetParams(I: Param; V: Variant)这样显然就不能把俺写的类做成一个通用的类了, 因为每个具体存储过程实现我都需要定义一个不同的枚举!有木有同学给个方案! 分不多, 100送上!谢谢
M.

解决方案 »

  1.   

    var
      p: Param;
      id: Integer;
    begin
      id := Ord(Param);
    end;
      

  2.   


    // 不知是不是要表达这个意思type
      Param = (Name, Age, Height, Width); // 可以随意定义这个枚举
    var
      p: TParameter;
      stored: TMyStoredProc;
    begin
      stored := TMyStoredProc.Create(nil);
      p := stored.Parameters.AddParameter;
      p.Name := 'Name';
      p.Value := '阿扁';  p := stored.Parameters.AddParameter;
      p.Name := 'Age';
      p.Value := '50';  p := stored.Parameters.AddParameter;
      p.Name := 'Height';
      p.Value := '100cm';  p := stored.Parameters.AddParameter;
      p.Name := 'Width';
      p.Value := '10000kg';  // 通过参数名来访问参数值
      ShowMessage(stored.Parameters.ParamByName('Name').Value);
      ShowMessage(stored.Parameters.ParamByName('Age').Value);
      ShowMessage(stored.Parameters.ParamByName('Height').Value);
      ShowMessage(stored.Parameters.ParamByName('Height').Value);  stored.Free;
    end;
      

  3.   

    如果是上面说的意思,实际没必要定义这个枚举,直接通过参数name来索引参数
      

  4.   

    TADOStoredProc参数赋值方法本来就有 ParamsByName的方法,完全可以用参数名。
      

  5.   

    谢谢你的提议,枚举的好处是可读性强,而且不会拼错,pass by name的话就缺了这些优点
      

  6.   

    这还是没有解决我说的每个存储过程都得根据枚举类型的不同特殊出每个子类, 我的想法是delphi能不能做成C++模板这样的做法(大概这意思,假如C++也有Ord)
    template<class T>
    SetParams(T param, Varaint v){
      this->Parameters[Ord(T)] = v;
    }
    这样的化特殊化就由编译器来做, 不用我每遇到一个新的存储过程定义不同的枚举就要写一个子类
      

  7.   

    自己继承扩展TParameter,d2009及以上版本支持泛型
      

  8.   

    这还是没有解决我说的每个存储过程都得根据枚举类型的不同特殊出每个子类, 我的想法是delphi能不能做成C++模板这样的做法(大概这意思,假如C++也有Ord)
    template<class T>
    SetParams(T param, Varaint v){
      this->Parameters[Ord(T)] = v;
    }
    这样的化特殊化就由编译器来做, 不用我每遇到一个新的存储过程定义不同的枚举就要写一个子类泛型,D2009+
      

  9.   

    Thanks!我用的IDE是老版本的, 不支持泛型, 新版的IDE太贵了. 我决定关贴了. 也许我这样做真的不好.M.