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)); // <-- FUNKTIONIERT NICHT
makesound(1000,1000);                                 // <-- FUNKTIONIERT
end;

procedure TForm1.MakeSound(Frequency,Duration:integer);
{writes tone to memory and plays it}
var
  WaveFormatEx : TWaveFormatEx;
  MS           : TMemoryStream;
  i, TempInt,
  DataCount,
  RiffCount    : integer;
  SoundValue   : byte;
  w            : double; // omega ( 2 * pi * frequency)
const
  Mono       : Word = $0001;
  SampleRate : integer = 11025// 8000, 11025, 22050, or 44100
  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
    {Calculate length of sound data and of file data}
    DataCount := (Duration *  SampleRate) div 1000;  // sound data
    RiffCount := Length(WaveId)
                 + Length(FmtId) + SizeOf(DWord)
                 + SizeOf(TWaveFormatEx)
                 + Length(DataId) + SizeOf(DWord)
                 + DataCount; // file data
    {write out the wave header}
    Write(RiffId[1], 4);                        // 'RIFF'
    Write(RiffCount, SizeOf(DWord));            // file data size
    Write(WaveId[1], Length(WaveId));           // 'WAVE'
    Write(FmtId[1], Length(FmtId));             // 'fmt '
    TempInt := SizeOf(TWaveFormatEx);
    Write(TempInt, SizeOf(DWord));              // TWaveFormat data size
    Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
    Write(DataId[1], Length(DataId));           // 'data'
    Write(DataCount, SizeOf(DWord));            // sound data size
    {calculate and write out the tone signal}   // now the data values
    w := 2 * Pi * Frequency;  // omega
    for i := 0 to DataCount - 1 do begin
      // wt = w *i /SampleRate
      SoundValue := 127 + trunc(127 * sin(i * w / SampleRate));
      Write(SoundValue, SizeOf(Byte));
    end;
    // you could save the wave tone to file with :
    // MS.Seek(0, soFromBeginning);
    // MS.SaveToFile('C:\MyFile.wav');
    // then reload and play them without having to
    // construct them each time.
    {now play the sound}
    sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
    MS.Free;
  end;
end{Alan Lloyd}

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.
user profile iconJerk 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); // <---- Ohne das geht es aus irgent einem grund nicht...
showmessage(inttostr(a)+inttostr(b));
MakeSound(a,b);
end;