Access Violation lors de l'initialisation d'un entier

Résolu
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009 - 31 mai 2007 à 13:55
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 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.

2 réponses

obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
31 mai 2007 à 15:33
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!!!
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
31 mai 2007 à 15:44
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)
0
Rejoignez-nous