TZConnection
Bom dia galera delphi. Gostaria da ajuda de vocês sobre um erro de access violation quando encerro a aplicação. Se eu realizar o login normalmente pela tela de login e encerrar a aplicação o erro não acontece. O erro esta na classe unconexao no destructor quando executo um free no objeto FConexao :
unit unConexao;
interface
uses
SysUtils, Windows, ZConnection, ZDbcIntfs, ZSqlMonitor, Classes;
type
TConexao = class
private
FConexao : TZConnection;
FHostName : String;
FProtocol: String;
FDataBase: String;
FUser: String;
FPW: String;
FNameConn: String;
FRoleName: String;
FTransactIsolationLevel: TZTransactIsolationLevel;
FAutoCommit: Boolean;
class var FInstance: TConexao;
constructor CreatePrivate;
public
destructor Destroy; override;
constructor Create;
class function fnGetInstance: TConexao;
function fnConexao: Boolean;
property Conexao : TZConnection read FConexao write FConexao;
property Name : String read FNameConn write FNameConn;
property Protocol : String read FProtocol write FProtocol;
property DataBase : String read FDataBase write FDataBase;
property HostName : String read FDataBase write FDataBase;
property User : String read FUser write FUser;
property Password : String read FPW write FPW;
end;
implementation
{ TConexao }
constructor TConexao.Create;
begin
raise Exception.Create('Para obter uma instância de TConexao utilize TConexao.fnGetInstance!');
end;
constructor TConexao.CreatePrivate;
begin
inherited Create;
end;
function TConexao.fnConexao: Boolean;
begin
try
if Assigned(FConexao) then
begin
FConexao.Free;
FConexao := nil;
end;
FConexao := TZConnection.Create(nil);
FNameConn := 'sqlconn';
FProtocol := 'firebird-2.1';
FHostName := '192.168.1.1';
FUser := 'JORDY';
FPW := 'J3bz@s8!';
FDatabase := 'COB';
FConexao.Name := FNameConn;
FConexao.HostName := FHostName;
FConexao.Protocol := FProtocol;
FConexao.Database := FDataBase;
FConexao.User := FUser;
FConexao.Password := FPW;
Result := FConexao <> nil;
except
Result := False;
raise Exception.Create('Não foi possivel realizar a conexão!');
end;
end;
class function TConexao.fnGetInstance: TConexao;
begin
if not Assigned(FInstance) then
FInstance := TConexao.CreatePrivate;
Result := FInstance;
end;
destructor TConexao.Destroy;
begin
if Assigned(FConexao) then
begin
FConexao.Free;
FConexao := nil;
end;
inherited;
end;
end.
Valeu.
unit unConexao;
interface
uses
SysUtils, Windows, ZConnection, ZDbcIntfs, ZSqlMonitor, Classes;
type
TConexao = class
private
FConexao : TZConnection;
FHostName : String;
FProtocol: String;
FDataBase: String;
FUser: String;
FPW: String;
FNameConn: String;
FRoleName: String;
FTransactIsolationLevel: TZTransactIsolationLevel;
FAutoCommit: Boolean;
class var FInstance: TConexao;
constructor CreatePrivate;
public
destructor Destroy; override;
constructor Create;
class function fnGetInstance: TConexao;
function fnConexao: Boolean;
property Conexao : TZConnection read FConexao write FConexao;
property Name : String read FNameConn write FNameConn;
property Protocol : String read FProtocol write FProtocol;
property DataBase : String read FDataBase write FDataBase;
property HostName : String read FDataBase write FDataBase;
property User : String read FUser write FUser;
property Password : String read FPW write FPW;
end;
implementation
{ TConexao }
constructor TConexao.Create;
begin
raise Exception.Create('Para obter uma instância de TConexao utilize TConexao.fnGetInstance!');
end;
constructor TConexao.CreatePrivate;
begin
inherited Create;
end;
function TConexao.fnConexao: Boolean;
begin
try
if Assigned(FConexao) then
begin
FConexao.Free;
FConexao := nil;
end;
FConexao := TZConnection.Create(nil);
FNameConn := 'sqlconn';
FProtocol := 'firebird-2.1';
FHostName := '192.168.1.1';
FUser := 'JORDY';
FPW := 'J3bz@s8!';
FDatabase := 'COB';
FConexao.Name := FNameConn;
FConexao.HostName := FHostName;
FConexao.Protocol := FProtocol;
FConexao.Database := FDataBase;
FConexao.User := FUser;
FConexao.Password := FPW;
Result := FConexao <> nil;
except
Result := False;
raise Exception.Create('Não foi possivel realizar a conexão!');
end;
end;
class function TConexao.fnGetInstance: TConexao;
begin
if not Assigned(FInstance) then
FInstance := TConexao.CreatePrivate;
Result := FInstance;
end;
destructor TConexao.Destroy;
begin
if Assigned(FConexao) then
begin
FConexao.Free;
FConexao := nil;
end;
inherited;
end;
end.
Valeu.
Jordelino Santos
Curtidas 0
Respostas
Marco Salles
09/02/2011
então JORDELINO VIANA DOS SANTOS seu problema é interressante , ainda mais que vc usa uma Factory para instanciar os objetos desta classe. de mais detalhe e se resolveu conte-nos como
GOSTEI 0
José
09/02/2011
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0