Fórum Acess Violation quando não implementa Create da Classe #468649

03/02/2014

0

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?
Wijloc

Wijloc

Responder

Posts

03/02/2014

Marco Salles

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
Responder

Gostei + 0

03/02/2014

Douglas

Concordo com a sua reposta Marco.
Responder

Gostei + 0

03/02/2014

Thiago Irrazabal

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


Usando with funcionaria, correto ?

with TSuaclasse.Create do
  try
    MetodoA;
    MetodoB;
  finally
    Free;
  end;




Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

03/02/2014

Wijloc

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
Responder

Gostei + 0

03/02/2014

Marco Salles

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


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


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
Responder

Gostei + 0

04/02/2014

Wijloc

Ótimo, obrigado pelas respostas, foi bem completo.
Responder

Gostei + 0

04/02/2014

Deivison Melo

Finalizando tópico!!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar