[Delphi] Tijden in array dan controleren werkt niet

Pagina: 1
Acties:
  • 181 views sinds 30-01-2008
  • Reageer

  • dumpie
  • Registratie: Februari 2003
  • Niet online
Probleem: De tijden uit het bestand worden niet in de array gezet.

Nu ben ik bezig voor een vriend om een programmaatje te maken dat op gepaalde tijden 1 geluid afspeelt.

Het zit zo:

Je leest een bestand in met openen, in dat bestand staan de tijden:

14:50:03
14:59:10
enz

En die lees ik in in een ListBox.
Daarna worden de items in een Array gegooid en wil ik dus controleren of de windows tijd gelijk is aan die tijd.

Nu heb ik de hele code geschreven, maar het lijkt al verkeerd te gaan bij het in de Array stoppen (Daarom heb ik er even een memo testveld bij gegooid)..
Ziet misschien iemand de fout?

Ik heb al een dag lopen zoeken op google naar hoe arrays precies werken, etc.
Dus kwam ik bij het volgende artikel uit: http://www.delphibasics.co.uk/RTL.asp?Name=Array, dat precies gedaan maar werkt nog niet :(.

Omdat dit morgen af moet zijn kan ik eigenlijk zelf niet langer op zoek gaan en hoopte dat 1 van jullie me kan helpen.

Code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
unit Unit1; 

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, Menus, StdCtrls, CheckLst, ExtCtrls; 

type 
  TForm1 = class(TForm) 
    MainMenu1: TMainMenu; 
    Bestand1: TMenuItem; 
    Open1: TMenuItem; 
    N1: TMenuItem; 
    Exit1: TMenuItem; 
    DlgOpen: TOpenDialog; 
    ListTime: TListBox; 
    Timer: TTimer; 
    Label1: TLabel; 
    Memo1: TMemo; 
    TimerClock: TTimer; 
    procedure Exit1Click(Sender: TObject); 
    procedure Open1Click(Sender: TObject); 
    procedure TimerTimer(Sender: TObject); 
    procedure TimerClockTimer(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 

var 
  Form1: TForm1; 
  VarI, VarT, VarLoad: Integer; 
  VarTime: Array of String; 

implementation 

{$R *.dfm} 

procedure TForm1.Exit1Click(Sender: TObject); 
begin 
 Application.Terminate; 
end; 

procedure TForm1.Open1Click(Sender: TObject); 
begin 
 if DlgOpen.Execute then 
  try 
   ListTime.Items.LoadFromFile(DlgOpen.Filename); 
   SetLength(VarTime, ListTime.Count + 1); 
   VarI := 0; 
   VarLoad := 1; 
     while VarI < ListTime.Count do 
      begin 
       VarTime[VarI] := ListTime.Items[VarI]; 
       VarI := VarI + 1; 
       Memo1.Lines.Add(VarTime[VarI]); 
      end; 
  except 
   ShowMessage('Fout bij laden bestand.') 
  end; 
end; 

procedure TForm1.TimerTimer(Sender: TObject); 
begin 
 if VarLoad = 1 then 
  begin 
   VarI := 0; 
    while VarT = 0 do 
     begin 
      if TimeToStr(Time) = VarTime[VarI] then 
       begin 
        VarI := 0; 
        ShowMessage('Het is tijd.'); 
        exit; 
       end 
      else 
       VarI := VarI + 1; 
     end; 
  end; 
end; 

procedure TForm1.TimerClockTimer(Sender: TObject); 
begin 
 Label1.Caption := TimeTostr(Now); 
end; 

end.


Alvast hartelijk bedankt!

Johan

[ Voor 4% gewijzigd door dumpie op 29-04-2004 14:12 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
nevermind

[ Voor 85% gewijzigd door bigbeng op 29-04-2004 14:09 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 25-05 22:48

Creepy

Tactical Espionage Splatterer

Zou je misschien kunnen vertellen WAT er is mis gaat? EN je post aanpassen zodat je code tussen [ code ] en [ /code ] tags staan? Dat maakt de boel wat leesbaarder.

Ik zie al wel iets wat niet klopt aan je code, je reserveert nergens ruimte voor de array zelf. Als je eej dynamische array maakt zul je met bijv. setlength() de grootte van de array moeten bepalen.Beter opletten, die setlength() staat er wel ;)

[ Voor 7% gewijzigd door Creepy op 29-04-2004 14:10 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

1) Je geeft geen foutmelding
2) Je gebruikt geen code tags
3) "Hij doettut niet, help!"

Magere topicstart, kun je iets duidelijker zijn?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Creepy schreef op 29 april 2004 @ 14:09:
Ik zie al wel iets wat niet klopt aan je code, je reserveert nergens ruimte voor de array zelf. Als je eej dynamische array maakt zul je met bijv. setlength() de grootte van de array moeten bepalen.
dumpie schreef op 29 april 2004 @ 14:05:
SetLength(VarTime, ListTime.Count + 1);
Hij gebruikt SetLength.

edit:
Vuilak, je post aanpassen terwijl ik schrijf! :P

