Interruption d'une procedure avec un bouton stop

Résolu
schafphil Messages postés 1 Date d'inscription jeudi 13 mai 2004 Statut Membre Dernière intervention 14 avril 2009 - 14 avril 2009 à 08:46
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 14 avril 2009 à 17:31
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

Utilisateur anonyme
14 avril 2009 à 09:23
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;
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 avril 2009 à 09:41
rholalala ...

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

<hr size="2" width="100%" />
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
14 avril 2009 à 15:17
@f0xi : +1 !

Cordialement, Bacterius !
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 avril 2009 à 17:06
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%" />
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
14 avril 2009 à 17:31
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 !
0
Rejoignez-nous