AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zugriffsverletzung - Audioplayer
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung - Audioplayer

Ein Thema von smepal · begonnen am 19. Jul 2006 · letzter Beitrag vom 19. Jul 2006
Antwort Antwort
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#1

Zugriffsverletzung - Audioplayer

  Alt 19. Jul 2006, 08:10
Also ich bin gerade dabei einen MP3 Player zu programmieren. Dabei hat auch zunächst alles funktioniert, solange ich meine Playlist im selben Formular hatte, wie den Mediaplayer. Jetzt habe ich für die Playlist ein eigenes Formular erstellt und auch die Pfade geändert. Allerdings bekomme ich jetzt Zugriffsverletzungsmeldungen beim Klicken auf die Mediaplayer Buttons.

Hier der Code:

Die Unit des Hauptformulars:
Delphi-Quellcode:
unit maplayer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ShellCtrls, Grids, ValEdit, StdCtrls, Buttons, mmsystem,
  MPlayer, ExtCtrls, Gauges;

//Tabelle für die Playlist mit Titel, Länge und Speicherort des Tracks

type
  Tplaylist = record
    title: string;
    length: integer;
    datei: string;
end;


  TForm1 = class(TForm)
    openmp3: TOpenDialog;
    MediaPlayer1: TMediaPlayer;
    Timer1: TTimer;
    SpeedButton1: TSpeedButton;
    Bevel1: TBevel;
    Title: TLabel;
    Length: TLabel;
    Left: TLabel;
    Timer2: TTimer;
    position: TProgressBar;
    Pause: TSpeedButton;
    m3uopen: TOpenDialog;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    procedure FormShow(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure PauseClick(Sender: TObject);
    procedure positionMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer2Timer(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;



var
  Form1: TForm1;
  pos, noft, tpassd: Integer; //Trackposition, Azahl der Tracks, Vergangene Zeit des Aktuellen Tracks
  list: array of Tplaylist; //deklarieren der oben vereinbarten Tabelle für die Playlist
  //list hat immer den gleichen Index wie die Listbox playlist
  m3u: TStringlist;

  implementation

uses suchen, pl;


{$R *.dfm}
// Der Timer1 ist für das automatische weitergehen in der Playlist bei Trackende verantwortlich
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer2.Enabled := false;
mediaplayer1.stop;
//Der nächste Track wird ausgewählt und an den Mediaplayer übergeben
//Die Infos´werden angezeigt
pos := pos + 1;
mediaplayer1.FileName := list[pos].datei;
mediaplayer1.Open;
title.Caption := list[pos].Title;
length.caption := inttostr((mediaplayer1.tracklength[pos] div 1000) div 60)+ ' : ' + inttostr((mediaplayer1.TrackLength[pos] div 1000) mod 60);
left.Caption := inttostr(mediaplayer1.tracklength[pos] div 1000);
//Die Positionsanzeige wird eingerichtet
position.Max := mediaplayer1.TrackLength[pos];
timer1.Interval := mediaplayer1.TrackLength[0];
//Start des Abspielvorgangs
tpassd := 0;
position.Position := 0;
timer1.Enabled := true;
timer2.Enabled := true;
Mediaplayer1.Play;

end;
// Bei einfachem Klicken auf Play soll der markierte Track in der Playlist abgespielt werden
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
mediaplayer1.Stop;
mediaplayer1.Close;
timer2.Enabled := false;
timer1.Enabled := false;
mediaplayer1.Open;
mediaplayer1.FileName := list[pos].datei;

length.caption := inttostr((mediaplayer1.tracklength[0] div 1000) div 60)+ ' : ' + inttostr((mediaplayer1.TrackLength[pos] div 1000) mod 60);
left.Caption := inttostr(mediaplayer1.tracklength[0] div 1000);
position.Max := mediaplayer1.TrackLength[0];
title.Caption := list[pos].Title;


timer1.Interval := mediaplayer1.TrackLength[0];
timer1.Enabled := true;
tpassd := 0;
position.Position := 0;
timer2.Enabled := true;
Mediaplayer1.Play;


end;
// Timer2 ist zum anzeigen der übriggebliebenen Zeit da, sowie zum Weiterschreiten der Positionsanzeige
procedure TForm1.Timer2Timer(Sender: TObject);
begin
tpassd := tpassd + 1;
left.Caption := inttostr ((mediaplayer1.TrackLength[pos] div 1000) - tpassd);
position.position := position.position + 1000;
end;


//Springen des Tracks an die auf der Positionsanzeige ausgewählte Stelle
procedure TForm1.positionMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
position.position := round((x / position.width) * mediaplayer1.TrackLength[0]);
mediaplayer1.Stop;
timer1.Enabled := false;
tpassd := position.position div 1000;
left.Caption := inttostr ((mediaplayer1.TrackLength[pos] div 1000) - tpassd);
mediaplayer1.Startpos := position.position;
timer1.Interval := mediaplayer1.TrackLength[0] - position.position;
timer1.Enabled := true;
mediaplayer1.Play;
end;


//Pausieren des Tracks
procedure TForm1.PauseClick(Sender: TObject);
begin
if timer1.Enabled then
begin
mediaplayer1.Pause;
timer1.Enabled := false;
timer2.enabled := false;
end
else
begin
mediaplayer1.Pause;
timer1.Enabled := true;
timer2.enabled := true;
end;
end;

//Zurück
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
pos := pos - 2;


//-------Timer Procedur ------------//
timer2.Enabled := false;
mediaplayer1.stop;
pos := pos + 1;
mediaplayer1.FileName := list[pos].datei;
mediaplayer1.Open;
title.Caption := list[pos].Title;
length.caption := inttostr((mediaplayer1.tracklength[pos] div 1000) div 60)+ ' : ' + inttostr((mediaplayer1.TrackLength[pos] div 1000) mod 60);
left.Caption := inttostr(mediaplayer1.tracklength[pos] div 1000);
position.Max := mediaplayer1.TrackLength[pos];

timer1.Interval := mediaplayer1.TrackLength[0];
timer1.Enabled := true;
tpassd := 0;
position.Position := 0;
timer2.Enabled := true;
Mediaplayer1.Play;
//-----------------------------------//
end;


//Vor
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin



//-------Timer Procedur ------------//
timer2.Enabled := false;
mediaplayer1.stop;
pos := pos + 1;
mediaplayer1.FileName := list[pos].datei;
mediaplayer1.Open;
title.Caption := list[pos].Title;
length.caption := inttostr((mediaplayer1.tracklength[pos] div 1000) div 60)+ ' : ' + inttostr((mediaplayer1.TrackLength[pos] div 1000) mod 60);
left.Caption := inttostr(mediaplayer1.tracklength[pos] div 1000);
position.Max := mediaplayer1.TrackLength[pos];

timer1.Interval := mediaplayer1.TrackLength[0];
timer1.Enabled := true;
tpassd := 0;
position.Position := 0;
timer2.Enabled := true;
Mediaplayer1.Play;
//-----------------------------------//
end;


//Stop
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
mediaplayer1.Stop;
 pos := 0;
 tpassd := 0;
timer1.Enabled := false;
timer1.Interval := 0;
timer2.Enabled := false;
position.Position := 0;
left.Caption := '0:00';
length.Caption := '0:00';
title.Caption := '';
form3.playlist.ItemIndex := 0;
end;

//Anzeigen der Playlist
procedure TForm1.FormShow(Sender: TObject);
begin
form3.Show;
form1.Top := 0;
end;

end.
Die Unit der Playlist:

Delphi-Quellcode:
unit pl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;
//Playlist-Tabelle
type
  Tplaylist = record
    title: string;
    length: integer;
    datei: string;
    end;
    //Auslesen des ID3 Tags-Tabelle
    Type
  TID3Tag = record
    ID: string[3];
    Titel: string[30];
    Artist: string[30];
    Album: string[30];
    Year: string[4];
    Comment: string[30];
    Genre: byte;
    dauer: longint; //in sekunden;
    sample: integer;
    bits: byte;
    vers: byte;
    layers: byte;
end;

type
  TForm3 = class(TForm)
    playlist: TListBox;
    Add: TButton;
    Button1: TButton;
    Button2: TButton;
    MainMenu1: TMainMenu;
    Neu1: TMenuItem;
    Play1: TMenuItem;
    Playlist1: TMenuItem;
    Lschen1: TMenuItem;
    ffnen1: TMenuItem;
    Speichern1: TMenuItem;
    Suchennach1: TMenuItem;
    Artist1: TMenuItem;
    itle1: TMenuItem;
    Album1: TMenuItem;
    procedure itle1Click(Sender: TObject);
    procedure ffnen1Click(Sender: TObject);
    procedure Lschen1Click(Sender: TObject);
    procedure Play1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure playlistKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure AddClick(Sender: TObject);
    procedure playlistDblClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;




const
  MPEG_BIT_RATES : array[1..3] of array[1..3] of array[0..15] of word =
  { Version 1, Layer I }
    (((0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0),
  { Version 1, Layer II }
    (0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0),
  { Version 1, Layer III }
    (0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0)),
  { Version 2, Layer I }
    ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0),
  { Version 2, Layer II }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0),
  { Version 2, Layer III }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)),
  { Version 2.5, Layer I }
    ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0),
  { Version 2.5, Layer II }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0),
  { Version 2.5, Layer III }
    (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)));

  sample_rates: array[1..3] of array [0..3] of word=
    ((44100,48000,32000,0),
    (22050,24000,16000,0),
    (11025,12000,8000,0));

var
  Form3: TForm3;
  pos, noft, tpassd: Integer; //Trackposition, Azahl der Tracks, Vergangene Zeit des Aktuellen Tracks
  list: array of Tplaylist; //deklarieren der oben vereinbarten Tabelle für die Playlist
  //list hat immer den gleichen Index wie die Listbox playlist
  ID3Tag: TID3Tag;
  m3u: TStringlist;
implementation

uses maplayer, suchen;

{$R *.dfm}
//-------------------------------------//
procedure Lese_ID3Tag(Filename: string);
var
  Buffer: array[1..128] of char;
  F: File;
  mp3hdrread: array[1..4] of byte;
  mp3hdr: longint absolute mp3hdrread;
  tempbyte, bitrateindex, versionindex: byte;
  bitrate, version, layer, groese: longint;
begin
  AssignFile(F, Filename);

  Reset(F,1);
  groese:=filesize(f);
  blockread(f,mp3hdrread,4);
  tempbyte:=mp3hdrread[1];
  mp3hdrread[1]:=mp3hdrread[4];
  mp3hdrread[4]:=tempbyte;
  tempbyte:=mp3hdrread[2];
  mp3hdrread[2]:=mp3hdrread[3];
  mp3hdrread[3]:=tempbyte;

  reset(f,1);
  Seek(F,FileSize(F)-128);
  BlockRead(F, Buffer, SizeOf(Buffer));
  CloseFile(F);
  bitrateindex:=((mp3hdr shr 12) and $F);
  versionindex:=((mp3hdr shr 19) and $3);

  case versionindex of
    0: version:=3;
    1: version:=0; //unbekannt
    2: version:=2;
    3: version:=1;
  end;

  layer:=4-((mp3hdr shr 17) and $3);

  if version<>0 then
    bitrate:=MPEG_BIT_RATES[version][layer][bitrateindex]
  else
    bitrate:=128;

  with ID3Tag do
  begin
    ID:=copy(Buffer,1,3);
    Titel:=copy(Buffer,4,30);
    Artist:=copy(Buffer,34,30);
    Album:=copy(Buffer,64,30);
    Year:=copy(Buffer,94,4);
    Comment:=copy(Buffer,98,30);
    Genre:=ord(Buffer[128]);
    sample:=sample_rates[version][((mp3hdr shr 10) and $3)];
    dauer:=(groese*8) div ((bitrate)*1000);
    bits:=bitrate;
    vers:=version;
    layers:=layer;
  end;
