Avatar billede kristofferb Nybegynder
12. april 2005 - 16:19 Der er 6 kommentarer og
1 løsning

Skip i trackbar

Jeg har en mediaplayer, der afspiller en sang.
Hvordan laver jeg så, at min trackbar ikke blot følger min mediaplayers funktion (det kan jeg godt få den til), men at jeg også kan 'springe' i sangen ved at jeg flytter på trackbarens position?
12. april 2005 - 19:13 #1
Hej Kristofferb
Det er jo et herligt problem du har der. Jeg havde selv samme problem indtil jeg fandt løsningen.
Der er to ting jeg er nødt til at forudsætte at du har gjort for at min løsning virker.

1: Der hvor du loader mp3 filen har du skrevet noget lignende

    TrackBar1.Min := 0;
    TrackBar1.Position := 0;
    TrackBar1.Max := MediePlayer1.Length;
    TrackBar1.Frequency := Trackbar1.Max div 10;

2: At du har en timer der trigger x antal gange i sekundet, og indeholder noget lignende:

    TrackBar1.Position := MediePlayer1.Position;

For at få det til at virke, er du nødt til at lave en global boolean variabel, der fortæller om det er dig eller programmet der flytter på din trackbar, jeg har kaldt den 'Moving'.

Din OnTimer event udvides til dette:

procedure TForm2.Timer1Timer(Sender: TObject);
begin
    Moving := True;  // Det er programmet der flytter
    TrackBar1.Position := MediePlayer1.Position;
    Moving := False;  // Det er dig der flytter.
end;

På din TrackBar laver du en OnChange event.

procedure TForm2.TrackBar1Change(Sender: TObject);
begin
  if not Moving then
  begin
    MediePlayer1.Position := TrackBar1.Position;
    MediePlayer1.Play;
  end;
end;
Avatar billede kristofferb Nybegynder
12. april 2005 - 20:33 #2
Gider du lave det som eksempel?
Jeg gør alt det du har skrevet, og alligevel hacker sangen i det og genstarter hele tiden, når jeg sætter afspilleren igang.

Jeg ville blive meget glad hvis du gad lave et lille eksempel.
12. april 2005 - 20:45 #3
Du får hele min figur24, men der er en hel del overflødige dele du ikke har brug for, min medieplayer ligger i Unit3 og hedder spiller.

unit Figur24;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls,
  Unit3, Unit59, Figur61, Figur62, Figur66, Figur70, Figur73, Figur86;

