24. januar 2001 - 11:09Der er
11 kommentarer og 3 løsninger
Så gik det galt igen
Egentligt virker det til at være ret let - men jeg kan bare ikke få lortet til at virke. 1. Jeg har et tidspunt eks. 02:43 det er præcis 163 sekunder. hvis vi antager at der er gået 80 sekunder hvormange procent er der så gået... ret simpelt ikke... (163 div 80)*100 -> 49% (ca)... i denne lille udregning bliver jeg nødt til at bruge kommatal dvs. Real (eller er jeg helt galt på den?) men når jeg vil lave udregningen virker det fandme ikke... resultat bliver ved med at være nul... 2. Hvis jeg har en procedure der skal udføres når jeg trykker på en knap eks.
repeat (et eller andet...) until
og der så vises en form med en Tlabel, Tprogressbar og en cancel-knap...
så bliver der ikke vist noget i Tlabel og hvis jeg trykker på cancel-knappen (der er sat til at stoppe proceduren) så kan jeg få lov til at anvende den... kun Tprogressbar er tilgængeligt... hvad skal jeg gøre... (det virker som om at når man bruger en repeat-lykke så bruger den alle computerens resourcer så alt andet bliver blokeret, men hvad skal jeg ellers gøre?)...
Det gør den også, så du skal putte en application.processMessages ind i din lykke hvis du skal havde en cancel knap man skal havde lov at trykke på.
mht. din udregning har du ret i at du skal bruge en real/double men så skal du huske at ændre din heltal\'s division ( DIV ) til en / som er en real division.
Hvis man skal have mulighed for at stoppe en process på \"halv vejen\" skal der særdeles tungt vejende argumenter til for IKKE at lave det i en tråd ....
For det første skal du undgå at bruge real. Real variablen var god i de gode gammle DOS dage, da den var rent software baseret (der kunne være langt mellem PCer der havde en FPU - Floating point Processor Unit). Real er stadig software baseret og det er derfor du ikke skal bruge den, brug i stedet Sigle, Extended eller Double da disse er implementeret i hardwaren (og derfor er hurtigere og mindre CPU belastende i forhold til Real.
Du kan evt beregne dine procent som \"Pct := Trunc((163*100)/80;\". Når/hvis vi skal gå i detaljer kan du se at jeg starter med at gange hvorefter jeg dividere til sidst, så er det blot for at holde resultatet så præcises som overhovedet muligt (selv om det ikke er nødvendigt i dette tilfælde).
I din repeat..until giver du ikke dit program mulighed for at udføre andet i mellemtiden. Du kan derfor sætte en (eller flere) \"Application.ProcessMessages;\" ind. Disse giver således dit program mulighed for at behandle de meddelelser den modtager (så som når du trykker på en knap). I din OnClick til din cancel sætter du blot et boolean variable som du checker på i din repeat..until
<SNIP> repeat Application.ProcessMessages; Pct := Trunc((tid*100)/sekunder; ProgressBar1.Position := Pct; Label1.caption := IntToStr(Pct) \' %\'; Application.ProcessMessages; until (StopBetingelser) or (CancelWasPressed); </SNIP>
pellelil >> Var der ikke noget om at real belev lavet om i Delphi 4 eller 5 ? Således at en Real48 er den \"gode gamle\", eller hvad nu man sakl kalde den og den \"nye\" real er en double ...
mht til dit regnestykke, så kan vil delphi regne fra venstre mod højre og parantes først, hvis der ingen parantes er gælder operatorherarki dvs * div, før + -. Du kan regne i integer, men så skal dit regnestykke se således ud resultat:= (80 * 100) div 163;
eller i delphi procedure TForm1.regnClick(Sender: TObject); var procent,tid1,tid:integer; begin tid1:=80; tid:=163; procent:= (tid1 *100)div tid; memo1.text:=inttostr(procent); end;
mht sløjfer så vil repeat .. until kunne lave endeløse sløjfer som ikke reagerer på en cancel
bare prøv
repeat
until false;
den vil køre hele tiden Du skal sætte en betingelse op der afslutter din løkke eller tester for keypress elle lign.
martinlind >> Så var jeg ikke helt dum alligevel .... Et ydleigerlig studie af On-linehjælpen viser at skal man bruge de ngamle real type skal den erklæres som en Real48 ellers skal man sætte flaget {$REALCOMPATIBILITY ON}
Jeg er ikke enig i at vi plejer ikke være enige :-)
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.