Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Mediaplayer-Probleme (Absturz bei Öffnen eines neuen Clips) (https://www.delphipraxis.net/36299-mediaplayer-probleme-absturz-bei-oeffnen-eines-neuen-clips.html)

SvenLittkowski 18. Dez 2004 09:56


Mediaplayer-Probleme (Absturz bei Öffnen eines neuen Clips)
 
Hallo.

Zielsetzung:
Ein Programm, in dem AVI-Videoclips abgespielt werden. Jedem Videoclip ist ein Button zugeordnet, mit welchenm der Clip aufgerufen wird. Ein eventuell gerade spielender Clip soll dann auch gestoppt werden, um den neuen zu zeigen. Jederzeit soll jeder Clip abspielbar sein (und damit den vorherigen abbrechen).

Problem:
Sobald erstmal ein Clip gelaufen ist, verursacht das Drücken eines Buttons jedesmal einen Programmabsturz.

Frage:
Ich benötige daher dringend den Sourcecode von Routinen, die überprüfen, ob noch ein Clip gespielt wird bzw. offen ist, und dann in diesem Fall den Clip ordnungsgemäß schließt und den neuen gewünschten Clip OHNE FEHLER abspielt. Ich benutze Delphi 7 (da ich noch nicht hier das Delphi 2005 gewonnen habe). Auf Wunsch werde ich natürlich weitere Fragen beantworten.

Anmerkung:
Ich dachte, dies sei recht einfach, aber nachdem alle meine Versuche konsequent bis jetzt scheiterten, scheint es mir, das ich irgendwo einem grundsätzlichem Denkfehler unterliege. Daher wende ich mich an Euch mit der Bitte um Hilfe.

Sven

Birzenbae 18. Dez 2004 10:35

Re: Mediaplayer-Probleme (Absturz bei Öffnen eines neuen Cli
 
gib mal deinen bisherigen code zu dem problem frei sonst können wir dir nicht genau helfen.

SvenLittkowski 18. Dez 2004 11:01

Re: Mediaplayer-Probleme (Absturz bei Öffnen eines neuen Cli
 
Hier ist der vollständige Code.

Erläuterung:
es gibt drei Fenster.
Box1 - Hintergrund der Anwendung mit TProgressBar
Box2 - Enthält alle Buttons und andere Komponenten, kann verschoben werden
Box3 - Enthält TPanel als Anzeige

Box1 öffnet automatisch Box2 und Box3.
Box2 lädt automatisch ein "Intro"-Video.

WICHTIGE ÄNDERUNG:
Nun gibt es nur noch einen Start- und einen Stop-Button, die Filme werden über TRadioButton ausgewählt.

Delphi-Quellcode:
unit Box2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IAeverButton, jpeg, ExtCtrls, MPlayer;

type
  TFormBeta = class(TForm)
    ButtonPlay: TIAeverButton;
    ButtonStop: TIAeverButton;
    ImagePlayer: TImage;
    Player: TMediaPlayer;
    TimerPrologue: TTimer;
    ButtonEnde: TIAeverButton;
    ButtonAbout: TIAeverButton;
    RadioButtonIntro: TRadioButton;
    RadioButtonInfo: TRadioButton;
    RadioButtonEDV: TRadioButton;
    RadioButtonKommunikation: TRadioButton;
    RadioButtonVertrieb: TRadioButton;
    RadioButtonLeitung: TRadioButton;
    RadioButtonAccounting: TRadioButton;
    RadioButtonHandling: TRadioButton;
    RadioButtonLanguages: TRadioButton;
    Label1: TLabel;
    TimerNotify: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure TimerPrologueTimer(Sender: TObject);
    procedure ImagePlayerMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ImagePlayerMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ColorsH(Sender: TObject);
    procedure ColorsN(Sender: TObject);
    procedure ButtonPlayMouseExit(sender: TObject);
    procedure ButtonPlayMouseEnter(sender: TObject);
    procedure Button09MouseEnter(sender: TObject);
    procedure ButtonEndeMouseEnter(sender: TObject);
    procedure ButtonAboutMouseEnter(sender: TObject);
    procedure ButtonStopMouseEnter(sender: TObject);
    procedure ButtonForeMouseEnter(sender: TObject);
    procedure ButtonEndeMouseExit(sender: TObject);
    procedure ButtonAboutMouseExit(sender: TObject);
    procedure ButtonStopMouseExit(sender: TObject);
    procedure ButtonPlayClick(Sender: TObject);
    procedure ButtonEndeClick(Sender: TObject);
    procedure PlayerNotify(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
    procedure TimerNotifyTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
 ModeStr:  array[TMPModes] of string=('Not ready', 'Stopped', 'Playing', 'Recording', 'Seeking', 'Paused', 'Open');

var
  FormBeta: TFormBeta;
  StartX:  Integer;
  StartY:  Integer;
  Status:  String;

implementation

uses Box1, Box3;

{$R *.dfm}

procedure TFormBeta.FormCreate(Sender: TObject);
begin
 FormBeta.Width:=ImagePlayer.Width;
 FormBeta.Height:=ImagePlayer.Height;
 Player.Notify:=True;
end;

procedure TFormBeta.FormShow(Sender: TObject);
begin
 Player.FileName:='T_Intro.avi';
 Player.Open;
 Player.DisplayRect:=FormDelta.PanelMovie.ClientRect;
 Player.TimeFormat:=tfHMS;
 FormAlpha.Progress.Maximum:=Player.Length;
 FormAlpha.Progress.Position:=0;
 Player.Play;
 ButtonEnde.Font.Name:='System';
 ButtonStop.Font.Name:='System';
 ButtonPlay.Font.Name:='System';
 ButtonAbout.Font.Name:='System';
end;

procedure TFormBeta.TimerPrologueTimer(Sender: TObject);
begin
 FormAlpha.Progress.Position:=Player.Position;
 Player.DisplayRect:=FormDelta.PanelMovie.ClientRect;
 if Player.Position=Player.Length then
 begin
  FormAlpha.Progress.Position:=0;
  FormAlpha.Progress.Visible:=False;
 end;
end;

procedure TFormBeta.ImagePlayerMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 StartX:=X;
 StartY:=Y;
end;

procedure TFormBeta.ImagePlayerMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
 if ssLeft in Shift then
 begin
  if X>StartX then
  begin
   FormBeta.Left:=FormBeta.Left+(X-StartX);
   FormDelta.Left:=FormBeta.Left+182;
  end
  else
  if X<StartX then
  begin
   FormBeta.Left:=FormBeta.Left-(StartX-X);
   FormDelta.Left:=FormBeta.Left+182;
  end;
  if Y>StartY then
  begin
   FormBeta.Top:=FormBeta.Top+(Y-StartY);
   FormDelta.Top:=FormBeta.Top+44;
  end
  else
  if Y<StartY then
  begin
   FormBeta.Top:=FormBeta.Top-(StartY-Y);
   FormDelta.Top:=FormBeta.Top+44;
  end;
 end;
end;

procedure TFormBeta.ColorsH(Sender: TObject);
begin
 with Sender as TIAeverButton do
 begin
  if ButtonColor=$002E4881 then
  begin
   ButtonColor:=$00106EB8;
   ButtonColor1:=$0024365B;
   Font.Color:=$00FFFFFF;
  end
  else
  if ButtonColor=$0092A8C7 then
  begin
   ButtonColor:=$009CD7F3;
   ButtonColor1:=$009CD7F3;
   Font.Color:=$00FFFFFF;
  end;
 end;
end;

procedure TFormBeta.ColorsN(Sender: TObject);
begin
 with Sender as TIAeverButton do
 begin
  if ButtonColor=$00106EB8 then
  begin
   ButtonColor:=$002E4881;
   ButtonColor1:=$0024365B;
   Font.Color:=$0092A8C7;
  end
  else
  if ButtonColor=$009CD7F3 then
  begin
   ButtonColor:=$0092A8C7;
   ButtonColor1:=$0092A8C7;
   Font.Color:=$00000000;
  end;
 end;
end;

procedure TFormBeta.ButtonPlayMouseExit(sender: TObject);
begin
 ColorsN(Sender);
end;

procedure TFormBeta.ButtonPlayMouseEnter(sender: TObject);
begin
 ColorsH(Sender);
end;

procedure TFormBeta.Button09MouseEnter(sender: TObject);
begin
 ColorsH(Sender);
end;

procedure TFormBeta.ButtonEndeMouseEnter(sender: TObject);
begin
 ColorsH(Sender);
end;

procedure TFormBeta.ButtonAboutMouseEnter(sender: TObject);
begin
 ColorsH(Sender);
end;

procedure TFormBeta.ButtonStopMouseEnter(sender: TObject);
begin
 ColorsH(Sender);
end;

procedure TFormBeta.ButtonForeMouseEnter(sender: TObject);
begin
 ColorsH(Sender);
end;

procedure TFormBeta.ButtonEndeMouseExit(sender: TObject);
begin
 ColorsN(Sender);
end;

procedure TFormBeta.ButtonAboutMouseExit(sender: TObject);
begin
 ColorsN(Sender);
end;

procedure TFormBeta.ButtonStopMouseExit(sender: TObject);
begin
 ColorsN(Sender);
end;

procedure TFormBeta.ButtonPlayClick(Sender: TObject);
begin
 if RadioButtonIntro.Checked=True then Player.FileName:='T_Intro.avi'
 else
 if RadioButtonInfo.Checked=True then Player.FileName:='T_Info.avi'
 else
 if RadioButtonEDV.Checked=True then Player.FileName:='T_EDV.avi'
 else
 if RadioButtonHandling.Checked=True then Player.FileName:='T_GroupEventHandling.avi'
 else
 if RadioButtonKommunikation.Checked=True then Player.FileName:='T_Bürokommunikation.avi'
 else
 if RadioButtonLanguages.Checked=True then Player.FileName:='T_Language.avi'
 else
 if RadioButtonVertrieb.Checked=True then Player.FileName:='T_Vertriebssystem.avi'
 else
 if RadioButtonLeitung.Checked=True then Player.FileName:='T_Travel.avi'
 else
 if RadioButtonAccounting.Checked=True then Player.FileName:='T_Accounting.avi';
 Player.Open;
 Player.DisplayRect:=FormDelta.PanelMovie.ClientRect;
 Player.TimeFormat:=tfHMS;
 FormAlpha.Progress.Maximum:=Player.Length;
 FormAlpha.Progress.Position:=0;
 Player.Play;
end;

procedure TFormBeta.ButtonEndeClick(Sender: TObject);
begin
 Application.Terminate;
end;

procedure TFormBeta.PlayerNotify(Sender: TObject);
begin
 with Sender as TMediaPlayer do
 begin
  Notify:=True;
  if ModeStr[Mode]='Playing' then
  begin
   Label1.caption:=ModeStr[Mode];
   TimerPrologue.Enabled:=True;
   FormAlpha.Progress.Position:=0;
   FormAlpha.Progress.Visible:=True;
   ButtonPlay.Enabled:=False;
   ButtonStop.Enabled:=True;
   RadioButtonIntro.Font.Color:=$0024365B;
   RadioButtonInfo.Font.Color:=$0024365B;
   RadioButtonEDV.Font.Color:=$0024365B;
   RadioButtonHandling.Font.Color:=$0024365B;
   RadioButtonKommunikation.Font.Color:=$0024365B;
   RadioButtonLanguages.Font.Color:=$0024365B;
   RadioButtonVertrieb.Font.Color:=$0024365B;
   RadioButtonLeitung.Font.Color:=$0024365B;
   RadioButtonAccounting.Font.Color:=$0024365B;
   Notify:=True;
  end
  else
  if ModeStr[Mode]<>'Playing' then
  begin
   Label1.caption:=ModeStr[Mode];
   TimerPrologue.Enabled:=False;
   FormAlpha.Progress.Position:=0;
   FormAlpha.Progress.Visible:=False;
   ButtonPlay.Enabled:=True;
   ButtonStop.Enabled:=False;
   RadioButtonIntro.Font.Color:=$002E4881;
   RadioButtonInfo.Font.Color:=$002E4881;
   RadioButtonEDV.Font.Color:=$002E4881;
   RadioButtonHandling.Font.Color:=$002E4881;
   RadioButtonKommunikation.Font.Color:=$002E4881;
   RadioButtonLanguages.Font.Color:=$002E4881;
   RadioButtonVertrieb.Font.Color:=$002E4881;
   RadioButtonLeitung.Font.Color:=$002E4881;
   RadioButtonAccounting.Font.Color:=$002E4881;
   Notify:=True;
  end;
  Notify:=True;
 end;
end;

procedure TFormBeta.ButtonStopClick(Sender: TObject);
begin
 Player.Close;
 Player.FileName:='';
end;

procedure TFormBeta.TimerNotifyTimer(Sender: TObject);
begin
 Player.Notify:=True;
 Label1.caption:=ModeStr[Player.Mode];
end;

end.
Wie man sieht, habe ich schon erfolglos versucht, mehrere Wege zu gehen (z.B. Notify).

Vielen aufrechten Dank für Eure Hilfe.

Sven

SvenLittkowski 18. Dez 2004 11:03

Re: Mediaplayer-Probleme (Absturz bei Öffnen eines neuen Cli
 
Box1 = FormAlpha
Box2 = FormBeta
Box3 = FormDelta

Sven

Birzenbae 18. Dez 2004 11:10

Re: Mediaplayer-Probleme (Absturz bei Öffnen eines neuen Cli
 
versuchs mal so
Delphi-Quellcode:
procedure TFormBeta.ButtonPlayClick(Sender: TObject);
begin
Player.Close; //bzw. Player.Stop;
.....
end;
das müsste helfen

SvenLittkowski 18. Dez 2004 11:55

Re: Mediaplayer-Probleme (Absturz bei Öffnen eines neuen Cli
 
Ich meine, dies hatte ich bereits ausprobiert, aber ich will sichergehen. Ich werde es also auf diese Art probieren, und mein Resultat hier wieder posten (wohl am Sonntag).

Danke, soweit.

Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 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