Réponse acceptée !
Je te laisse deviner où est ton erreur :
Function effacerentete(tex:TStringList;nl:integer):TStringList;
var premiercar,temp:string;
i,j,nbre,err:integer;
F:TStringList;
begin
F:=TstringList.Create;
j:=1;
for i:=1 to nl do
begin
temp:=tex[i];
premiercar:=copy(temp,1,1);
Val(premiercar,nbre,err);
if (err=0) then //si premier caractere est un nomnbre
begin
F[j]:=Tex[i]; //rempli le TstrinList F avec les lignes correspondantes
j:=j+1;
end;
end;
Result:=F; //renvoie F comme resultat
F.Freeend;
Si tu libères l'objet retourné, comment veux-tu pouvoir y accéder ensuite si la référence tex est nulle ???
Ce genre de programmation est à proscrire et il faut revenir aux fondamentaux : c'est à l'appelant de détruire les objets qu'il crée et non à l'appelé. Sinon, quand le code devient un tant soit peu complexe, on se fait vite avoir.
Je te propose une autre forme, cette fois sans risque :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
SpeedButton1: TSpeedButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
tex: TstringList;
a: integer;
FileName: TFileName;
procedure EffacerEntete(Tex: TStringList; nl: integer);
var
i: integer;
F: TStringList;
begin
if nl < 0 then
exit;
F := TstringList.Create;
try
for i := 1 to nl do
if length(Tex[i]) > 0 then
begin
if Tex[i][1] in ['0'..'9'] then
F.Append(Tex[i]);
end;
Tex.Assign(F);
finally
F.Free
end; {try..finally}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
a := tex.Count; //determine le nombre de lignes
effacerentete(tex, a);
//efface les lignes commençant par autre chose que des chiffres
Label1.Caption := tex[1]; //affiche la premiere ligne (verification)
///////////////// tex.Free NON, non et non !end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
///////////////// tex := TstringList.Create; // NON !!! if OpenDialog1.Execute then
begin
fileName := OpenDialog1.FileName;
Edit1.Text := filename;
tex.LoadFromFile(filename); //rempli tex
Label1.Caption := tex[1]
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Tex := TStringList.Create
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Tex.Free;
end;
end.
Tu remarqueras certains commentaires destinés à attirer ton attention sur les risques que tu prends en instanciant un TStringList dans button1click et en le libérant dans speedbutton1click. Il est préférable, vu que ce composant n'a pas de propriétaire, de s'assurer qu'il sera libéré dans tous les cas de figure. Ici, le composant Tex est intsnacié dans le OnCreate de la fiche et libéré dans le OnClose.
May Delphi be with you !
Pensez à cliquer sur
Réponse acceptée lorsque la réponse vous convient.