Avatar billede limes_planum Praktikant
15. april 2006 - 21:20 Der er 11 kommentarer og
2 løsninger

Kørsel af procedure?

Jeg er ved at lave en timer-funktion, men forstår endnu ikke Delphi godt nok vedr. procedurer og hændelser.

Nedenstående scripts er procedurer, som umiddelbart ser ud til at køre igen og igen hvert 50 milllisekund(evnt:Ontimer sat til 50):

procedure TForm1.Timer1Timer(Sender: TObject);
var i, Data1, Data2, StartTime, HvorLangTidErDerGaaet: longint;
begin
  timer1.enabled:=false; 
  ReadAllAnalog(Data1,Data2);
  ProgressBar1.Position:=Data1;
  ProgressBar2.Position:=Data2;
  if Data1>100 then
  StartTime := GetTickCount;           
  Label14.caption:=inttostr(Data1);
  Label16.caption:=inttostr(Data2);
  i:=ReadAllDigital;
  timer1.enabled:=true;

end;

OG PROCEDURE 2:

procedure TForm1.Timer2Timer(Sender: TObject);
var i, Data1, Data2, StartTime, HvorLangTidErDerGaaet: longint;
begin
  timer1.enabled:=false; 
  ReadAllAnalog(Data1,Data2);
  ProgressBar2.Position:=Data2;
  Label16.caption:=inttostr(Data2);
  i:=ReadAllDigital;
  if Data2>100 then   
      HvorLangTidErDerGaaet := (StartTime - GetTickCount);
  Label1.caption := inttostr(HvorLangTidErDerGaaet);
  timer1.enabled:=true;

end;

Bottomline: Hvorfor virker det ik?
Avatar billede kroning Nybegynder
15. april 2006 - 21:24 #1
Skal det ikke være timer2.enabled:=false og true i procedure2? Og hvordan virker det ikke?
Avatar billede stone Forsker
15. april 2006 - 22:57 #2
din timer kører kun i slutning af din procedure???
Avatar billede nca Juniormester
16. april 2006 - 09:25 #3
Som Kroning: Er det Timer1 du vil styre fra Timer2?
Er Timer2 Enabled fra starten, ellers får du den aldrig i gang.
Avatar billede limes_planum Praktikant
16. april 2006 - 11:09 #4
Ok - ja har set det med rtyk-fejlen.. får næsten lyst til at oprette sp. igen hehe...
Jeg er så ny i sproget, at jeg umiddelbart naivt troede at 'true' forneden var en naturlig ting.
Ber' kommenterende og besvarende om en lille kunstpause, da jeg netop sidder og bruger feedbacken og retter til (går lidt langsomt...)
Hvordan det ikke virker? -> Jeg sidder og roder med analoge 4,5 V's elektronik-input, der fungerer som trigger (Data1, Data2)
En hændelse jeg meget gerne vil bruge, er derfor det analoge input - føromtalte trigger.
Avatar billede limes_planum Praktikant
16. april 2006 - 11:35 #5
Hov - Jeg sidder med Delphi 4 og finder først ud af nogle ting - via help - omkring 'type' nu. Skylder derfor at forklare at typen: TTimer, som default skal være false for at virke :-S - sorry... famler lidt meget, men jeg gør alt i min magt, da dette hobby-projekt prioriteres højt.
Script-stump omkring timer1 og -2 virker derfor kun som i den ovenstående form.
Avatar billede kroning Nybegynder
16. april 2006 - 11:40 #6
Jamen jeg går ud fra at du har 2 stk. TTimer som hver er sat til 50 i interval. Hvis du sætter disse 2 Timeres Enable=true ved program start så vil de kalde procedure 1 og 2 hver ca. 50 milisekunder.
Avatar billede limes_planum Praktikant
16. april 2006 - 13:48 #7
Jo - hvert 50. millisekund for dem begge. Nu hvor jeg prøvet lidt af hvert er jeg kommet frem til at problemet ligger et andet sted.
Først og fremmest har jeg lagt 'label1' der forklarer 'HvorLangTidErDerGaaet', over i en anden timer, som kun looper hvert 4 sek (4000ms under Object/Interval) - se Timer5:

procedure TForm1.Timer1Timer(Sender: TObject);
var i, Data1, Data2, StartTime: longint;
begin
  timer1.enabled:=false;
  ReadAllAnalog(Data1,Data2);
  ProgressBar1.Position:= Data1;
  ReadAllAnalog(Data1,Data2);
  begin
  if Data2 = 0 then
    StartTime:= 0 
  else
    StartTime := GetTickCount;
  end;           
  Label14.caption:=inttostr(Data1);
  i:=ReadAllDigital;
  timer1.enabled:=true;

