Avatar billede zerohero Nybegynder
24. januar 2001 - 11:09 Der 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?)...

ZeroHero
Avatar billede martinlind Nybegynder
24. januar 2001 - 11:16 #1
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.

/Martin
Avatar billede hoejrup Nybegynder
24. januar 2001 - 11:16 #2
Hvis du bruger div, så svarer det til resten ved heltals division.

163 div 80 = 83
83 * 100 = 8300

/per
Avatar billede borrisholt Novice
24. januar 2001 - 11:17 #3
zerohero>> Det du har er en meget almindelig fejl ... Du truncerer inden du er færdin med din udregning ....


prøv det her :

var
pctDone : Integer;
begin
  pctDone := Trunc((80/163)*100)
end;

(se ingen heste .....)

Jens B
Avatar billede torbenthyregod Nybegynder
24. januar 2001 - 11:18 #4
1. prøv med : (80 / 163) * 100
  Så passer matematikken vist igen !!
Avatar billede borrisholt Novice
24. januar 2001 - 11:19 #5
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 ....

Jens B
Avatar billede pellelil Nybegynder
24. januar 2001 - 11:22 #6
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>
Avatar billede borrisholt Novice
24. januar 2001 - 11:26 #7
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 ...

Jens B
Avatar billede pellelil Nybegynder
24. januar 2001 - 11:27 #8
>zerohero: borrisholt og torbenthyregod var mere vågen så kig på deres \"formel\" (dog ville jeg gange før jeg dividere).

>borrisholt: hvis det blev lavet i en tråd så er det vel bare at lade hovedprogrammet terminere denne. !?
Avatar billede martinlind Nybegynder
24. januar 2001 - 11:32 #9
Bare for at for det helt på det rene, fra online hjælpen i delphi5 :

The generic type Real, in its current implementation, is equivalent to Double.

/Martin
Avatar billede k_la Nybegynder
24. januar 2001 - 11:34 #10
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.
Avatar billede borrisholt Novice
24. januar 2001 - 11:35 #11
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}

Jens B
Avatar billede pellelil Nybegynder
24. januar 2001 - 11:37 #12
borrisholt> Du har ret. Jeg ved ikke lige hvilken version af Delphi det blev lavet om i (Jeg har ikke anvendt Real siden TP7/Delphi1).
Avatar billede zerohero Nybegynder
24. januar 2001 - 11:50 #13
Hvor er det lækkert at se at Borrisholt, Pellelil og Martinlind for en gangs skyld er enige...

1000 tak for alle jeres køgtige svar...
Avatar billede pellelil Nybegynder
24. januar 2001 - 11:52 #14
Jeg er ikke enig i at vi plejer ikke være enige  :-)
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