Autor Beitrag
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: 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???
ausblenden volle Höhe 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: www.delphi-fundgrube.de/faq13.htm
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: So 23.12.07 14:05 
ausblenden Delphi-Quelltext
1:
makesound(strtointdef(edit1.text,1000),strtointdef(edit2.text,1000));					
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: So 23.12.07 14:11 
ok, strToInt verträgt nur Ziffern, keine leerzeichen, komma, punkte und buchstaben
ausblenden Delphi-Quelltext
1:
makesound(strtoint(trim(edit1.text)),strtoint(trim(edit2.text)));					
Jerk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: So 23.12.07 23:47 
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....
ausblenden 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;