obitskater
Messages postés45Date d'inscriptionlundi 29 janvier 2007StatutMembreDernière intervention13 mars 2009
-
31 mai 2007 à 13:55
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 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:
//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.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202234 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;