Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Metronom mit for-Schleife und sleep ?


Zyrano - Mo 14.03.11 21:26
Titel: Metronom mit for-Schleife und sleep ?
Hallo Leutz,

nachdem meine Erfahrungen mit der 3D-Engine Genesis3D ehr negativ ausgefallen sind, möchte ich mich mehr auf Windows Prgramme konzentrieren.

Ich möchte gern einen Metronom schreiben indem man die bpm einstellen kann und in den bpm-Abständen ein Klickton zu hören ist und eine Art LED (*.jpg oder sowas) blinkt. Ich weiß, dass es sowas zu hauf gibt, aber ich möchte gern meinen eigenen haben =)

Ich habe nur das Problem den Klick in den richtigen Abständen erfolgen zu lassen.

Ich habe mir überlegt, dass man eine for-schleife schreiben könnte, die erst endet wenn der Stopp-Knopf die Variable Status auf false ändert. Die for-Schleife lässt dann einen Klickton abspielen mit einem sleep-abstand den ich in eine Variable rechne (Sekunde \ bpm = Variable für sleep).


Kann man überhaupt eine Variable an sleep übergeben ?

Oder habe ich einen Denkfehler ?


btw. Ich habe erst das erste Delphibuch gelesen und noch nicht der Obercrack in der Welt von Delphi.

Greetz Zyrano

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


FinnO - Mo 14.03.11 21:30

Schau dir doch mal die Komponente TTimer an...


Zyrano - Mo 14.03.11 23:13

Also das mit TTimer hat schonmal super funktioniert =) Danke dafür.

Jetzt hab ich nur noch das Problem, dass wenn ich jetzt den Wert der BPM Variable abfrage, ob die über 200 BPM gesetzt ist (durch Edit1 Feld) und dann eine MessageBox ausgibt oder eben den Timer startet, funktioniert im Proggie nicht wirklich.
Hier mal der Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if
    BPM >= 200 then
      Application.MessageBox('Das ist kein Speedcoremetronom !'''0+16)
  else
  Timer1.Enabled := True;
end;

EDIT: Es ist egal welchen Wert ich eingebe. Entweder startet der Timer über 200 oder mal nicht, oder der Timer startet unter 200 oder auch nicht ^^

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


ALF - Mo 14.03.11 23:33

setzt du auch den Timer.Interval richtig?

ALf


Delete - Mo 14.03.11 23:36

Und was soll das 0+16? Wozu gibt es denn Konstanten?


Zyrano - Mo 14.03.11 23:37

Ich hoffe doch ^^
Ich teile 60000 millisekunden durch die eingegebene BPM und übergebe das dann an den Timer.Interval.
Auch hier mal der Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  try
  BPM := StrToInt(Edit1.Text);
  Abstand := 60000 div BPM;
  Timer1.Interval := Abstand;
  SndPlaySound( 'click.wav', SND_ASYNC );
  except
  Timer1.Enabled := False;
  Application.MessageBox('Keine BPM eingegeben !'''0+48);
  end;
end;

EDIT:
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Und was soll das 0+16? Wozu gibt es denn Konstanten?

Die 0+16 ist der OK-Knopf und das Ausrufezeichen in der MessageBox

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Delete - Mo 14.03.11 23:53

Und warum benutzt du nicht die Konstanten? oder meinst du, du weißt in zwei Woche noch für was das steht? Aber besonders schön ist das +0 und du weißt auch dass man die Konstanten mit OR verknüpft? Denn es handelt sich um Bitmasken.


ALF - Mo 14.03.11 23:56

Schmeiss alles aus der Timmerroutine raus ausser SndPlaySound( 'click.wav', SND_ASYNC );
alles ander kommt in der Buttonclick rein und das stopen des Timers nimmt man auch ein extra Button!

Alf


Zyrano - Mo 14.03.11 23:59

Weil "Delphi für Kids" mir das so beigebracht hat =)
Nein im Ernst, das ist mein erstes ernsthaftes Programm was ich schreibe. Ich blcik das alles noch nicht wirklich. Natürlich werde ich auch in Zukunft irgendwann die MessageBox Symbole in Konstanten setzen.

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
und das stopen des Timers nimmt man auch ein extra Button!

Das Stoppen habe ich in einem extra Button. Ich versuch das mal =)

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Danke ALF !

Das ist es gewesen. Ich werde mir hiter die Ohren schreiben, dass in die TimerRoutine nur das reinkommt was auch wirklich von der Timerroutine gemacht werden soll ^^
Jetzt werde ich mich mal dran machen und versuchen das gleiche mit Grafik hinzubekommen...

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ok Ok...
Jetzt tüftel ich schon wieder daran, dass ich mit dem Timer 2 bmp grafiken hin und her laden kann. Quasi wie so ein Discolicht oder sowas.
Mit TImage stellt sich das als etwas schwerer raus. wie kann ich dann am besten eine neue Grafik in den TImage laden ? Und dann auch noch so, dass das von dem Timer gesteuert wird ?

EDIT: Das laden der Grafik läuft. Aber der Wechsel noch nicht.


Narses - Di 15.03.11 01:30

Moin und :welcome: im Forum!

Für den Anfang: Nimm zwei TImage und "schalte" die mit der Eigenschaft .Visible "um". :idea: ;)

cu
Narses


Zyrano - Di 15.03.11 01:35

Ok so kann man das machen.
Allerdings leuchtet mir grad nicht ein, wie ich dem Timer sage, dass da 2 Grafiken hin und her wechseln sollen. Das mit dem visible leuchtet ein.

EDIT: Hat sich grad erledigt. Habe ich mit einer Case-Anweisung gemacht Läuft super jetzt =)

Ich danke euch für eure Hilfe =)