end;

//------------------------------------------------//

// Zum Abspielen des doppelt angeklickten Tracks // Funktioniert //
procedure TForm3.playlistDblClick(Sender: TObject);
begin
form1.timer2.Enabled := false;
form1.title.Caption := list[playlist.itemindex].Title;
form1.mediaplayer1.FileName := list[playlist.itemindex].datei;
pos := playlist.ItemIndex;
form1.mediaplayer1.Open;
form1.timer1.Interval := form1.mediaplayer1.TrackLength[0];
form1.timer1.Enabled := true;
tpassd := 0;
form1.left.Caption := inttostr(form1.mediaplayer1.tracklength[pos] div 1000);
form1.position.Max := form1.mediaplayer1.TrackLength[0];
form1.position.Position := 0;
form1.timer2.Enabled := true;

form1.Mediaplayer1.Play;
form1.length.caption := inttostr((form1.mediaplayer1.tracklength[pos] div 1000) div 60)+ ' : ' + inttostr((form1.mediaplayer1.TrackLength[pos] div 1000) mod 60);

end;

//______Hinzufügen von einzelnen MP3´s________//
procedure TForm3.AddClick(Sender: TObject);
var i: Integer;
datei: String;
begin
if form1.openmp3.Execute then
begin

SetLength(list, 100000);
for i := 0 to form1.openmp3.Files.Count - 1 do
begin

datei := form1.openmp3.Files[i];
Lese_ID3Tag(datei);
list[i+noft].title := ID3Tag.Titel;
list[i+noft].length := ID3Tag.dauer;
list[i+noft].datei := datei;
if not (list[i+noft].title = '') then
playlist.Items.add (list[i+noft].title)
else
playlist.Items.add(form1.openmp3.filename);
end;
end;
noft := playlist.items.count;
end;

//Laden einer m3u Playlist
procedure TForm3.Button1Click(Sender: TObject);
var i,e, position: Integer;
datei : String;
begin
playlist.Clear;
noft := 0;
SetLength(list, 100000);
m3u := TStringlist.Create;
  if form1.m3uopen.Execute then
  begin
    m3u.LoadFromFile(form1.m3uopen.filename);
    if m3u.Strings[0] = '#EXTM3Uthen
      begin
      e := 0;
      for i := 0 to m3u.Count - 1 do
        begin
        position := ansipos ('#' , m3u.Strings[i]);
        if not (position = 1) then
          begin
            try
            datei := m3u.Strings[i];
            Lese_ID3Tag(datei);
            list[e].title := ID3Tag.Titel;
            list[e].length := ID3Tag.dauer;
            list[e].datei := datei;
            playlist.Items.add (list[e].title);
            except
             datei := m3u.Strings[e];
             playlist.Items.add (datei);
            end;
            e := e+1;
          end;
        end;
      noft := playlist.items.count;
      form3.Caption := form1.m3uopen.FileName;
      end
    else
    showmessage ('Keine gültige m3u-Playlist!');

  end;

end;


//Aufrufen der Suchfunktion
procedure TForm3.Button2Click(Sender: TObject);
begin
form2.showmodal;
end;

procedure TForm3.playlistKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key = ord('S') ) then
form2.showmodal;
end;


procedure TForm3.FormCreate(Sender: TObject);
begin
form3.Left := 0;
form3.Top := form1.Top + form1.Height + 10;
end;

procedure TForm3.Play1Click(Sender: TObject);
begin
add.Click;
end;

procedure TForm3.Lschen1Click(Sender: TObject);
begin
playlist.Clear;
pos := 0;
noft := 0;
end;

procedure TForm3.ffnen1Click(Sender: TObject);
begin
button1.Click;
end;

procedure TForm3.itle1Click(Sender: TObject);
begin
form2.ShowModal;
end;

end.

Die Unit fürs Tracksuchen:
(Funktioniert einwandfrei!)
Delphi-Quellcode:
unit suchen;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    search: TEdit;
    result: TListBox;
    procedure resultDblClick(Sender: TObject);
    procedure searchChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

uses maplayer, pl;

{$R *.dfm}

procedure TForm2.searchChange(Sender: TObject);
var no, i, pos: Integer;
begin
result.clear;
no := form3.playlist.items.count;
for i := 0 to no - 1 do
begin
pos := ansipos(search.Text, form3.playlist.items[i]);
if pos > 0 then
result.Items.add(form3.playlist.Items[i]);

end;
end;

procedure TForm2.resultDblClick(Sender: TObject);
var i: Integer;
begin
for i := 0 to form3.playlist.Count - 1 do
begin
if form3.playlist.Items[i] = result.Items[result.itemindex] then
form3.playlist.ItemIndex := i;
end;
form2.close;

end;

end.

So und hier noch mal alles zum Runterladen:
Angehängte Dateien
Dateityp: rar audioplayer_180.rar (221,3 KB, 18x aufgerufen)
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Zugriffsverletzung - Audioplayer

  Alt 19. Jul 2006, 08:32
klick
  Mit Zitat antworten Zitat
Benutzerbild von smepal
smepal

Registriert seit: 25. Okt 2005
Ort: Bechen
58 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Zugriffsverletzung - Audioplayer

  Alt 19. Jul 2006, 09:21
Ich hab den Quelltext jetzt kommentiert!
Martin Krämer
Be water my friend!!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz