Interruption d'une procedure avec un bouton stop [Résolu]

Signaler
Messages postés
1
Date d'inscription
jeudi 13 mai 2004
Statut
Membre
Dernière intervention
14 avril 2009
-
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
-
Bonjour,
J'ai fait un programme avec Delphi 7 Studio et j'ai le problème suivant. Dans mon programme j'ai une procedure qui lit un fichier texte et l'affiche sur un Memo. Tout fonctionne correctement mais lors de la lecture/écriture si le fichier est long j'ai mis un bouton "Stop" pour permettre a l'utilisateur d'interrompre la procedure. Malheureusement lors de la lecture/ecriture tous les composants de la Form (Menu,bouton ...) sont inactifs.
Comment puis-je faire pour que le bouton "Stop" reste actif lors la boucle lecture/ecriture.
Voici un extrait de la procedure:

procedure TForm1.Listedufichier1Click(Sender: TObject);
begin
  lecturefichier := true;
  AssignFile(infile,infilename);
  {$I-}
    Reset(infile);
  {$I+}
  if (IOResult = 0) and then
  begin
    Memo1.Show;
    Memo1.Clear;
    Button2.Show;
    Repeat
      if lecturefichier = true then exit;
      Readln(infile, Ligne);
      Memo1.Lines.Add(Ligne);
    Until EOF(infile);
    CloseFile(infile);
  end;
end; {--- ListduInFichier1Click ---}

{---------------------------------------------------------------------------}
procedure TForm1.Button2Click(Sender: TObject);
begin
  LectureFichier := true;
  Memo1.Hide;
  Button1.Hide;
end; {--- Button2Click ---}

Si quelqu'un peut me donner un conseil, d'avance je vous remercie.
Mon adresse email est la suivante:

[mailto:schafphil@bluewin.ch schafphil@bluewin.ch]

Merci
Phil

5 réponses


Salut,

Le bout de code que tu donnes ne peut pas fonctionner :

procedure TForm1.Listedufichier1Click(Sender: TObject);
begin
  lecturefichier := true;
...
    Repeat
      if lecturefichier = true then exit;
...
    CloseFile(infile);
  end;
end;

Sinon pour répondre à ta question : Il suffit de defreezer l'application

var
  Form1: TForm1;
  lecturefichier:boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  infile:TextFile;
  ligne:string;
begin
  AssignFile(infile,'C:\test.txt');
  {$I-}
    Reset(infile);
  {$I+}
  if (IOResult = 0)then
  begin
    Memo1.Clear;
    Button2.Show;
    Repeat
      if lecturefichier = true then exit;
      Application.ProcessMessages;
      Readln(infile, Ligne);
      Memo1.Lines.Add(Ligne);
    Until EOF(infile);
    CloseFile(infile);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   LectureFichier := true;
  Memo1.Hide;
  Button1.Hide;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   lecturefichier:=false;
end;
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
31
rholalala ...

procedure TForm1.Listedufichier1Click(Sender: TObject);
begin
   Memo1.Lines.LoadFromFile(InFileName);
end;

<hr size="2" width="100%" />
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
@f0xi : +1 !

Cordialement, Bacterius !
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
31
j'explique :

Depuis l'apparition des TStream, TStrings et autre composants derivé, il est declaré comme obsolete d'acceder a un fichier texte avec TextFile, Assign, Reset etc.

si TMemo/TListBox tu n'as pas besoin (lecture du texte sans affichage) utilise la classe TStringList.

var
  TxtFile : TStringList;

procedure NextStep;
var N : integer;
begin
  if TxtFile.Count <> 0 then
  begin
    TxtFile.BeginUpdate;
    Try
      for N := 0 to TxtFile.Count-1 do
      begin
       // Traitement

      end;
    Finally
      TxtFile.EndUpdate;
    end;
  end;
end;

procedure TForm1.Form1Create(Sender: TObject);
begin
  TxtFile := TStringList.Create;
end;

procedure TForm1.Form1Destroy(Sender: TObject);
begin
  TxtFile.Free;
end;

procedure TForm1.ButtonOpenClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    TxtFile.LoadFromFile( OpenDialog1.FileName );
    NextStep;
  end;
end;

<hr size="2" width="100%" />
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Et est-ce obsolète d'appeller directement Read/WriteFile depuis Delphi également ? Moi je m'en sers souvent, ça peut être très utile dans certaines situations ...

Cordialement, Bacterius !