Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : TStringList erreur [ Divers / Débutant(e) ] (ronoobresil)

samedi 12 avril 2008 à 03:18:21 | TStringList erreur

ronoobresil

Bonjour,

Je suis débutant sous Delphi...Ça fait pas mal de temps que j'avais pas fait de programmation
Et, bien évidemment comme tout bon débutant, j'ai un problème que je n'arrive pas à résoudre depuis quelques jours...J'ai pas mal cherché dans l'aide, sur le net, mais je commence à être à court d'idées...
J'espere que ma difficulté vous sautera aux yeux.
Je cherche à developper une petite application, sans prétention, pour ouvrir un fichier texte, stocker ses valeurs et les modifier, (puis plus tard sauver dans un autre fichier)

type
  TForm1 = class (TForm)
    Label1: TLabel;
    SpeedButton1: TSpeedButton;
    Edit1: TEdit;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure SpeedButton1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tex:TstringList;
  filename,filepath : string;
  a:integer;
  b:string;

implementation

{$R *.dfm}

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.Free
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
     tex:=TstringList.Create;  // initialise tex
     with OpenDialog1 do
        begin
        if Execute then
          begin
          fileName := OpenDialog1.FileName;
          Edit1.Text:=filename;
          tex.LoadFromFile(filename); //rempli tex
          Label1.Caption:=tex[1]  //affiche la premiere ligne pour verifier le contenu
          end;
        end;
    end;

procedure TForm1.Button1Click(Sender: TObject);
begin
a:=tex.Count;   //determine le nombre de lignes
tex:=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  //libere tex
end;

end.

Deux choses:-tout marche jusqu'à tex:=effacerentete(tex,a); ...La ça coince... Il n'a pas l'air de rentrer dans la focntion, plante avant.
                     -si je place
STR(a,b);
Label1.Caption:=b;
avant l'appel de la fonction effacerentete Label1n'affiche pas la valeur de b (meme si je mets un sleep(2000) juste après. Mais l'affiche si je supprime l'appel de la focntion...

Je suppose que c'est la même cause.. Merci pour tout,


samedi 12 avril 2008 à 10:02:16 | Re : TStringList erreur

Delphiprog

Administrateur CodeS-SourceS
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.Free
end;

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.

samedi 12 avril 2008 à 10:04:08 | Re : TStringList erreur

Delphiprog

Administrateur CodeS-SourceS
Réponse acceptée !
J'ai oublié de préciser que l'emploi de :
if Tex[i][1] in ['0'..'9'] then
          F.Append(Tex[i]);
est surement moins coûteux en temps de traitement que l'emploi de la fonction VAL.

Bonne journé et  May Delphi be with you !

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

samedi 12 avril 2008 à 10:11:02 | Re : TStringList erreur

schnawd

Réponse acceptée !
Bonjour,

Serrait-il possible de savoir la tête que ton fichier aura, et ce que tu veux récupérer dedant.

Sinon pour sauver plus tard les données dans un autre fichier, si l'application se ferme, alors tu perds tout, Donc ans ce cas là tu dois l'enregistrer dans un fichier temporaire, puis le recharger à chaque redémarrage de l'appli.

Sinon au lieu d'utiliser un label, utilise un memo que tu mets en read-only, car si j'ai bien compris b est de type TStringList, donc tu peux te débrouiller à le mettre en TStrings, de façon à faire un
memo.lines := b;

Et puis tu fais ce que tu veux du style de memo, tu peux très bien le faire ressembler à un TCaption.

J'espère avoir bien saisie ton sujet.

$cHn4wD

samedi 12 avril 2008 à 15:11:27 | Re : TStringList erreur

ronoobresil

Réponse acceptée !
Merci pour la rapidité (et l'efficacité) de la réponse.
Mes fichiers ASCII se présentent sous la forme suivante:
-Une entête avec quelques lignes de texte (programme de création, date, parametres divers) =>à supprimer
-Un tableau de 7 ou 8 colonnes d'entier séparés par des tabulations, dont je ne veux garder que certaines colonnes.

Je desire faire de petites opérations, un tri de ces valeurs et remettre une entête (que le programme pour lequel je fais cette conversion reconnaisse).
Mon but est de formater mon fichier ASCII pour qu'il soit utilisable par une seconde application.(déjà existante).
En tout cas merci, ça me remotive, j'y retourne....

Renaud

samedi 12 avril 2008 à 16:10:26 | Re : TStringList erreur

ronoobresil

Réponse acceptée !
Rebonjour,
La procédure liée au click speedbutton1 ne fonctionne pas jusqu'au bout (plantage avant).

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    fileName := OpenDialog1.FileName;
    Edit1.Text := filename;
    tex.LoadFromFile(filename); //la procedure semble planter sur cette ligne  
    Label1.Caption := tex[1]
  end;
end;

Instantanément après de la selection du fichier, ça coupe, avec le message d'erreur suivant:
"Project Project1.exe raised execption class EAccessViolation with message
"Access Violation at address 00454584 in module Project1.exe". Read of address 000000000. Access stopped"

Je tourne depuis une ou deux heures...J'espere que vous pourrez m'éclairer à nouveau. Bonne journée,

Renaud

samedi 12 avril 2008 à 16:27:51 | Re : TStringList erreur

ronoobresil

Réponse acceptée !
Quel ****** je suis..J'avais associé la procedure de fermeture mais pas celle d'ouverture avec l'objet Form.


Renaud



Cette discussion est classé dans : end, filename, begin, tstringlist, tex


Répondre à ce message

Sujets en rapport avec ce message

probleme dans mon programme [ par tarik ] monsieur kerad je crois que j'ai un bug dans mon programme ci-dessousprocedure TForm1.Button1Click(Sender: TObject);begintable1.open;try Table1.First Datamodule et accès à partir d'une form [ par manudel ] Voilà, je voudrais avoir accès aux événements des objets figurant sur mon datamodule, mais je n'y arrive pas. J'ai l'erreur suivante : "le type de l'e Code pas fiable dans un livre [:(!] [ par Youyou0214 ] Voil j'ai achet un livre sur delphi et je fais leurs exercises. Tout march pars un lanceur D'application. Il est compos d'une comboBox ( nom (c le n Index d'un table Dbase [ par webazard ] Bonjour, je crée un base Dbase indiqué dans l'aide de delphi en remplacant ttparadox par ttdbase.en supprimant la construction d'index min prog marche Hints dans une DLL [ par almi ] J'ai une fenêtre (TForm) qui fonctionne parfaitement dans mon executable.Si je la place dans une DLL, j'obtiens le message :Ne peut assigner TFont à T Code 1 à tester [ par apz ] salut a tous,je voulais faire un filtrage sur une table en utlisant les numeros d'enregistrements pour marquer les record et ensuite applique une requ Champs Chamboulés [ par apz ] Salut,1- En voulant avoir une table *.DB à partir d'une table *.DBF, en utilisant le Module Base de Données (Outils/Utilitaires/Copier), j'avais dans Erreur incomprehensible [ par intello2001 ] j'ai lerreur suivante :Unsatisfied forward or external declaration: Tform1....je pesne que c une kestion de end et begin dans mon code : else if TServerSocket en Multithread [ par Cyrille2 ] Salut... je bloque à mort sur un bug... en faite, impossible de lire le socketstream voila la procédure : Code: procedure TServerThread.ClientExecute; Déplacement [ par MAsterC ] Bonjourj'ai besoin d'information en Delphij'ai fait ceci !procedure TModule.TitleBarMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begi


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.