|
Registriert seit: 28. Apr 2014 46 Beiträge Delphi 10.3 Rio |
#1
Hallo zusammen,
ich habe mir ein kleines Programmchen geschrieben, was Morsecode "abspielt". Dazu nutze ich die BASS.dll. Funktioniert alles super. Nun wollte ich mein Programm meinen Freunden geben, die Windows 10 haben, ich selber arbeite auf Windows 8.1 Delphi XE3. Das Programm wirft bei ihnen beim drücken des Play-Buttons eine Access Violation aus. (Exception der Klasse $C00000005 mit der Meldung Read of adress 0x00000019). Unter Win 7 und 8.1 kommt dieser Fehler nicht. Ebenfalls kommt er nur in der Release-Version vor. Nun dachte ich, ich bin klug und debugge oldschool, mithilfe von ShowMessage oder ner Memo, nur durfte ich festestellen, dass es dann keine Exception mehr auswirft. Klar, könnte ich jetzt einfach ein unsichtbare Memo machen und immer eine Zeile schreiben, aber komisch ist die ganze sache schon, nur die Frage: Warum? Mit freundlichen Grüßen Hier die PlayButton Routine:
Delphi-Quellcode:
Und hier noch die Play Routine, falls das Problem dort ist (Achtung, etwas länger):
procedure TForm1.Button2Click(Sender: TObject);
var i: integer; begin Label11.Caption := 'Playing...'; // ShowMessage('1'); <-- Wenn aktiv, kein Fehler mehr //Memo1.Lines.Add('1'); <-- Wenn aktiv, kein Fehler mehr Button4.Enabled := true; Button2.Enabled := false; EnablePlaying(true); //schaltet manche Komponenten aus, die nicht gedrückt werden dürfen // ShowMessage('2'); <-- Wenn aktiv, kein Fehler mehr //Memo1.Lines.Add('2'); <-- Wenn aktiv, kein Fehler mehr Play(Richedit1.Lines,DitSettings,DahSettings,DitPool,DahPool); // ShowMessage('3'); <-- Wenn aktiv, kein Fehler mehr //Memo1.Lines.Add('3'); <-- Wenn aktiv, kein Fehler mehr for i := 0 to Length(DitPool) - 1 do BASS_ChannelStop(DitPool[i].SoundStream); for i := 0 to Length(DahPool) - 1 do BASS_ChannelStop(DahPool[i].SoundStream); Richedit1.SelectAll; Richedit1.SelAttributes.Color := clBlack; RichEdit1.SelLength := 0; EnablePlaying(false); Button2.Enabled := true; Button4.Enabled := false; Label11.Caption := 'Finished or Stopped'; end;
Delphi-Quellcode:
procedure TForm1.Play(Text: TStrings; DitRule, DahRule: TOutputSettings; DitSound,DahSound: TAudioFileArray);
var i,i2: Integer; CurrAudio,BeforeAudio: TAudioFile; DitBefore,DahBefore,Dur: integer; begin DitBefore := 0; DahBefore := 0; { for i := 0 to Length(DitSound) - 1 do BASS_ChannelSetAttribute(DitSound[i].SoundStream,BASS_ATTRIB_VOL,Volume); for i := 0 to Length(DahSound) - 1 do BASS_ChannelSetAttribute(DahSound[i].SoundStream,BASS_ATTRIB_VOL,Volume); } for i := 0 to Text.Count - 1 do begin for i2 := 1 to Length(Text[i]) do begin RichEdit1.SelStart := i2 - 1; RichEdit1.SelLength := 1; RichEdit1.SelAttributes.Color := clRed; // Richedit1.ClearSelection; case Text[i][i2] of '.': begin case DitRule.Rules of prRandom: begin CurrAudio := DitSound[Random(Length(DitSound) - 1)]; end; prOrder: begin if DitBefore = Length(DitSound) - 1 then DitBefore := -1; CurrAudio := DitSound[DitBefore + 1]; Inc(DitBefore); end; prSingleOnly: begin CurrAudio := DitSound[0]; end; end; case BeforeAudio.PlayHandling of phWait: begin while BASS_ChannelIsActive(BeforeAudio.SoundStream) = BASS_ACTIVE_PLAYING do begin Idle(10); end; end; phContinue: begin end; phPause: begin BASS_ChannelPause(BeforeAudio.SoundStream); end; phStop: begin BASS_ChannelStop(BeforeAudio.SoundStream); end; end; if CurrAudio.PlayHandling = phPause then BASS_ChannelPlay(CurrAudio.SoundStream,false) else BASS_ChannelPlay(CurrAudio.SoundStream,true); BeforeAudio := CurrAudio; if CurrAudio.PlayHandling <> phWait then begin if DitRule.Variance then Idle(DitRule.Duration + Random(DitRule.VarianceValue)) else Idle(DitRule.Duration); end; end; '-': begin case DahRule.Rules of prRandom: begin CurrAudio := DahSound[Random(Length(DahSound) - 1)]; end; prOrder: begin if DahBefore = Length(DahSound) - 1 then DahBefore := -1; CurrAudio := DahSound[DahBefore + 1]; Inc(DahBefore); end; prSingleOnly: begin CurrAudio := DahSound[0]; end; end; case BeforeAudio.PlayHandling of phWait: begin while BASS_ChannelIsActive(BeforeAudio.SoundStream) = BASS_ACTIVE_PLAYING do begin Idle(10); end; end; phContinue: begin end; phPause: begin BASS_ChannelPause(BeforeAudio.SoundStream); end; phStop: begin BASS_ChannelStop(BeforeAudio.SoundStream); end; end; if CurrAudio.PlayHandling = phPause then BASS_ChannelPlay(CurrAudio.SoundStream,false) else BASS_ChannelPlay(CurrAudio.SoundStream,true); BeforeAudio := CurrAudio; if CurrAudio.PlayHandling <> phWait then begin if DahRule.Variance then Idle(DahRule.Duration + Random(DahRule.VarianceValue)) else Idle(DahRule.Duration); end; end; ' ': begin case BeforeAudio.PlayHandling of phWait: begin while BASS_ChannelIsActive(BeforeAudio.SoundStream) = BASS_ACTIVE_PLAYING do begin Idle(10); end; end; phContinue: begin end; phPause: begin BASS_ChannelPause(BeforeAudio.SoundStream); end; phStop: begin BASS_ChannelStop(BeforeAudio.SoundStream); end; end; Idle(BetterSpinedit5.Value); end; '/': begin case BeforeAudio.PlayHandling of phWait: begin while BASS_ChannelIsActive(BeforeAudio.SoundStream) = BASS_ACTIVE_PLAYING do begin Idle(10); end; end; phContinue: begin end; phPause: begin BASS_ChannelPause(BeforeAudio.SoundStream); end; phStop: begin BASS_ChannelStop(BeforeAudio.SoundStream); end; end; Idle(BetterSpinedit6.Value); end; '#': begin end; end; if Stop then begin Stop := false; exit; end; RichEdit1.SelStart := i2 - 1; RichEdit1.SelLength := 1; RichEdit1.SelAttributes.Color := clLime; // Richedit1.ClearSelection; end; if Stop then begin Stop := false; exit; end; end; end; |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |