Acess Violation quando não implementa Create da Classe
Bom dia
Criei uma classe, com dois métodos públicos, quando utilizo as funções dessa classe, no fim da função da Acess Violation. Quebrei a cabeça com esse problema, a solução que encontrei foi criar uma variavel do tipo da classe é utilizar os metodos a partir dessa variavel. A classe ficou assim:
unit UClasse;
interface
type
TUClasse = class
public
function metodoA;
function metodoB;
end;
implementation
procedure TUClasse.metodoA();
begin
codigo;
codigo;
end; //Aqui no fim do método da Acess Violation
procedure TUClasse.metodoB();
begin
end;
porém se eu implementar o construtor
constructor TUClasse.Create();
begin
//vazio
end;
dai eu crio uma variavel e utilizo os métodos, sem problemas... alguém poderia me explicar o porque desse comportamento?
Criei uma classe, com dois métodos públicos, quando utilizo as funções dessa classe, no fim da função da Acess Violation. Quebrei a cabeça com esse problema, a solução que encontrei foi criar uma variavel do tipo da classe é utilizar os metodos a partir dessa variavel. A classe ficou assim:
unit UClasse;
interface
type
TUClasse = class
public
function metodoA;
function metodoB;
end;
implementation
procedure TUClasse.metodoA();
begin
codigo;
codigo;
end; //Aqui no fim do método da Acess Violation
procedure TUClasse.metodoB();
begin
end;
porém se eu implementar o construtor
constructor TUClasse.Create();
begin
//vazio
end;
dai eu crio uma variavel e utilizo os métodos, sem problemas... alguém poderia me explicar o porque desse comportamento?
Wijloc
Curtidas 0
Respostas
Marco Salles
03/02/2014
Mas o correto é acessar os métodos através de um Objeto ..
Declara
Objeto:TSuaClasse
Instancia
Obeto:=TSuaClasse.Create;
usa
Objeto.metodoA;
Objeto.MetodoB;
Destroe
Objeto.free;
Não esta certo fazer simplemete assim
metodoaA;
MetodoB;
Mesmo que em alguma situações possa funcionar , por se tratarem de métodos Estáticos , esta forma esta errada , salvo Métodos De Classe
[]sds
Declara
Objeto:TSuaClasse
Instancia
Obeto:=TSuaClasse.Create;
usa
Objeto.metodoA;
Objeto.MetodoB;
Destroe
Objeto.free;
Não esta certo fazer simplemete assim
metodoaA;
MetodoB;
Mesmo que em alguma situações possa funcionar , por se tratarem de métodos Estáticos , esta forma esta errada , salvo Métodos De Classe
[]sds
GOSTEI 0
Douglas
03/02/2014
Concordo com a sua reposta Marco.
GOSTEI 0
Thiago Irrazabal
03/02/2014
Mas o correto é acessar os métodos através de um Objeto ..
Declara
Objeto:TSuaClasse
Instancia
Obeto:=TSuaClasse.Create;
usa
Objeto.metodoA;
Objeto.MetodoB;
Destroe
Objeto.free;
Não esta certo fazer simplemete assim
metodoaA;
MetodoB;
Mesmo que em alguma situações possa funcionar , por se tratarem de métodos Estáticos , esta forma esta errada , salvo Métodos De Classe
[]sds
Declara
Objeto:TSuaClasse
Instancia
Obeto:=TSuaClasse.Create;
usa
Objeto.metodoA;
Objeto.MetodoB;
Destroe
Objeto.free;
Não esta certo fazer simplemete assim
metodoaA;
MetodoB;
Mesmo que em alguma situações possa funcionar , por se tratarem de métodos Estáticos , esta forma esta errada , salvo Métodos De Classe
[]sds
Usando with funcionaria, correto ?
with TSuaclasse.Create do
try
MetodoA;
MetodoB;
finally
Free;
end;
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Wijloc
03/02/2014
Consegui resolver o problema aqui, agradeço pelas respostas.
O que eu não estava entendendo era a questão de que minha classe não herdava de nenhuma outra, então por que chamar o create, mesmo com ele vazio?
A resposta para essa minha pergunta seria: "Todo classe herda de alguma classe e a classe da qual todas as outras herdam é a TObject, portanto é necessário usar sempre o "var := TClasse.Create();"
Tópico Resolvido
O que eu não estava entendendo era a questão de que minha classe não herdava de nenhuma outra, então por que chamar o create, mesmo com ele vazio?
A resposta para essa minha pergunta seria: "Todo classe herda de alguma classe e a classe da qual todas as outras herdam é a TObject, portanto é necessário usar sempre o "var := TClasse.Create();"
Tópico Resolvido
GOSTEI 0
Marco Salles
03/02/2014
Thiago Irrazabal o uzo do With tem que ser utilizado com alguma cautela . Existe catedráticos que não recomenda o uso do bloco . Um deles por exemplo é um Conterrâneo seu . O mukadavid
Vc esta certo em partes . Não é pelo simples fato de herdar da classe Base , mas como o método esta definido , como ele esta marcado , como ele esta decorado na classe base .
Se vc fizer um Destructor por exemplo , mesmo que vc não o deixe Vazio , ele não será executado . O Fato reside na diretiva Virtual /e/ou DyNamic que Decora esses mátodos na Clase Base .
No caso especifico do Create ele é estático e portanto ao definir um constructor na classe Filha ele sobrepõem o Create da classe Pai . Porém sua classe é simples e vc não precisa definir um contructor . ( no So seu Código Vc ate esta o deixando o Vázio) .O o Contructor definido na Clase Base estará disponivel
Geralmente se Implementa um Contructor quando se quer Inicializar /e/ou Instanciar Varíáveis , que são responsáveis pelo correto funcionamento interno da Mesma . Muitas das vezes para evitar Memory Leak devemos definir o Destructor e Condecora-lo com a Directiva OVerride , e na implementação deste método Liberamos os Recursos alocados para os Objetos da Classe
espero ter sido claro
[]sds
Consegui resolver o problema aqui, agradeço pelas respostas.
O que eu não estava entendendo era a questão de que minha classe não herdava de nenhuma outra, então por que chamar o create, mesmo com ele vazio?
A resposta para essa minha pergunta seria: "Todo classe herda de alguma classe e a classe da qual todas as outras herdam é a TObject, portanto é necessário usar sempre o "var := TClasse.Create();"
Tópico Resolvido
O que eu não estava entendendo era a questão de que minha classe não herdava de nenhuma outra, então por que chamar o create, mesmo com ele vazio?
A resposta para essa minha pergunta seria: "Todo classe herda de alguma classe e a classe da qual todas as outras herdam é a TObject, portanto é necessário usar sempre o "var := TClasse.Create();"
Tópico Resolvido
Vc esta certo em partes . Não é pelo simples fato de herdar da classe Base , mas como o método esta definido , como ele esta marcado , como ele esta decorado na classe base .
Se vc fizer um Destructor por exemplo , mesmo que vc não o deixe Vazio , ele não será executado . O Fato reside na diretiva Virtual /e/ou DyNamic que Decora esses mátodos na Clase Base .
No caso especifico do Create ele é estático e portanto ao definir um constructor na classe Filha ele sobrepõem o Create da classe Pai . Porém sua classe é simples e vc não precisa definir um contructor . ( no So seu Código Vc ate esta o deixando o Vázio) .O o Contructor definido na Clase Base estará disponivel
Geralmente se Implementa um Contructor quando se quer Inicializar /e/ou Instanciar Varíáveis , que são responsáveis pelo correto funcionamento interno da Mesma . Muitas das vezes para evitar Memory Leak devemos definir o Destructor e Condecora-lo com a Directiva OVerride , e na implementação deste método Liberamos os Recursos alocados para os Objetos da Classe
espero ter sido claro
[]sds
GOSTEI 0
Wijloc
03/02/2014
Ótimo, obrigado pelas respostas, foi bem completo.
GOSTEI 0
Deivison Melo
03/02/2014
Finalizando tópico!!
GOSTEI 0