2013-07-14 43 views
0

我从Delphi XE4附带的FireMonkey MediaPlayerHD示例 程序中解除了此代码段。我从来没有见过使用这种方式的Tag属性。什么是 这样做的目的?这个FireMonkey TrackBar1.Tag为什么用这种方式?

procedure TForm240.Timer1Timer(Sender: TObject); 
begin 
    TrackBar1.Tag := 1; 
    TrackBar1.Value := MediaPlayer1.CurrentTime; 
    TrackBar1.Tag := 0; 
end; 

更新: 下面是完整的源代码:

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

// This software is Copyright (c) 2012 Embarcadero Technologies, Inc. 
// You may only use this software if you are an authorized licensee 
// of Delphi, C++Builder or RAD Studio (Embarcadero Products). 
// This software is considered a Redistributable as defined under 
// the software license agreement that comes with the Embarcadero Products 
// and is subject to that software license agreement. 

//--------------------------------------------------------------------------- 
unit MediaPlayerForm; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects, FMX.Layouts, FMX.Media, 
    FMX.Filter, FMX.Filter.Effects, FMX.StdCtrls; 

type 
    TForm240 = class(TForm) 
    OpenDialog1: TOpenDialog; 
    OpenButton: TSpeedButton; 
    Rectangle1: TRectangle; 
    PauseButton: TSpeedButton; 
    TrackBar1: TTrackBar; 
    Label1: TLabel; 
    Timer1: TTimer; 
    CheckBox1: TCheckBox; 
    VolumeTrack: TTrackBar; 
    MediaPlayer1: TMediaPlayer; 
    MediaPlayerControl1: TMediaPlayerControl; 
    ClearButton: TSpeedButton; 
    procedure OpenButtonClick(Sender: TObject); 
    procedure PauseButtonClick(Sender: TObject); 
    procedure TrackBar1Change(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure CheckBox1Change(Sender: TObject); 
    procedure VolumeTrackChange(Sender: TObject); 
    procedure ClearButtonClick(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form240: TForm240; 

implementation 

{$R *.fmx} 

procedure TForm240.CheckBox1Change(Sender: TObject); 
begin 
    MediaPlayerControl1.Visible := CheckBox1.IsChecked; 
end; 

procedure TForm240.OpenButtonClick(Sender: TObject); 
begin 
    OpenDialog1.Filter := TMediaCodecManager.GetFilterString; 
    if OpenDialog1.Execute then 
    begin 
    PauseButton.Enabled := True; 
    ClearButton.Enabled := True; 
    MediaPlayer1.FileName := OpenDialog1.FileName; 

    if MediaPlayer1.Media <> nil then 
    begin 
     Label1.Text := IntToStr(MediaPlayer1.Media.VideoSize.Truncate.X) + 'x' + IntToStr(MediaPlayer1.Media.VideoSize.Truncate.Y) + 
     'px ' + IntToStr(MediaPlayer1.Media.Duration div MediaTimeScale) + 'ms'; 
     TrackBar1.Max := MediaPlayer1.Media.Duration; 
     VolumeTrack.Value := 1 - MediaPlayer1.Media.Volume; 

     MediaPlayer1.Play; 
    end; 
    end; 
end; 

procedure TForm240.PauseButtonClick(Sender: TObject); 
begin 
    if MediaPlayer1.State = TMediaState.Playing then 
    begin 
    PauseButton.Text := 'Play'; 
    MediaPlayer1.Stop; 
    end 
    else 
    begin 
    PauseButton.Text := 'Pause'; 
    MediaPlayer1.Play; 
    end; 
end; 

procedure TForm240.ClearButtonClick(Sender: TObject); 
begin 
    MediaPlayer1.Clear; 
    PauseButton.Enabled := False; 
    ClearButton.Enabled := False; 
end; 

procedure TForm240.Timer1Timer(Sender: TObject); 
begin 
    TrackBar1.Tag := 1; 
    TrackBar1.Value := MediaPlayer1.CurrentTime; 
    TrackBar1.Tag := 0; 
end; 

procedure TForm240.TrackBar1Change(Sender: TObject); 
begin 
    if TrackBar1.Tag = 0 then 
    MediaPlayer1.CurrentTime := Round(TrackBar1.Value); 
end; 

procedure TForm240.VolumeTrackChange(Sender: TObject); 
begin 
    MediaPlayer1.Volume := 1 - VolumeTrack.Value; 
end; 

end. 
+3

我想这个例子逃脱了真正的代码审查。 TForm240?真的? –

+1

一些emba样品应该包括警告:“不要在家里这样做!” :o) –

+0

我听说firemonkey有问题,但这太荒谬了......对于真正的Embarcadero? –

回答

3

为变量的值只有这样,才能在这里任何影响是,如果有一个事件处理程序,响应价值的变化。并为该事件处理程序在Tag的值上切换行为。

通常情况下,如果您想要以跟用户修改不同的方式修改跟踪栏值,您可以这样做。

为了弄清楚到底发生了什么,您需要在代码的其余部分查找Tag的其他用法。没有看到代码的其余部分(应该是在问题中),我无法验证解释如上,但它是我认为的代码中唯一合理的解释。

无论如何,Tag的使用非常蹩脚。我总是希望看到一个名称描述其目的的变量。

更新

而现在,完整的代码已经添加,可以看出,使用标签的正是如上所述。

+0

感谢您的建议。我添加了完整的源代码。 –

+0

@Cape OK,就像我说的那样 –

+0

@Andreas这不是一个无限的系列处理程序。这是停止播放跳跃。 –

相关问题