[ Voor 54% gewijzigd door NMe op 29-04-2004 14:12 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RobLemmens
  • Registratie: Juni 2003
  • Laatst online: 24-05 19:32
Voeg deze code eens toe en geef dan de naam van de fout die optreedt

op regel 60:

Except
on e: exception do begin
ShowMessage('Fout:' + e.Message);
end;
end;


Misschien dat je dan wel weet wat er aan de hand is.

  • dumpie
  • Registratie: Februari 2003
  • Niet online
Hoi Rob,

Ik heb nu de volgende code maar krijg geen foutmelding:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.Open1Click(Sender: TObject);
begin
 if DlgOpen.Execute then
  try
   ListTime.Items.LoadFromFile(DlgOpen.Filename);
   SetLength(VarTime, ListTime.Count + 1);
   VarI := 0;
   VarLoad := 1;
     while VarI < ListTime.Count do
      begin
       VarTime[VarI] := ListTime.Items[VarI];
       VarI := VarI + 1;
       Memo1.Lines.Add(VarTime[VarI]);
      end;
   except
   on e: exception do begin
   ShowMessage('Fout:' + e.Message);
 end;
 end;
end;


Het opsaaln zou ook goed moeten gebeuren want doe ik bijvoorbeeld dit:

Memo1.Lines.Add(VarTime[1]) dan krijg ik netjes de tijd terug.
Het vage is echter als ik dit doe: Memo1.Lines.Add(VarTime[VarI]) dan krijg ik totaal geen echo van 1 tijd terwijl dit toch goed zou moeten zijn.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 25-05 22:48

Creepy

Tactical Espionage Splatterer

Heb je al door de code heen gestapt op het moment dat je de array vult? Wat wordt erin gezet? Wat komt er in te staan?

Als je door je code heen had gestapt, dan had je gezien dat je VarI eerst ophoogt, en daarna pas een item probeert af te drukken.

[ Voor 37% gewijzigd door Creepy op 29-04-2004 14:27 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Icelus
  • Registratie: Januari 2004
  • Niet online
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.TimerTimer(Sender: TObject); 
begin 
 if VarLoad = 1 then 
  begin 
   VarI := 0; 
    while VarT = 0 do 
     begin 
      if TimeToStr(Time) = VarTime[VarI] then 
       begin 
        VarI := 0; 
        ShowMessage('Het is tijd.'); 
        exit; 
       end 
      else 
       VarI := VarI + 1; 
     end; 
  end; 
end; 


De while lus wordt nooit afgebroken (variabele VarT krijgt geen nieuwe waarde). Er zal ook op een gegeven moment buiten het array gelezen worden omdat er geen controle op de waarde van VarI is.

Developer Accused Of Unreadable Code Refuses To Comment


  • dumpie
  • Registratie: Februari 2003
  • Niet online
Icelus schreef op 29 april 2004 @ 14:28:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.TimerTimer(Sender: TObject); 
begin 
 if VarLoad = 1 then 
  begin 
   VarI := 0; 
    while VarT = 0 do 
     begin 
      if TimeToStr(Time) = VarTime[VarI] then 
       begin 
        VarI := 0; 
        ShowMessage('Het is tijd.'); 
        exit; 
       end 
      else 
       VarI := VarI + 1; 
     end; 
  end; 
end; 


De while lus wordt nooit afgebroken (variabele VarT krijgt geen nieuwe waarde). Er zal ook op een gegeven moment buiten het array gelezen worden omdat er geen controle op de waarde van VarI is.
Hiervoor zorgt toch het exit statement?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 25-05 22:48

Creepy

Tactical Espionage Splatterer

dumpie schreef op 29 april 2004 @ 14:30:
[...]


Hiervoor zorgt toch het exit statement?
Lees eens wat er gezegd wordt...... je checkt of VarT een waarde bereikt, terwijl je in je lus VarT nooit update......

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • dumpie
  • Registratie: Februari 2003
  • Niet online
Thnx creepy, ik heb het aangepast en nog eens goed nagelezen.
Afgaande op jullie reacties en heb nu de volgende code die werkt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, CheckLst, ExtCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Bestand1: TMenuItem;
    Open1: TMenuItem;
    N1: TMenuItem;
    Exit1: TMenuItem;
    DlgOpen: TOpenDialog;
    ListTime: TListBox;
    Timer: TTimer;
    Label1: TLabel;
    Memo1: TMemo;
    TimerClock: TTimer;
    procedure Exit1Click(Sender: TObject);
    procedure Open1Click(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure TimerClockTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  VarI, VarT, VarLoad: Integer;
  VarTime: Array of String;

implementation

{$R *.dfm}

procedure TForm1.Exit1Click(Sender: TObject);
begin
 Application.Terminate;
end;

procedure TForm1.Open1Click(Sender: TObject);
begin
 if DlgOpen.Execute then
  try
   ListTime.Items.LoadFromFile(DlgOpen.Filename);
   SetLength(VarTime, ListTime.Count + 1);
   VarI := 0;
     while VarI < ListTime.Count do
      begin
       VarTime[VarI] := ListTime.Items[VarI];
       VarI := VarI + 1;
      end;
   VarLoad := 1;
   Timer.Enabled := True;
  except
   ShowMessage('Fout bij laden bestand.');
  end;
end;

procedure TForm1.TimerTimer(Sender: TObject);
begin
 if VarLoad = 1 then
  begin
   VarI := 0;
    while VarI < ListTime.Count do
     begin
      if TimeToStr(Time) = VarTime[VarI] then
       begin
        VarI := 0;
        ShowMessage('Het is tijd.');
        exit;
       end
      else
       VarI := VarI + 1;
     end;
  end;
end;

procedure TForm1.TimerClockTimer(Sender: TObject);
begin
 Label1.Caption := TimeTostr(Now);
end;

end.


Thanx guys!!! _/-\o_

Ik had nu alleen nog een vraag waarom moet ik de array 1 extra plaatsje geven met setlength(... + 1) want als ik die 1 weglaat krijg ik foutmelding.
Pagina: 1