关于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;
在程序中用自定义的类,如下面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;
dd.create(ADOConnA,ADOQryB,sql); //第一次建立dd正确
ddd.create(ADOConnA,ADOQryB,sql); //地二次建立ddd出错!!!!!!!!!
改为
dd:=Dictionary.Create(ADOConnA,ADOQryB,sql);
ddd:=Dictionary.Create(ADOConnA,ADOQryB,sql);
var
dd: Dictionary;
ddd: Dictionary;
实例化了没阿?
dd.Create,这本来就是错误代码!!!
用dd:=Dictionary.Create(ADOConnA,ADOQryB,sql);
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的三个参数,改为这个类的属性,不通过这种方式传 试试行吗?