end;

PROC. 2:

procedure TForm1.Timer2Timer(Sender: TObject);
var i, Data1, Data2, StartTime, HvorLangTidErDerGaaet: longint;
begin
  timer2.enabled:=false;
 
  ReadAllAnalog(Data1,Data2);
  ProgressBar2.Position:= Data2; 
  ReadAllAnalog(Data1,Data2); 
  begin
  if Data2 = 0 then
    HvorLangTidErDerGaaet := 0 
  else
  HvorLangTidErDerGaaet := (StartTime - GetTickCount);   
  end;
  Label16.caption:=inttostr(Data2);
  i:=ReadAllDigital;
  timer2.enabled:=true;

end;

PROC. 3 - TIMER5:

procedure TForm1.Timer5Timer(Sender: TObject);
var i, Data1, Data2, StartTime, HvorLangTidErDerGaaet: longint;
begin
  timer5.enabled:=false;
  Starttid.caption := inttostr(StartTime);
  Forskel.caption := inttostr(HvorLangTidErDerGaaet);
  timer5.enabled:=true;

end;

Ovenstående if-statements bliver kørt uanset om de er opfyldt eller ej. Det ser ud som om de skrevet forkert, men jeg kan ikke finde en mere rigtig syntax i Help-funktionen :-S
Derfor virker min trigger ikke rigtigt på trods af, at min 'Progressbar' får de rigtige input - det vil sige 0 fra start - og ellers viser det den skal... Øv x 10^23
Avatar billede kroning Nybegynder
16. april 2006 - 13:54 #8
Har du prøvet at debugge lidt med F7 og F8 så du kan se hvilke værdier de forskellige variabler har og hvad der sker?
Avatar billede limes_planum Praktikant
16. april 2006 - 16:39 #9
DET VIRKER!!! Yipee x 10^91...
Kroning - selv om du kun har været delvist bidragende til løsningen får du æren for den gode sportsånd. Smid et svar.

Jeg fandt selv en løsning og i fald kommenterende og andre Delhpi-interesserede har lyst til at se løsningen, så følger den herefter.
Det skal nævnes, at scriptene er bygget ovenpå en source-kode der højst sandsynligt kun er et par år gammel (Delphi 7-8 stykker eller senere...), og at jeg selv har siddet med Delphi 4. - Måske kan det have noget at sige for de rigtig indviede.

Løsningen
En procedure var nok:

procedure TForm1.Timer1Timer(Sender: TObject);
var i, Data1, Data2, StartTime, HvorLangTidErDerGaaet: longint;
begin
  timer1.enabled:=false;
  ReadAllAnalog(Data1,Data2);
  ProgressBar1.Position:= Data1;
  ProgressBar2.Position:= Data2; 
    case Data1 of
    1..255:
    Begin
    StartTime := GetTickCount;
    Starttid.caption := inttostr(StartTime);
    end;
    0: StartTime:= 0
    end;
    case Data2 of
    1..255:
    Begin
    HvorLangTidErDerGaaet := (StartTime - GetTickCount)*(-1);
    Forskel.caption := inttostr(HvorLangTidErDerGaaet);
    end;
    0: HvorLangTidErDerGaaet := 0;
    end;     
  Label14.caption:=inttostr(Data1);
  Label16.caption:=inttostr(Data2);
  timer1.enabled:=true;

end;
Avatar billede kroning Nybegynder
16. april 2006 - 16:45 #10
Lyder godt, men hvis jeg skal have lidt points så vel ikke mere end en 5 stykker, jeg har jo ikke rigtig hjulpet med noget syntes jeg.
Avatar billede limes_planum Praktikant
17. april 2006 - 13:23 #11
Men hvad skal jeg så give resterende? Med mindre pointsystemet er lavet om, og man kan beholde resten af udlovede point, så skal resterende af kommenterende have resten eller?(i så fald, i den grad ufortj.) - skulle de så også have givet et svar for at få point?

Det er et stykke tid siden jeg har givet point - får jeg et tekstfelt til pointangivelse, hvis jeg trykker 'Accepter'? Kan jeg undgå at give dig alle pointene i et hug, ved tryk på 'Accepter?
Avatar billede kroning Nybegynder
17. april 2006 - 14:27 #12
Lig et svar selv og giv resten til dig selv.
Avatar billede limes_planum Praktikant
17. april 2006 - 14:44 #13
Rest-svar.
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