Autor Beitrag
Zyrano
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 14.03.11 20:26 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mo 14.03.11 20:30 
Schau dir doch mal die Komponente TTimer an...
Zyrano Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 14.03.11 22: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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mo 14.03.11 22:33 
setzt du auch den Timer.Interval richtig?

ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 14.03.11 22:36 
Und was soll das 0+16? Wozu gibt es denn Konstanten?
Zyrano Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 14.03.11 22: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:
ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 14.03.11 22: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mo 14.03.11 22: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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Zyrano Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 14.03.11 22: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 15.03.11 00:30 
Moin und :welcome: im Forum!

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

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Zyrano Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 15.03.11 00: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 =)