Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem bei Prozeduraufruf mit Variablenübergabe.
Jerk - So 23.12.07 13:53
Titel: Problem bei Prozeduraufruf mit Variablenübergabe.
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???
Delphi-Quelltext
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:
http://www.delphi-fundgrube.de/faq13.htm
Christian S. - So 23.12.07 13:59
Kommt da irgendeine Fehlermeldung? Was trägst Du in die Editfeldern ein? Ist vielleicht der Dezimaltrenner der Falsche?
LorenzS - So 23.12.07 14:05
Delphi-Quelltext
1:
| makesound(strtointdef(edit1.text,1000),strtointdef(edit2.text,1000)); |
Christian S. - 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 ;-)
LorenzS - 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 - 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.
Christian S. - 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?
Jerk - So 23.12.07 23:47
Titel: Re: Problem bei Prozeduraufruf mit Variablenübergabe.
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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!