type
  TForm24 = class(TForm)
    Label1  : TLabel;
    Label2  : TLabel;
    Label3  : TLabel;
    Label4  : TLabel;
    Label5  : TLabel;
    Label6  : TLabel;
    Label7  : TLabel;
    Label8  : TLabel;
    Label9  : TLabel;
    Label10 : TLabel;
    Label11 : TLabel;
    Label12 : TLabel;
    Label13 : TLabel;
    Label14 : TLabel;
    Ophav      : TListBox;
    PlNr      : TListBox;
    PlTitel    : TListBox;
    Side      : TListBox;
    Skaering  : TListBox;
    Genre      : TListBox;
    Laengde    : TListBox;
    Titel      : TListBox;
    Alternativ : TListBox;
    Original  : TListBox;
    Kunstner  : TListBox;
    ISRC      : TListBox;
    Bruger    : TListBox;
    Spil: TButton;
    Timer1: TTimer;
    Label16: TLabel;
    Label17: TLabel;
    Komplet: TEdit;
    Tracker: TListBox;
    TrackBar1: TTrackBar;
    Tilbage: TEdit;
    Label15: TLabel;
    Spillet: TEdit;
    LeftCue: TButton;
    RightCue: TButton;
    procedure FormShow(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormHide(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackerMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpilClick(Sender: TObject);
    procedure LeftCueClick(Sender: TObject);
    procedure RightCueClick(Sender: TObject);
  private
    { Private declarations }
    procedure VisTitel(TIndex : LongInt);
    procedure VisOphav(OIndex : LongInt);
    procedure AfbrydSpil;
    procedure AutoCue;
  public
    { Public declarations }
    procedure Vise(Indx : LongInt);
  end;

var
  Form24: TForm24;
  Tmp : String;
  Playing : Boolean;
  Cueing  : Boolean;
  Moving  : Boolean;
  CuePos  : LongInt;

implementation

{$R *.DFM}

procedure TForm24.Vise(Indx : LongInt);
begin { Viser Titel med index nummeret Indx. }
  Global.Plade.DataSet.Refresh;
  Global.Titel.DataSet.Refresh;
  Global.Ophav.DataSet.Refresh;
  VisTitel(Indx);
  VisOphav(Indx);
  ShowModal;
end;

procedure TForm24.FormShow(Sender: TObject);
begin
  Form24.Top  := Unit59.Top + 55;
  Form24.Left := Unit59.Left + 392;
  Spil.Caption := 'F6 Afspil';
  Playing := False;
  TrackBar1.Position := 0;
  Tilbage.Clear;
  AutoCue;  // Load fil og gør klar til afspilning.
  if Spil.Visible and Spil.Enabled then
    Spil.SetFocus;
end;

procedure TForm24.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_Escape : if Playing then
                  AfbrydSpil
                else
                  ModalResult := MrCancel;
    VK_F1    : Figur61.Help.Vis(24);
    VK_F6    : if Spil.Visible then
                begin
                  if ssShift in Shift then
                  begin  // Vis hvilke musik kategori sangen er medlem af.
                    if not Playing then
                      Figur86.Form86.Vise(TitelData.Index);
                  end
                  else
                    SpilClick(Sender);  // Afspil evt. musikfil.
                end;
    VK_F7    : if LeftCue.Visible then LeftCueClick(Sender);
    VK_F8    : if RightCue.Visible then RightCueClick(Sender);
    VK_F9    : Figur62.Form62.ShowModal;
    VK_F11    : if not Playing then
                begin
                  Figur70.Form70.ShowModal;
                  AutoCue;
                end;
    VK_F12    : if not Playing then
                begin
                  Figur73.Form73.Hente(False, False, -1);
                  AutoCue;
                end;
  end;
end;

procedure TForm24.AfbrydSpil;
begin
  if Figur66.Form66.Hente then
  begin
    Spiller.Stands;
    Spil.Caption := 'F6 Afspil';
    Playing := False;
    Spiller.Forfra;
    TrackBar1.Position := Spiller.Pos;
    Spillet.Text := TimeToStr(0);
    Tilbage.Text := TimeToStr((Spiller.Len - Spiller.Pos) /86400000);
    Spiller.Luk;
    AutoCue;
  end;
end;

procedure TForm24.AutoCue;
var
  Fil : String;
begin
  Fil := Global.HentLokal('Musik') + IntToStr(Global.HentPlade(TitelData.Plade).Nr);
  Fil := Fil + '\' + TitelData.Side + IntToStr(TitelData.Skaering) + '.mp3';
  if FileExists(Fil) then
  begin
    Spiller.HentLyd(Fil);
    TrackBar1.Min := 0;
    TrackBar1.Position := 0;
    TrackBar1.Max := Spiller.Len;
    TrackBar1.Frequency := Trackbar1.Max div 10;
    Timer1.Enabled  := True;
    Spil.Enabled    := True;
    LeftCue.Enabled  := True;
    RightCue.Enabled := True;
    Cueing := False;
  end
  else
  begin
    Spil.Enabled    := False;
    LeftCue.Enabled  := False;
    RightCue.Enabled := False;
  end;
end;

procedure TForm24.LeftCueClick(Sender: TObject);
begin
  if not Cueing then
  begin
    CuePos := Spiller.Pos;
    Cueing := True;
  end;
  CuePos := cuePos - 10;  // Flyt millisekunder tilbage i sangen
end;

procedure TForm24.RightCueClick(Sender: TObject);
begin
  if not Cueing then
  begin
    CuePos := Spiller.Pos;
    Cueing := True;
  end;
  CuePos := cuePos + 10;  // Flyt millisekunder frem i sangen
end;

procedure TForm24.VisTitel(TIndex : LongInt);
begin
  TitelData := Global.HentTitel(TIndex);
  PladeData := Global.HentPlade(TitelData.Plade);
  PlNr.Clear;      PlNr.Items.Add(IntToStr(PladeData.Nr));
  PlTitel.Clear;    PlTitel.Items.Add(PladeData.Titel);
  Side.Clear;      Side.Items.Add(TitelData.Side);
  Skaering.Clear;  Skaering.Items.Add(IntToStr(TitelData.Skaering));
  Laengde.Clear;    Laengde.Items.Add(TimeToStr(TitelData.Laengde));
  Titel.Clear;      Titel.Items.Add(TitelData.Titel);
  Alternativ.Clear; Alternativ.Items.Add(TitelData.Alternativ);
  Original.Clear;  Original.Items.Add(TitelData.Original);
  Kunstner.Clear;  Kunstner.Items.Add(TitelData.Kunstner);
  ISRC.Clear;      ISRC.Items.Add(TitelData.ISRC);
  Genre.Clear;      Genre.Items.Add(TitelData.Genre);
  Bruger.Clear;    Bruger.Items.Add(Global.BrugerNavn(TitelData.Bruger));
  if TitelData.Komplet then
    Komplet.Text := '*'
  else
    Komplet.Text := ' ';
  Spillet.Visible  := TitelData.PaaHdd;
  Tilbage.Visible  := TitelData.PaaHdd;
  Spil.Visible      := TitelData.PaaHdd;
  LeftCue.Visible  := TitelData.PaaHdd;
  RightCue.Visible  := TitelData.PaaHdd;
  Label15.Visible  := TitelData.PaaHdd;
  Label16.Visible  := TitelData.PaaHdd;
  TrackBar1.Visible := TitelData.PaaHdd;
  Tracker.Visible  := TitelData.PaaHdd;
end;

procedure TForm24.VisOphav(OIndex : LongInt);
begin
  Ophav.Clear;
  Global.TOphav.IndexName := 'OphavTitel';
  Global.TOphav.FindNearest([IntToStr(OIndex)]);
  with Global.Ophav.DataSet do
  begin
    while (not EOF) and (FieldByName('Titel').AsInteger = TitelData.Index) do
    begin
      Tmp := FieldByName('Navn').AsString;
      while Length(Tmp) < 39 do Tmp := Tmp + ' ';
      if FieldByName('Komponist').AsBoolean then  Tmp[36] := '*';
      if FieldByName('Forfatter').AsBoolean then  Tmp[37] := '*';
      if FieldByName('Arrangør').AsBoolean then  Tmp[38] := '*';
      if FieldByName('Oversætter').AsBoolean then Tmp[39] := '*';
      Ophav.Items.Add(Tmp);
      Next;
    end;
  end;
  if Ophav.Items.Count > 0 then
    Ophav.ItemIndex := 0;
end;

procedure TForm24.FormHide(Sender: TObject);
begin
  Timer1.Enabled := False;
  Spiller.Luk;
end;

procedure TForm24.Timer1Timer(Sender: TObject);
begin
  if Playing then
  begin
    if Cueing then
    begin
      Spiller.Pos(CuePos);
      Spiller.Spil;  // Spil lydfilen.
      Spil.Caption := 'F6 Pause';
      Playing := True;
    end;
    Spillet.Text := TimeToStr(Spiller.Pos /86400000);
    Tilbage.Text := TimeToStr((Spiller.Len - Spiller.Pos) /86400000);
    if Spiller.Len = Spiller.Pos then
    begin
      Spil.Caption := 'F6 Afspil';
      Playing := False;
      Spiller.Luk;
    end;
    Spil.Enabled := True;
    Spil.SetFocus;
    Moving := True;
    TrackBar1.Position := Spiller.Pos;
    Moving := False;
  end;
end;

procedure TForm24.TrackBar1Change(Sender: TObject);
begin
  if not Moving then
  begin
    if Playing then
    begin
      Spiller.Pos(TrackBar1.Position);
      if Spil.Caption = 'F6 Pause' then
        Spiller.Spil;
    end;
  end;
end;

procedure TForm24.TrackerMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin  //  Flyt trackbar til mouse pos.
  if Playing then
  begin
    Spiller.Pos(Spiller.Len * X div 130);
    if Spil.Caption = 'F6 Pause' then
      Spiller.Spil;
  end;
end;

procedure TForm24.SpilClick(Sender: TObject);
begin
  if Spil.Enabled then
  begin
    if (Spil.Caption = 'F6 Afspil') then
    begin
      Spiller.Spil;  // Spil lydfilen.
      Spil.Caption := 'F6 Pause';
      Playing := True;
      Cueing := False;
    end
    else
    begin
      Spiller.Pause;
      Spil.Caption := 'F6 Afspil';
      Cueing := False;
    end;
  end;
end;

end.
12. april 2005 - 21:16 #4
Jeg kom til at tænke på, hvordan får du programmet til at flytte din TrackBar?
Avatar billede kristofferb Nybegynder
13. april 2005 - 18:38 #5
Den styres manuelt.
13. april 2005 - 21:29 #6
Hvad mener du med at den styres manuelt?
Der må da være et eller andet sted der står TrackBar1.Position := ...
Avatar billede kristofferb Nybegynder
14. april 2005 - 13:50 #7
Nåååh det var det du mente!

Jo der er et sted hvor jeg får den til at bevæge sig (i en timer).

Tak for dit svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester