Autor |
Beitrag |
Jerk
      
Beiträge: 251
Vista Ultimate, Ubuntu
Turbo Delphi 2006
|
Verfasst: So 23.12.07 13:53
Vorweg, ich hoffe ich bin nicht in der falschen Forenecke-
Aus irgend einem Grund spielt Delphi keinen Ton ab wenn ich den oberen Aufruf im Button1Click verwende.
Ich habe dazu auch probiert es vorher in Variablen zu schreiben und dann zu übergeben aber auch ohne Erfolg.
Warum funktioniert der erste Aufruf nicht???
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:
| procedure TForm1.Button1Click(Sender: TObject); begin makesound(strtoint(edit1.text),strtoint(edit2.text)); makesound(1000,1000); end;
procedure TForm1.MakeSound(Frequency,Duration:integer);
var WaveFormatEx : TWaveFormatEx; MS : TMemoryStream; i, TempInt, DataCount, RiffCount : integer; SoundValue : byte; w : double; const Mono : Word = $0001; SampleRate : integer = 11025; RiffId : string = 'RIFF'; WaveId : string = 'WAVE'; FmtId : string = 'fmt '; DataId : string = 'data'; begin with WaveFormatEx do begin wFormatTag := WAVE_FORMAT_PCM; nChannels := Mono; nSamplesPerSec := SampleRate; wBitsPerSample := $0008; nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; nBlockAlign := (nChannels * wBitsPerSample) div 8; cbSize := 0; end; MS := TMemoryStream.Create; with MS do begin DataCount := (Duration * SampleRate) div 1000; RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWord) + SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWord) + DataCount; Write(RiffId[1], 4); Write(RiffCount, SizeOf(DWord)); Write(WaveId[1], Length(WaveId)); Write(FmtId[1], Length(FmtId)); TempInt := SizeOf(TWaveFormatEx); Write(TempInt, SizeOf(DWord)); Write(WaveFormatEx, SizeOf(TWaveFormatEx)); Write(DataId[1], Length(DataId)); Write(DataCount, SizeOf(DWord)); w := 2 * Pi * Frequency; for i := 0 to DataCount - 1 do begin SoundValue := 127 + trunc(127 * sin(i * w / SampleRate)); Write(SoundValue, SizeOf(Byte)); end; sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC); MS.Free; end; end; |
Quelle von der Makesoundprozedur: www.delphi-fundgrube.de/faq13.htm
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 23.12.07 13:59
Kommt da irgendeine Fehlermeldung? Was trägst Du in die Editfeldern ein? Ist vielleicht der Dezimaltrenner der Falsche?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
LorenzS
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: So 23.12.07 14:05
Delphi-Quelltext 1:
| makesound(strtointdef(edit1.text,1000),strtointdef(edit2.text,1000)); |
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 23.12.07 14:07
@LorenzS: Das bekämpft vielleicht das Symptom, aber nicht die Ursache. Wenn es nur mit StrToIntDef geht, wird der Defaultwert benutzt und dann kann er sich die Eingabe ins Editfeld ganz sparen 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
LorenzS
      
Beiträge: 128
MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
|
Verfasst: So 23.12.07 14:11
ok, strToInt verträgt nur Ziffern, keine leerzeichen, komma, punkte und buchstaben
Delphi-Quelltext 1:
| makesound(strtoint(trim(edit1.text)),strtoint(trim(edit2.text))); |
|
|
Jerk 
      
Beiträge: 251
Vista Ultimate, Ubuntu
Turbo Delphi 2006
|
Verfasst: So 23.12.07 23:39
Wenn ich in jedes editfeld einfach nur 1000 eintippe, keine Sonderzeichen oder anderes, halt nen reinen integer wert, geht es trotzdem nicht...
Es kommt garkeine Fehlermeldung, es spielt einfach nur keinen Ton ab, hingegen bei Makesound(100,5000) z.B. schon.
Zuletzt bearbeitet von Jerk am So 23.12.07 23:45, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 23.12.07 23:44
Kommt denn eine Fehlermeldung?
Wenn Du den Wert der Editfelder erst einmal in Variablen vom Typ Integer packst und dann mal einen Breakpoint setzt: Welchen Wert haben die Variablen dann?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Jerk 
      
Beiträge: 251
Vista Ultimate, Ubuntu
Turbo Delphi 2006
|
Verfasst: So 23.12.07 23:47
Jerk hat folgendes geschrieben: |
Ich habe dazu auch probiert es vorher in Variablen zu schreiben und dann zu übergeben aber auch ohne Erfolg.
|
Showmessage zeigt korrekte Werte für die Variablen an, keine Fehlermeldung, garnix.
Ich verstehe nicht wieso alles immer an solch primitiven Sachen hängen bleiben muss, ich denke das da Delphi selbst einen Fehler macht, wo auch immer.
Edit habe es hinbekommen, wundern tut mich die ganze Sache jedoch....
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var a,b:integer; begin a:=strtoint(edit2.Text); b:=strtoint(edit1.Text); sleep(1000); showmessage(inttostr(a)+inttostr(b)); MakeSound(a,b); end; |
|
|
|