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
Narses: Ü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
Narses: 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:
Luckie hat folgendes geschrieben : |
| 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
Narses: 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.
ALF hat folgendes geschrieben : |
| 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
Narses: 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
Narses: 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 =)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!