Avatar billede slowaterz Nybegynder
12. september 2001 - 11:13 Der er 17 kommentarer og
1 løsning

Løkker i funktioner

Jeg har et program, der modtager en tekst fra brugeren og udskriver det et bogstav ad gangen. Det foregår i en løkke så længe der er bogstaver tilbage: skriv et bogstav; gentegn billedet; vent lidt; check om der er kommet nogen events i mellemtiden; flyt tælleren til næste tegn.
Mens den er ved at skrive ud, ændrer jeg teksten. Programmet starter løkken forfra med den nye tekst, kører løkken færdig og går så tilbage til den position, løkken var kommet til, før jeg ændrede teksten, og skriver den nye tekst fra den position.
Så vidt jeg kan se, bliver der startet en ny løkke, når jeg ændrer teksten, den bliver gjort færdig og så går programmet tilbage til den første løkke.
Hvordan får jeg programmet til at afbryde den første løkke (eller genstarte den meed den nye tekst) ?
Avatar billede martinlind Nybegynder
12. september 2001 - 11:16 #1
Break
Continue
Avatar billede slowaterz Nybegynder
12. september 2001 - 11:19 #2
martinlind, jeg kan ikke rigtigt styre, hvilken af løkkerne, jeg afbryder med Break. Der er jo to kald til min OnScreen funktion i gang.
Avatar billede martinlind Nybegynder
12. september 2001 - 11:27 #3
Break afbryder den lykke du er i, hvis du vil helt ud af din function kan du bruge Exit

/Martin
Avatar billede slowaterz Nybegynder
12. september 2001 - 11:35 #4
Jeg har prøvet at sætte et flag i den funktion, der modtager den nye tekst, kontrollere flaget i løkken og, i givet fald, bruge Break. Det resulterer i, at jeg afbryder den nye løkke og den nye tekst ikke bliver udskrevet. Samme resultat med Exit.
Avatar billede martinlind Nybegynder
12. september 2001 - 11:38 #5
Jeg tror ikke helt jeg kan gennemskue hvad du søger, kan du komme med noget kode eks.
Avatar billede slowaterz Nybegynder
12. september 2001 - 11:48 #6
De to procedurer, jeg bruger :

procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var oldText: string;
begin
  oldText := NewText;
  NewText := InputBox(\'New string\', \'Enter string\', NewText);
  if oldText <> NewText then
  begin
    TextChanged := True;
    OnScreen;
  end;
end;

procedure OnScreen;
var i: integer;
begin
  i:= 1;
  while i < Length(NewText) do
  begin
    PutOut(NewText[i]);
    Repaint;
    Sleep(20);
    Application.ProcessMessages;
    if TextChanged then
    begin
      TextChanged := False;
      Break;
    end;
    Inc(i);
  end;
end;
Avatar billede martinlind Nybegynder
12. september 2001 - 11:59 #7
Du kan jo prøve at ændre

if TextChanged then
begin
  TextChanged := False;
  Break;
end;
   
til

if TextChanged then I := 1;


så burde den jo starte forfra med det der står i NewText
Avatar billede slowaterz Nybegynder
12. september 2001 - 12:23 #8
Det gør den også. Og når den er færdig, går den tilbage til det punkt, hvor den blev afbrudt, og kører igen færdig derfra.
Avatar billede martinlind Nybegynder
12. september 2001 - 12:30 #9
Hvad med sådan :

procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var oldText: string;
begin
  oldText := NewText;
  NewText := InputBox(\'New string\', \'Enter string\', NewText);
  if oldText <> NewText then
  begin
    TextChanged := True;
    Application.ProcessMessages;
    OnScreen;
  end;
end;

procedure OnScreen;
var i: integer;
begin
  i:= 1;
  while ( i < Length(NewText) ) and not TextChanged do
  begin
    PutOut(NewText[i]);
    Repaint;
    Sleep(20);
    Application.ProcessMessages;
    Inc(i);
  end;
end;
Avatar billede martinlind Nybegynder
12. september 2001 - 12:31 #10
Evt. kan du Droppe din Sleep(20); du har jo en ProcessMessages;
Avatar billede poull Nybegynder
13. september 2001 - 11:55 #11
kan bare bruge while lykker hvor du tæller nogle variabler ned, for så kan du bare sætte disse variabler til 0 eller sådan noget og så skulle den ikke gå videre.
Avatar billede martinlind Nybegynder
13. september 2001 - 12:03 #12
poull >> der er brugt en While løkke med et Flag, hvilket giver samme.
Avatar billede poull Nybegynder
14. september 2001 - 09:40 #13
martinlind >> jeg kan bare lære at læse spm\'et helt færdig. :)
Avatar billede slowaterz Nybegynder
14. september 2001 - 10:09 #14
martinlind >> hvis jeg tager \"and not TextChanged\" med i min while-løkkes betingelse, kommer jeg jo ikke ind i den, når jeg ændrer teksten (og dermed sætter TextChanged til True).
Avatar billede martinlind Nybegynder
14. september 2001 - 10:12 #15
Det må jeg jo gi dig ret i, det var lige en smutter *S*
Avatar billede martinlind Nybegynder
14. september 2001 - 10:16 #16
Jeg bliver altså nød til at spørge hvorfor du gør det så besværligt, kan du ikke bare skrive teksten ud ?

Hvad gør PutOut() ?

/Martin
Avatar billede slowaterz Nybegynder
14. september 2001 - 10:46 #17
Jeg prøver at få det til at se lidt smart ud. Jeg har i øvrigt lavet om på måden, teksten bliver vist på - jeg har lavet et display - 10 X 100 \"dioder\" (TShape, type: circle, color: black/lime) - teksten kommer rullende over skærmen og skal kunne ændres. Jeg kunne egentligt også tænke mig at høre, om ikke der er en smartere måde at gøre det på - men det lægger jeg ud i et separat spørgsmål ... på et eller andet tidspunkt ... hvis jeg husker det
Avatar billede slowaterz Nybegynder
14. september 2001 - 12:49 #18
Well, boys and girls, jeg har fundet en anden måde at løse mit problem på.

Som det er nu, afbryder jeg løkken i udskrifts funktionen ved at ændre teksten og laver et nyt kald til denne funktion, men jeg afslutter ikke det første - derved bliver der lavet en ny kopi af funktionen med en ny tæller (og hvis jeg ændrer teksten igen inden den er skrevet færdig, laver jeg en tredje kopi o.s.v.) - og, så vidt jeg kan se, kan jeg kun styre den sidst oprette kopi af tælleren. Så når den sidst oprettede kopi af funktionen gør dens løkke færdig, går programmet tilbage til den pausede forrige kopi og gør den færdig.

Her er så den løsning, jeg brugte : i stedet for en lokal tæller i udskrifts funktionen bruger jeg en tæller, der hører til min form. Når kopi nr. 2 af funktionen afslutter, er tælleren nået slutningen af strengen. Så når den første kopi af funktionen får kontrollen igen, hopper den ud af løkken med det samme - slutningen er jo nået.

Forresten, nu kan jeg helt undvære min TextChanged.

Så jeg tager point\'ene tilbage ... Men hvis I kommer i en tilsvarende situation - så har I en løsning.
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
Kategori
Kurser inden for grundlæggende programmering

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