Einzelnen Beitrag anzeigen

tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#1

Access Violation unter Win 10

  Alt 28. Mai 2018, 15:38
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;
  Mit Zitat antworten Zitat