12. september 2001 - 11:13Der 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) ?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.
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;
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;
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.
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).
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
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.
Synes godt om
Ny brugerNybegynder
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.