关于dephi中,自定义类无法解决的问题
在程序中用自定义的类,如下面Dictionary 类,定义一个变量时,创建Dictionary定义的变量时正确,但定义两个以上变量时出错,如最后一段程序中的dd及ddd。
nit edit;interfaceuses
  SysUtils, Classes, HTTPApp, DB, ADODB,Variants;
const
  maxFieldsNum = 30;
type  Dictionary =  class(TObject)
  private
    sKey: TStringList;
    sText:TStringList;
    function Get(theKey: string):string;
    procedure AddString(theKey:string; svalue: string);
  public
    constructor create(conn: TADOConnection; rs:TADOQuery; sql: String);
    destructor Destroy;override;
  End; {*Dicdionary*}
implementation{$R *.dfm}
///////////////////用户自定义函数与过程--begin///////////////////////////
////字符串分割函数///
function Split(Source, Deli: string ): TStringList; stdcall;
var
  EndOfCurrentString: byte;
  StringList:TStringList;
begin
  StringList:=TStringList.Create;
  while Pos(Deli, Source)>0 do
  begin
    EndOfCurrentString := Pos(Deli, Source);
    StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
    Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
  end;
  Result := StringList;
  StringList.Add(source);
end;///==============================
//----------建立Dicdionary对象函数-begin----------------
function Dictionary.Get(theKey: string):string;
var
  index: integer;
  sString:string;
begin
  result :=  '';
  sKey.Find(theKey,index); sString :=ToStr(skey[index]);
  result:=sText[index];
end;procedure Dictionary.AddString(theKey:string; svalue: string);
begin
  if (sKey=nil) or (sText=nil) then Begin sKey:=TStringList.Create; sText:=TStringList.Create; End;
  sKey.Add(theKey);   sText.Add(svalue);
end;
constructor Dictionary.Create(conn: TADOConnection; rs:TADOQuery; sql: String);
var
  odict:Dictionary;
Begin
{===========================================================
功能:根据sql建立dictionary对象
参数:sql=sql语句, conn=数据库连接对象,odict=返回的字典对象
说明:其中sql包含两个字段, 第一个为代码,第二个为说明信息
================建立字典对象===============================}
  inherited Create;
  isErr := False; ErrDescription := '';  //odict := Nil;  try
    openQuery(conn, rs, sql);
  Except
    on E:Exception  do begin
      isErr := True; ErrDescription := '数据连接错误!无法建立字典!<br> 错误:' + E.Message;
      rs.Close;  Exit;
    end;
  end;  rs.First;
  If (rs.BOF And rs.EOF) Then  Begin
    isErr := True; ErrDescription := '没有检索到字典需要的信息! 无法建立字典!';
    rs.Close; Exit;
  End;  While Not rs.EOF Do Begin
    try
      AddString(ToStr(rs.FieldValues[rs.FieldList.Fields[0].FullName]), ToStr(rs.FieldValues[rs.FieldList.Fields[1].FullName]));
    Except
      on E:Exception  do begin
        isErr := True; ErrDescription := '建立字典时出错!<br> 错误:' + E.Message;
        rs.Close;  Exit;
      end;
    end;
    rs.Next;
  End;  rs.Close;
End;destructor Dictionary.Destroy;
begin
    if skey <> nil then skey:=nil;
    if sText <> nil then sText:=nil;
    inherited Destroy;
end;//下面为在form中调用的部分
var
  dd: Dictionary;
  ddd: Dictionary;
begin
  ADOConnA.close;
  dns := '数据库连接字符串';
  connDB(ADOConnA, dns); //自定义连接数据库函数, 不存在问题  sql := 'SELECT  mzdm, mzmc FROM st_mzdm ORDER BY mzdm asc';
  dd.create(ADOConnA,ADOQryB,sql); //第一次建立dd正确  ddd.create(ADOConnA,ADOQryB,sql); //地二次建立ddd出错!!!!!!!!!
  ADOQryB.Close;
  ADOConnA.Close;
end;

解决方案 »

  1.   

    //感觉你的这面向对象用的很有意思,很不合理;代码角度来说两次都不正确,
     dd.create(ADOConnA,ADOQryB,sql); //第一次建立dd正确 
    ddd.create(ADOConnA,ADOQryB,sql); //地二次建立ddd出错!!!!!!!!! 
    改为
     dd:=Dictionary.Create(ADOConnA,ADOQryB,sql); 
    ddd:=Dictionary.Create(ADOConnA,ADOQryB,sql); 
      

  2.   

    什么是类?什么叫实例?
    var
        dd:   Dictionary;
        ddd:   Dictionary; 
    实例化了没阿?
      

  3.   

    晕倒~OP的基本语法啊
    dd.Create,这本来就是错误代码!!!
    用dd:=Dictionary.Create(ADOConnA,ADOQryB,sql);
      

  4.   

    //下面为在form中调用的部分 
    var 
        dd:   Dictionary; 
        ddd:   Dictionary; 
    begin 
        ADOConnA.close; 
        dns   :=   '数据库连接字符串'; 
        connDB(ADOConnA,   dns); //自定义连接数据库函数,   不存在问题     sql   :=   'SELECT     mzdm,   mzmc   FROM   st_mzdm   ORDER   BY   mzdm   asc'; 
        dd:=Dictionary.Create(ADOConnA,ADOQryB,sql);   //注意这两行
        ddd:=Dictionary.Create(ADOConnA,ADOQryB,sql);  //注意这两行
        ADOQryB.Close; 
        ADOConnA.Close; 
    end;我面向对像学的也不好,这样也不行吗?
    要不你就把Create的三个参数,改为这个类的属性,不通过这种方式传 试试行吗?