Access Violation lors de l'initialisation d'un entier [Résolu]

obitskater 45 Messages postés lundi 29 janvier 2007Date d'inscription 13 mars 2009 Dernière intervention - 31 mai 2007 à 13:55 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 31 mai 2007 à 15:44
Bonjour à vous.

Et voilà encore un problème dans mon code objet.

J'ai donc créé une classe listeVerbes avec des variables privées et des procédures publiques comme ceci:

unit ClasseListeVerbes;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, ValEdit, StdCtrls, Buttons, ExtCtrls, jpeg, ClasseVerbe;

type
  Liste = class(TObject)
 
private
    nbVerbes : integer;
    TabVerbes: array[1..1000] of Verbe;

  public
    constructor createListe();
    procedure initListe ();

  end;

Jusque là pas de problème tout marche niquel, maintenant dans l'implementation:

implementation

constructor Liste.createListe();
begin
nbVerbes:=0;
end;

procedure Liste.initListe();
var
aVerbe: verbe;
VerbesFile : string;
ListeTemp: TStringList;
i:integer;

begin

//Chargement du fichier verbes.txt*******************
VerbesFile:=ExtractFilePath(Application.ExeName)+'verbes.txt';
ListeTemp:=tstringlist.create;
if fileExists(VerbesFile) then
  begin
  ListeTemp.LoadFromFile(VerbesFile);
  end
else
begin
  messagedlg('Le fichier verbes.txt est manquant, le programme doit fermer.', mtError, [mbOk],0);
  Application.terminate;
end;
//**************************************************

//nbVerbes:=0;

for i:=0 to ListeTemp.Count do
begin
  aVerbe.Create;
  nbVerbes:=nbVerbes+1;
  aVerbe.init(ListeTemp.Strings[i]);
end;

end;

end.

Lorsque je compile (Ctrl+ F9) il n'y a pas de problème, il ne m'indique aucune erreur.
Mais lorsque j'execute le programme il me met comme message d'erreur: "Access Violation at adress..." patati patata, et me renvoie en surlignant en bleu la ligne dans le constructeur nbVerbes:=0; (que j'ai mis en rouge)

Pour indication dans mon unit principale j'ai une variable de type ListeVerbes, avec laquelle j'appelle le constructeur et la procédure initListe(). Biensur dans le uses j'ai bien mis ma fiche ClasseListeVerbes.
Mais comme je l'ai dis la compilation ne me renvoie aucune erreur.

Alors si vous avez une idée d'où vient le problème je suis preneur.
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
obitskater 45 Messages postés lundi 29 janvier 2007Date d'inscription 13 mars 2009 Dernière intervention - 31 mai 2007 à 15:33
3
Merci
Et voilà comment passer 3 heures sur un problème à la c..n.

J'ai résolu mon problème et j'indique là où je m'étais trompé au cas où certains recontreront le même problème.

Dans mon unit principal lorsque j'appelais le "creator" je faisais comme ça:

var
ListeVerbe: Liste;

begin
ListeVerbe.createListe;

alors qu'il fallait faire comme ça:

ListeVerbe:=Liste.createListe;

Tout bête.... Honte sur moi!!!

Merci obitskater 3

codes-sources a aidé 81 internautes ce mois-ci

Commenter la réponse de obitskater
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 31 mai 2007 à 15:44
0
Merci
houlala ...

premierement : on est pas en C++, les parenthese sans arguments ne servent a rien!
procedure Truc(); <<<< Incorrect!
procedure Truc; <<<< Correct!

deuxiement : on ne lie jamais des données abstraite a une classe!
VerbesFile:=ExtractFilePath(Application.ExeName)+'verbes.txt'; <<<< incorrect!

function TVerbList.InitList(const FileName : string) : boolean;
begin
  result := FileExists(FileName);
  if result then
  begin
    with TStringList.Create do
    try
      LoadFromFile(FileName);
      ...
    finally
      Free;
    end;
  end else
  begin
    ... message d'erreur ...
  end;
end;
   

Troisiemement : tout ce qui est construit doit etre detruit!
quand tu  crée un objet (objet.Create) tu doit le libéré a la fin ou quand il ne sert plus (objet.Free)

Voici un exemple de mise en oeuvre pour ton probleme :

unit ClVerb;

interface

uses Windows, SysUtils, Classes;

type
  // Facultatif
  // TVerbClass = class of TVerb;

  TVerb = class(TObject) // a faire
  private
  public
  end;

  TVerbList = class(TList)
  private
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
    function GetItem(Index: Integer): TVerb;
    procedure SetItem(Index: Integer; AVerb: TVerb);
  public
    constructor Create; overload;
    function InitList(const FileName : string) : boolean;
    function Add(AVerb: TVerb): Integer;
    function AddNew : Integer;
    function IndexOf(AVerb: TVerb): Integer;
    procedure Insert(Index: Integer; AVerb: TVerb);
    function First: TVerb;
    function Last: TVerb;
    property Items[Index: Integer]: TVerb read GetItem write SetItem; default;
  end;

implementation

{ TVerb }

// en attente d'implementation

{ TVerbList }

function TVerbList.Add(AVerb: TVerb): Integer;
begin
  Result := inherited Add(AVerb);
end;

function TVerbList.AddNew : Integer;
begin
  result := Add(TVerb.Create);
end;

constructor TVerbList.Create;
begin
  inherited Create;
end;

function TVerbList.InitList(const FileName : string) : boolean;
var I : integer;
    V : TVerb;
begin
  result := FileExists(FileName);
  if result then
  begin
    with TStringList.Create do
    try
      LoadFromFile(FileName);
      Self.Clear;
      for I := 0 to Count-1 do
      begin
        V := TVerb.Create;
        V.Init(Strings[I]);
        Self.Add(V);
      end;
    finally
      Free;
    end;
  end else
  begin
    // ... message d'erreur ...
  end;
end;

function TVerbList.First: TVerb;
begin
  Result := TVerb(inherited First);
end;

function TVerbList.GetItem(Index: Integer): TVerb;
begin
  Result := inherited Items[Index];
end;

function TVerbList.IndexOf(AVerb: TVerb): Integer;
begin
  Result := inherited IndexOf(AVerb);
end;

procedure TVerbList.Insert(Index: Integer; AVerb: TVerb);
begin
  inherited Insert(Index, AVerb);
end;

function TVerbList.Last: TVerb;
begin
  Result := TVerb(inherited Last);
end;

procedure TVerbList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Action = lnDeleted then
     TVerb(Ptr).Free;
  inherited Notify(Ptr, Action);
end;

procedure TVerbList.SetItem(Index: Integer; AVerb: TVerb);
begin
  inherited Items[Index] := AVerb;
end;

end.

<hr size="2" width="100%" />Croc (click me)
Commenter la réponse de f0xi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.