Avatar billede jaweni Nybegynder
08. marts 2006 - 11:58 Der er 6 kommentarer og
2 løsninger

Brugerafbrydelse (Delphi2)

Ved indlæsning af store text-filer vil jeg gerne,
at brugeren skal kunne afbryde indlæsningen ved
klik på en knap (Stop) el. ved tastetryk (ALT+S).

Jeg forestiller mig, at koden skal virke ved at
afbryde i:

While not EOF(Fil) Do begin
  IF stopClick = ??? then begin
    CloseFile(Fil);
    Break;   
  End;
End;

men det virker ikke.

Hvordan skal koden være?
Avatar billede martinlind Nybegynder
08. marts 2006 - 13:06 #1
du skal bruge ProcessMessages; i den løkke der læser filen ind, ellers "fanger" du ikke at der bliver trykket på en knap.
Avatar billede softtail Nybegynder
08. marts 2006 - 18:13 #2
Du skal køre din fillæsning i en anden tråd end brugergrænsefladen. Derved kan brugeren interagere med brugergrænsefladen, mens processoren arbejder med den anden tråd.
Avatar billede martinlind Nybegynder
09. marts 2006 - 14:02 #3
og hvis du vil undgå at kaste dig ud i tråd prgrammereing, så bruger du en procedure jeg beskev.
Avatar billede hrc Mester
21. marts 2006 - 13:29 #4
Her et eksempel på den simple ikke tråede metode

  TForm1 = (TForm)
  private
    fDoExit : boolean;
  end;

...
procedure TForm1.OnAbortClick(Sender : TComponent);
begin
  fDoExit := true;
end;

procedure TForm1.ReadHumongousTextFile(aFilename : string);
var
  fp : textfile;
begin
  fDoAbort := false;
  assignfile(fp,aFilename);
  if not fileexists(aFilename) then
    exit;
  Reset(fp);
  try
    while not (eof(fp) or fDoAbort) do
    begin
      readln(fp,st);
      Application.ProcessMessages;
    end;
  finally
    closefile(fp);
  end;
end;
Avatar billede jaweni Nybegynder
24. marts 2006 - 09:56 #5
Hej!,
fik noget kode af en kammerat,
som meget ligner hrc's forslag.
Dog gøres det inde i selve
while-løkken som foreslået af
martinlind. Vil I dele points
eller???
Avatar billede hrc Mester
24. marts 2006 - 10:40 #6
Det synes jeg Martin skal bestemme. Jeg har bare beskrevet hans svar og var jeg ikke kommet først, så havde han sikkert selv gjort det.

I øvrigt. Sådan en ProcessMessages er halv tung at danse med. Hvis du skal indlæse mange linjer så er det dumt at fyre en ProcessMessages af hver gang. Du kan der bruge noget lignende dette:

var
  i : integer;
begin
  i := 0;
  ..
  while not (eof(fp) or fDoAbort) do
  begin
    readln(fp,st);
    inc(i);
    if (i mod 100) = 0 then
      Application.ProcessMessages;
  end;
end;
Avatar billede hrc Mester
24. marts 2006 - 10:42 #7
Jeg fører et (tabt) korstog for korrekt brug af sammensatte ord og så plumper jeg i med "halv tung" der skal være "halvtung", grrrr.
Avatar billede jaweni Nybegynder
24. marts 2006 - 16:06 #8
Hej begge,
kan godt se "æ problem"; men indtil
nu har det virket upåklageligt.

I deler point. Tak for Jeres hjælp!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester