Fórum Acess Violation quando não implementa Create da Classe #468649
03/02/2014
0
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
Curtir tópico
+ 0Posts
03/02/2014
Marco Salles
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
03/02/2014
Douglas
Gostei + 0
03/02/2014
Thiago Irrazabal
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
03/02/2014
Wijloc
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
03/02/2014
Marco Salles
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
04/02/2014
Wijloc
Gostei + 0
04/02/2014
Deivison Melo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)