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:
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;
Und hier noch die Play Routine, falls das Problem dort ist (Achtung, etwas länger):
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;