Odtwarzacz - zbiór pytań

0

Witam

Będę w tym temacie zamieszczał pytania które będą powiązane ze stworzeniem odtwarzacza audio w Delphi, dlatego proszę moderatora o nieusuwanie tego tematu ponieważ ma on na celu niezaśmiecanie forum i zebranie wszystkich tych pytań w jednym temacie, a nie każdego osobno.

Zacznę od PlayListy. Stworzyłem takową i wczytuję do niej pojedyncze pliki, chciałbym natomiast wczytywać cały folder. Miałoby to być realizowane tak jak w winamp'ie, czyli kliknąłbym na folder, później na button (Wczytaj) i wczytałoby mi na PL wszystkie utwory z folderu.
Nie chciałbym by było to realizowane przez otworzenie i zwyczajne zaznaczenie większej ilości plików niż jeden, ponieważ byłoby to niewygodne (niemniej, nawet czegoś takiego nie potrafię zrealizować).

Jeśli ktoś wie jak można coś takiego zrobić to proszę o info.

PS
Nie proszę tutaj o gotowca czy coś podobnego, jeśli uważasz że wystarczy podać mi kilka wskazówek zrób to i nie rozpisuj się jaki ze mnie leń czekający aż ktoś coś mu zrobi. Nie oczekuję gotowego kodu, chcę tylko małej pomocy w realizacji tego pomysłu.

EDIT:
To może zapytam inaczej. Czy takie coś jest możliwe, z komponentami dostępnymi w Delphi 7?

0

możesz za pomocą komponentów DriveComboBox, DirectoryListBox, FileListBox, FilterListBox z zakładki Win 3.1 ale one średnio ładnie wyglądają więc proponował bym użyć

Var
Dir: String;
begin
if SelectDirectory('Wybierz katalog...', 'MY PC', Dir)then begin
if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
end;

W zmiennej dir masz ścieżkę do katalogu dalej postępuj według przykładów jakie dał ci CYMES</delphi>

0

Dzięki, zaraz zacznę z tym działać ^^

EDIT:
Możecie mi powiedzieć gdzie znajdę kontrolkę lblFindFiles bo nigdzie jej w zakładkach nie mogę odnaleźć :/

EDIT:
Zapytam od razu o drugą sprawę. Chcę zrobić pasek postępu (ScrollBarem by można było nim przewijać utwór) i wygląda to tak:

Kod w Timerze:

ScrollBar1.Position := MediaPlayer1.Position;

Kod w Scroll'u:

MediaPlayer1.Position:=ScrollBar1.Position;

Timer.Enable jest ustawiony na False a po wciśnięciu PLAY, scroll jest ustawiany na pozycję 0 (max=100), a Timer.Enable ustawiany jest na TRUE.
Niby prosta sprawa, ale coś mi nie śmiga bo zaraz po wciśnięciu play słychać z 1s utworu scroll ląduje na samym końcu paska i tyle odtwarzania :/

0

Witam ponownie

Przekształciłem nieco kod ponieważ myślałem, że w tym tkwi błąd i teraz wygląda to tak:

Kod w Timerze:

ScrollBar1.Position := MediaPlayer1.TrackPosition[Form2.ListBox1.ItemsIndex];

reszta bez zmian.
Niestety to nie pomogło. Zmienił się jedynie czas po którym występuje błąd. W zależności jaką wartość czasu ustawię w Timerze, po tym okresie utwór się kończy (scrollbar rusza tylko o kawałeczek, później stoi :/)

EDIT:
Sprawdziłem także na Label czy wartość MediaPlayer1.TrackPosition[Form2.ListBox1.ItemsIndex] ulega zmianie, ale tak nie jest :/
Nie wiem czy coś sknociłem z Timerem, czy z samym odwołaniem do pozycji aktualnego utworu, ale cały czas stoi na 0.

0

To dlatego że najpierw musisz ustawić wartość maxymalną ScroolBara na tyle samo ile wynosi długość granego utworu.

ScroolBar1.Max := MediaPlayer1.Length;

i dopiero teraz teraz dajesz w Timerze

ScrollBar1.Position := MediaPlayer1.Position;

kod ze ScroolBara zostaw tak jak napisałeś wcześniej i powinno śmigać

0

Puchi max scroll'a ustawiłem już wcześniej tak, jak napisałeś, ale to nic nie daje. Słychać tylko 1s utworu pasek przesuwa się minimalnie i koniec. Jak już pisałem to raczej nie błąd przy kodowaniu paska, ale coś z timerem bo nawet w labelu nie wyświetla aktualnej pozycji, tylko cały czas jest 0 :/

Tutaj jest cały kod z pierwszej formy:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ScrollBar1: TScrollBar;
    MediaPlayer1: TMediaPlayer;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Timer1: TTimer;
    Panel1: TPanel;
    Label1: TLabel;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure MediaPlayer1Notify(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  t : String;
  w : double;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

MediaPlayer1.Open;
MediaPlayer1.Play;
Timer2.Enabled:=True;
ScrollBar1.Min:=0;
ScrollBar1.Max:=MediaPlayer1.Length;

end;

procedure TForm1.Button4Click(Sender: TObject);  //   Otwieranie/zamykanie playlist'y
begin
if Form2.Visible=True then
Form2.Visible:=False
else
form2.Visible:=True;
end;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
MediaPlayer1.Position:=ScrollBar1.Position;
end;

procedure TForm1.Timer1Timer(Sender: TObject); // Skok tekstu w animacj
begin
if label1.Left > w then
    label1.Left := 0
  else
    label1.Left := label1.Left - 1;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject); //Akcja po zakończeniu odtwarzania

begin
  if MediaPlayer1.NotifyValue = nvSuccessful then
  begin
    Timer1.Enabled := False;
    ScrollBar1.Position := ScrollBar1.Position;
    MediaPlayer1.Stop;
   end;
  end;
procedure TForm1.FormCreate(Sender: TObject);  // Animacja tekstu wyswietlajacego tytul utworu

begin
 t:='Wybierz utwór';
  label1.Left := 2;
  w := Label1.Canvas.TextWidth(t);
  if w <= Label1.Parent.Width then
  begin
    Timer1.Enabled := false;
    Label1.Caption := t;
  end
  else Label1.Caption := t + ' ' + t;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
ScrollBar1.Position := MediaPlayer1.Position;

end;

end.

EDIT:
Poprawka, label jest odświeżany i ostatnią wartość którą pokazuje to 860. Nie wiem jak przestawić format czasu, tak by wskazywał s, ale 860 jest chyba odpowiednikiem 1s.

EDIT2:
Już wiem w czym problem ^^ Gdy wrzucę w komentarz oprogramowanie scrolla wszystko śmiga tak jak należy. Znaczy scroll się przesuwa zgodnie z postępem utworu.
Nie wiem teraz tylko dlaczego kod w scrollu jest zły :/ Dlaczego stopuje odtwarzanie po 1s?

0

zamiast w ScrollBar1Change daj to w zdarzeniu OnScroll i powinno śmigać
a niedziała dlatego że jak timer zadziała to wywołuje zdarzenie OnChange ScroolBara i dlatego sie wiesza jak to zmienisz bedzie działać

żeby uzyskać czas w formacie 0000 musisz zrobić coś takiego:

Var
Czas, H, M, S: Integer;
begin
Czas := MediaPlayer1.Position div 1000; //Tu masz czas w sekundach
H := Czas div 3600; //Godziny
M := (Czas - (H*3600)) div 60; //Minuty
S := Czas - (H*3600) - (M*60); //Sekundy

pisane z głowy ale powinno działać
0

Dzięki puchi zrobiłem jak napisałeś i wszystko śmiga. Tyle że do OnScroll'a dodałem jeszcze linijkę:

MediaPlayer1.Play;

ponieważ bez tego po przesunięcia scroll'a utwór się zatrzymywał.
A co do czasu, to wszystko ładnie śmiga, tylko że ze względów stylistycznych chciałbym, aby minuty i sekundy były wyświetlane na 2 pozycjach, od samego początku, a nie tak jak jest teraz np. 0:2, a chciałbym 00:02.
Jeśli wrzucę zmienne na double, to pojawiają się kosmiczne liczby. Pomyśle jeszcze nad tym, ale gdybyś wiedział co i jak to z chęcią wysłucham ^^

0

najprosciej

function GetTimeFromPos(Pos: Integer): String;
Var
Czas, H, M, S: Integer;
begin
Czas := Pos div 1000; //Tu masz czas w sekundach
H := Czas div 3600; //Godziny
M := (Czas - (H*3600)) div 60; //Minuty
S := Czas - (H*3600) - (M*60);

if H > 9 then
Result := IntToStr(H) + ':'
else
Result := '0' + IntToStr(H) + ':';

if M > 9 then
Result := Result + IntToStr(M) + ':'
else
Result := Result + '0' + IntToStr(M) + ':';

if S > 9 then
Result := Result + IntToStr(S)
else
Result := Result + '0' + IntToStr(S);

end;

Label1.Caption := GetTimeFromPos(MediaPlayer1.Position);
0

@puchi: a nie prościej użyć funkcji Format('%.2d:%.2d', [...]);?

0

puchi zrobiłem tak samo, ale myślałem że to najgorsze rozwiązanie ponieważ wszystko byłoby podłączone pod timera i co 1s byłby sprawdzany ten warunek, a to chyba bardzo obciążałoby procesor :)

olesio jeszcze nie miałem do czynienia z tą funkcją, więc poczytam nieco o niej, a jeśli coś mi nie wyjdzie, to się odezwę :]

Dziękuję panowie ^^

0

niepowiedziałbym że to obciąży jakoś znacząco procka ale przyznaje że wersja od olesio jest lepsza i prostsza

0

Teraz przypomniało mi się, że już nie raz korzystałem z funkcji Format^^ Zwyczajnie z głowy wyleciało. Niemniej wszystko śmiga tak jak powinno :)

puchi jeśli chodzi o to obciążanie procesora, to źle się wyraziłem. Bo ciężko jest mówić o zamulaniu procka w przypadku takiego prostego kodu :]

A teraz kolejne pytanie. Wracam do wcześniejszego zapytania o wczytywanie całego folderu. Skorzystałem z waszych podpowiedzi i zmodyfikowałem nieco kod z linków i wyszło cosik takiego:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ActnList, FileCtrl;
type
TSearch = class
  private
    SR : TSearchRec;
    function IsSlashChar(Path : String) : String;
  public
    function FindIt(Dir : String; var Progress : Integer) : TStringList;
  end;


type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    ListBox2: TListBox;
    DirectoryListBox1: TDirectoryListBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
  private
    { Private declarations }
  public
    zaznaczenie: string;
  end;

var
  Form2: TForm2;

implementation
uses Unit1;
{$R *.dfm}

function TSearch.IsSlashChar(Path: String): String;
begin
{
  Funkcja sprawdza, czy ostatnim znakiem zmiennej "Path" nie jest znak \. Jezeli nie jest to ten znak jest dodwany.
}
  if Path[Length(Path)] <> '' then
    Result := Path + '' else Result := Path;
end;



function TSearch.FindIt(Dir: String; var Progress : Integer) : TStringList;
var
  Found : Integer; // zmienna przechowuje ilosc znalezionych plikow
begin
{
  Rezultatem tej funkcji jest zmienna typu "TStringList", ktora zawierac
  bedzie liste plikow, ktore zostaly odnalezione.
}
  Result := TStringList.Create; // stworz zmienna
  try
 // wywolaj funkcje, ktora sprawdza, czy na koncu zmiennej "Dir" jest znak ""
    Dir := IsSlashChar(Dir);
    Found := FindFirst(Dir + '*.*', faAnyFile, SR); // odnajdz pliki
    while ( Found = 0 ) do //dopoki liczba znalezionych plikow nie bedzie rowna 0
    begin
{
  Ponizsza instrukcja odpowiada za to, zeby do listy znalezionych plikow nie
  dodawana byla nazwa '.' ani '..' ktore to oznaczaja, ze istnieje katalog
  wyzej.
}
      if (SR.Name <> '.') and (SR.Name <> '..') then
    // do listy "TStringList" dodaj nazwe znalezionego pliku
      Result.Add(Dir +  SR.Name);
      Found := FindNext(SR); // szukaj dalej...
    end;
  finally
    Form2.ListBox1.Items:=Result;
    FindClose(SR); // zakoncz przeszukiwanie
  end;
{
  Ah. Bylbym zapomnial o opisaniu zmiennej "Process" w tej funkcji. Otoz  ta zmienna zawiera 'informacje' o stanie postepu w odnajdywaniu plikow.}
end;


procedure TForm2.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ListBox1.Items.Text:=OpenDialog1.FileName;
ListBox2.Items.Text:=ExtractFileName(ListBox1.Items.Text);
end;
end;


procedure TForm2.Button1Click(Sender: TObject);

var
  Search : TSearch; // wskazuje na nowa klase
  I : Integer;
  Dir: String;
begin
if OpenDialog1.Execute then
Dir:=OpenDialog1.GetNamePath;
//OpenDialog1.GetNamePath
  Search := TSearch.Create; // stworz klase
  try
// do komponentu dodawana jest lista z funkcji "FindIt"
    ListBox1.Items.Assign(Search.FindIt(DirectoryListBox1.Directory, i));
  // postep w odnajdywaniu pliku przestawiany jest na komponencie "progrssbar"

  finally
    Search.Free; // uwolnij zmienna
  end;

end;



(*if OpenDialog1.Execute then
begin
ListBox1.Items.Add(OpenDialog1.FileName);
ListBox2.Items.Add(ExtractFileName(ListBox1.Items.Text));
end;*)


procedure TForm2.ListBox2Click(Sender: TObject);
begin

ListBox1.ItemIndex:=ListBox2.ItemIndex;
zaznaczenie:=ListBox1.Items.Strings[ListBox2.ItemIndex];
Form1.MediaPlayer1.FileName:=Form2.zaznaczenie;
end;

end.

Korzystam tutaj z OpenDialoga by wczytać z niego ścieżkę folderu, ale chyba popełniam błąd wykorzystując do tego właśnie ten komponent. Używam OD ponieważ okienko wyboru folderu powinno pojawiać się po kliknięciu przycisku i chciałbym by wyglądało ono właśnie jak OD, a nie jak Directory/File ListBox :/ Jeśli jest jakiś inny komponent który będzie wyglądał jak OD i będę mógł z niego wyciągnąć ścieżkę folderu lub coś takiego jest możliwe w OD, to proszę podpowiedzcie coś :D

EDIT:
Acha i jeszcze jedna sprawa. Nie wiedziałem gdzie w kodzie przypisuje się wartość do zmiennej Dir, dlatego przy wywoływaniu funkcji dałem taką linijkę:

if OpenDialog1.Execute then
Dir:=OpenDialog1.GetNamePath;

nawet dokładnie nie wiem do czego służy GetNamePath, ale skojarzyłem po nazwie, że do przechwytywania ścieżki, tyle że w tym wypadku to pewnie ścieżka pliku, a nie folderu :/

0

Mniejsza z tym, zrobiłem to tak:

unit Unit2;

interface

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


type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    ListBox2: TListBox;
    DirectoryListBox1: TDirectoryListBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
    procedure OpenDialog1SelectionChange(Sender: TObject);
  private
    { Private declarations }
  public
    zaznaczenie: string;
  end;

var
  Form2: TForm2;

implementation
uses Unit1;
{$R *.dfm}




procedure szukaj(a:string);
var
  SR : TSearchRec;
  Found : Integer; // liczba znalezionych plikow
  Dir: String;
begin
Form2.ListBox1.Items.Text:='';
  Found := FindFirst(  '*.*', faVolumeID, SR); // odnajdz

  while (Found = 0) do // dopoki liczba znalezionych plikow nie
// bedzie rowna 0
  begin

  if (SR.Name <> '.') and (SR.Name <> '..')   then

    Form2.ListBox1.Items.Add('C:\' + SR.Name); // dodaj do Memo znaleziony plik
    Found := FindNext(SR); // szukaj dalej
 
  end;
  FindClose(SR); // zakoncz wyszukiwanie
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ListBox1.Items.Text:=OpenDialog1.FileName;
ListBox2.Items.Text:=ExtractFileName(ListBox1.Items.Text);
end;
end;


procedure TForm2.Button1Click(Sender: TObject);
var
a:string;
begin
//if OpenDialog1.Execute then
//begin
//ListBox1.Items.Add(OpenDialog1.FileName);
//ListBox2.Items.Add(ExtractFileName(ListBox1.Items.Text));
a:=DirectoryListBox1.Directory;
szukaj(a);
//ListBox1.Items.Text:=a;
end;


procedure TForm2.ListBox2Click(Sender: TObject);
begin

ListBox1.ItemIndex:=ListBox2.ItemIndex;
zaznaczenie:=ListBox1.Items.Strings[ListBox2.ItemIndex];
Form1.MediaPlayer1.FileName:=Form2.zaznaczenie;
end;

procedure TForm2.OpenDialog1SelectionChange(Sender: TObject);
begin
ListBox1.Items.Text:=OpenDialog1.FileName;
end;

end.

Wszytko wygląda w porządku, wczytuje tylko pliki, pomija katalogi. Powiedzcie mi jeszcze tylko, co zrobić by wczytywało tylko pliki audio?

Found := FindFirst(  '*.*', faVolumeID, SR); // odnajdz

Wiem że ta linijka jest za to odpowiedzialna, tylko nie wiem jak dodać tam więcej niż jedną maskę :/

0

Stworzyłem kiedyś moduł na podstawie części kodu znalezionego w sieci oraz artyukł jak wywołać dialog
do wyboru katalogu: Dialog do wyboru katalogu sprawdź tam.

0

olesio dzięki za link, ale mam problem :/
Po pierwsze nie wiem co to za kontrolka BrowseDialog i po wklejeniu kodu pod button pojawia się info, że jest niezadeklarowana :/
A druga sprawa, to kod modułu. O ile dobrze zrozumiałem mam stworzyć nową formę i wrzucić do niej ten kod, tak?

Może pytania wydają ci się głupie, ale ja z delphi mam do czynienia od niedawna (3-4 miesiące) i w większości uczę się wszystkiego po forach i ze zdobytych ebooków (dość nędznych zresztą) :/

0

Nieuważnie czytałeś opis w artykule. Kod masz zapisać jako moduł. Najprościej będzie jak sobie na
końcu artykuły klikniesz na link obok "Plik źródłowy modułu - skompresowany ZIP" i ściagniesz zipa,
którego wypakuj do katalogu ze źródłem swojego programu. Następnie do sekcji uses w swoim kodzie
dodaj moduł browse; następnie pod wybrany przycisk dodaj ten kod. Na pewno działa, sprawdziłem.

var
BrowseDialog : TFolderBrowseDialog;
begin
  BrowseDialog := TFolderBrowseDialog.Create(Form1);
  BrowseDialog.InitialDir := 'C:\';
  BrowseDialog.PromptText := 'Wybierz katalog:';
  if BrowseDialog.Execute then
     begin
     ShowMessage(BrowseDialog.Directory);
     end;
end;

A okienko będzie wyglądać mniej więcej tak:
user image

0

Coś jest nie tak :/
Niby wszystko śmiga jak należy, Browse się otwiera, ładuje ścieżkę i później funkcja szuka plików, ale wyrzuca pliki z katalogu głównego programu, a nie ze ścieżki którą wczytało.

Sprawdzałem i wszystko wygląda oki, to funkcji szukaj jest przesyłany parametr ze ścieżką (prawidłową), ale w linijce:

 Form2.ListBox1.Items.Add(a + '\' + SR.Name);

dochodzi do błędu, bo a wyrzuca dobre, ale SR szuka już nie w tym katalogu co trzeba :/

Tutaj jest cały kod:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ActnList, FileCtrl, Mask, sMaskEdit,
  sCustomComboEdit, sTooledit;

type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    ListBox2: TListBox;
    DirectoryListBox1: TDirectoryListBox;
    CheckBox1: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
    procedure ListBox2DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    zaznaczenie: string;
  end;

var
  Form2: TForm2;

implementation
uses Unit1, browse;
{$R *.dfm}

procedure szukaj(a:string);
var
  SR : TSearchRec;
  Found : Integer; // liczba znalezionych plikow

begin
Form2.ListBox1.Items.Text:='';
Form2.ListBox2.Items.Text:='';
  Found := FindFirst(  '*.*', faVolumeID, SR); // odnajdz

  while (Found = 0) do // dopoki liczba znalezionych plikow nie
// bedzie rowna 0
  begin

  if (SR.Name <> '.') and (SR.Name <> '..')   then

    Form2.ListBox1.Items.Add(a + '\' + SR.Name); // dodaj do Memo znaleziony plik
    Form2.ListBox2.Items.Add(ExtractFileName( Form2.ListBox1.Items.Text));
    Found := FindNext(SR); // szukaj dalej

  end;
  FindClose(SR); // zakoncz wyszukiwanie
end;





procedure TForm2.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ListBox1.Items.Add(OpenDialog1.FileName);
ListBox2.Items.Add(ExtractFileName(ListBox1.Items.Text));
end;
end;


procedure TForm2.Button1Click(Sender: TObject);
var
BrowseDialog : TFolderBrowseDialog;
a:string;
begin
  BrowseDialog := TFolderBrowseDialog.Create(Form2);
  BrowseDialog.InitialDir := 'C:\';
  BrowseDialog.PromptText := 'Wybierz katalog:';
if BrowseDialog.Execute then
begin
//ListBox1.Items.Add(OpenDialog1.FileName);
//ListBox2.Items.Add(ExtractFileName(ListBox1.Items.Text));
a:=BrowseDialog.Directory;
szukaj(a);
//otwieranie1.otwieranie(Form1.Timer2,Form1.MediaPlayer1,Form1.ScrollBar1);
//czas1.czas(Form1.MediaPlayer1,Form1.Label2,Form1.Timer3);
//ListBox1.Items.Text:=a;
end;
end;

procedure TForm2.ListBox2Click(Sender: TObject);
begin

ListBox1.ItemIndex:=ListBox2.ItemIndex;
zaznaczenie:=ListBox1.Items.Strings[ListBox2.ItemIndex];
Form1.MediaPlayer1.FileName:=Form2.zaznaczenie;
i:=ListBox1.ItemIndex;
end;

procedure TForm2.ListBox2DblClick(Sender: TObject);
begin
zaznaczenie:=ListBox1.Items.Strings[ListBox2.ItemIndex];
Form1.MediaPlayer1.FileName:=zaznaczenie;
Form1.MediaPlayer1.Open;
Form1.MediaPlayer1.Play;
end;

end.
0
Found := FindFirst(  '*.*', faVolumeID, SR); // odnajdz

Nie powinno być tak?:

Found := FindFirst(a + '\*.*', faVolumeID, SR); // odnajdz
0

Coś jest nie tak :/
Niby wszystko śmiga jak należy, Browse się otwiera, ładuje ścieżkę i później funkcja szuka plików, ale wyrzuca pliki z katalogu głównego programu, a nie ze ścieżki którą wczytało.

Sprawdzałem i wszystko wygląda oki, to funkcji szukaj jest przesyłany parametr ze ścieżką (prawidłową), ale w linijce:

 Form2.ListBox1.Items.Add(a + '\' + SR.Name);

dochodzi do błędu, bo a wyrzuca dobre, ale SR szuka już nie w tym katalogu co trzeba :/

Tutaj jest cały kod:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ActnList, FileCtrl, Mask, sMaskEdit,
  sCustomComboEdit, sTooledit;

type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    ListBox2: TListBox;
    DirectoryListBox1: TDirectoryListBox;
    CheckBox1: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox2Click(Sender: TObject);
    procedure ListBox2DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    zaznaczenie: string;
  end;

var
  Form2: TForm2;

implementation
uses Unit1, browse;
{$R *.dfm}

procedure szukaj(a:string);
var
  SR : TSearchRec;
  Found : Integer; // liczba znalezionych plikow

begin
Form2.ListBox1.Items.Text:='';
Form2.ListBox2.Items.Text:='';
  Found := FindFirst(  '*.*', faVolumeID, SR); // odnajdz

  while (Found = 0) do // dopoki liczba znalezionych plikow nie
// bedzie rowna 0
  begin

  if (SR.Name <> '.') and (SR.Name <> '..')   then

    Form2.ListBox1.Items.Add(a + '\' + SR.Name); // dodaj do Memo znaleziony plik
    Form2.ListBox2.Items.Add(ExtractFileName( Form2.ListBox1.Items.Text));
    Found := FindNext(SR); // szukaj dalej

  end;
  FindClose(SR); // zakoncz wyszukiwanie
end;





procedure TForm2.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
ListBox1.Items.Add(OpenDialog1.FileName);
ListBox2.Items.Add(ExtractFileName(ListBox1.Items.Text));
end;
end;


procedure TForm2.Button1Click(Sender: TObject);
var
BrowseDialog : TFolderBrowseDialog;
a:string;
begin
  BrowseDialog := TFolderBrowseDialog.Create(Form2);
  BrowseDialog.InitialDir := 'C:\';
  BrowseDialog.PromptText := 'Wybierz katalog:';
if BrowseDialog.Execute then
begin
//ListBox1.Items.Add(OpenDialog1.FileName);
//ListBox2.Items.Add(ExtractFileName(ListBox1.Items.Text));
a:=BrowseDialog.Directory;
szukaj(a);
//otwieranie1.otwieranie(Form1.Timer2,Form1.MediaPlayer1,Form1.ScrollBar1);
//czas1.czas(Form1.MediaPlayer1,Form1.Label2,Form1.Timer3);
//ListBox1.Items.Text:=a;
end;
end;

procedure TForm2.ListBox2Click(Sender: TObject);
begin

ListBox1.ItemIndex:=ListBox2.ItemIndex;
zaznaczenie:=ListBox1.Items.Strings[ListBox2.ItemIndex];
Form1.MediaPlayer1.FileName:=Form2.zaznaczenie;
i:=ListBox1.ItemIndex;
end;

procedure TForm2.ListBox2DblClick(Sender: TObject);
begin
zaznaczenie:=ListBox1.Items.Strings[ListBox2.ItemIndex];
Form1.MediaPlayer1.FileName:=zaznaczenie;
Form1.MediaPlayer1.Open;
Form1.MediaPlayer1.Play;
end;

end.
0

Zmienna a jeżeli wybierzesz katalog będzie zawsze zawierała na końcu '', bo tak skonstruowałem ów dialog.
Dlatego w funkcji Szukaj niepotrzebnie dodajesz ten znak, ewentualnie możesz to sprawdzać sam w tej
funkcji czy ostatni znak to '' (a[Length(a)] = '') i jeżeli nie to go dodawać. Chyba w tym jest problem.

0

olesio to nie to :/ Sprawdziłem już to wcześniej. Ścieżka do procedury szukaj, jest wysyłana poprawnie, ale znalezione pliki są z katalogu głównego programu.

Wczytuję np folder C:\Muzyka\ a w List Boxa ładuje cosik takiego:

C:\Muzyka\Project2.dcu
C:\Muzyka\Project1.dcu
C:\Muzyka\browse.dcu
.......

Nie wiem co z tym począć, gdy używam DirectoryListBox'a wszystko śmiga dobrze :/

0

olesio sprawdziłem działanie tego wszystkiego na osobnej formie i jest ten sam błąd :/
Do funkcji szukaj wysyłana jest poprawna ścieżka, ale przeszukuje tylko katalog główny programu, a nie ten wysłany w ścieżce.

Jest możliwe że w kodzie browse znajduje się jakaś linijka która może być za to odpowiedzialna?

Uproszczony kod z nowej formy:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    ListBox2: TListBox;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    a: string;
  end;

var
  Form1: TForm1;

implementation
uses browse;
{$R *.dfm}


procedure szukaj(a:string);
var
  SR : TSearchRec;
  Found : Integer; // liczba znalezionych plikow

begin
Form1.ListBox1.Items.Text:='';
Form1.ListBox2.Items.Text:='';
  Found := FindFirst(  '*.*', faVolumeID, SR); // odnajdz

  while (Found = 0) do // dopoki liczba znalezionych plikow nie
// bedzie rowna 0
  begin

  if (SR.Name <> '.') and (SR.Name <> '..')   then

    Form1.ListBox1.Items.Add(a + '\' + SR.Name); // dodaj do Memo znaleziony plik
    Form1.ListBox2.Items.Add(ExtractFileName( Form1.ListBox1.Items.Text));
    Found := FindNext(SR); // szukaj dalej
end;
Form1.Label1.Caption:=a;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
BrowseDialog : TFolderBrowseDialog;
begin
BrowseDialog := TFolderBrowseDialog.Create(Form1);
  BrowseDialog.InitialDir := 'C:\';
  BrowseDialog.PromptText := 'Wybierz katalog:';
if  BrowseDialog.Execute then
begin
a:=BrowseDialog.Directory;
end;
szukaj(a);
end;

end.
0
Robster napisał(a)

Do funkcji szukaj wysyłana jest poprawna ścieżka, ale przeszukuje tylko katalog główny programu, a nie ten wysłany w ścieżce.

OMG no toć napisałem, że zamiast:

Found := FindFirst(  '*.*', faVolumeID, SR); // odnajdz

powinno być:

Found := FindFirst(a + '*.*', faVolumeID, SR); // odnajdz 

lub

Found := FindFirst(a + '\*.*', faVolumeID, SR); // odnajdz 
0

No przecież Grzegorz ^^

Pewnie, że masz rację, to ja znowu nie doczytałem :) Poknociło mi się z tą linijką:

Form2.ListBox1.Items.Add(a + SR.Name);

Ode mnie nobel dla ciebie. Naprawdę bardzo mi pomogłeś, niewiele takich cierpliwych osób na forum jest :D

0

To chyba ostatnie pytanie :)

Chcę zrobić regulator głośności w ScrollBarze, ale nic mi z tego nie wychodzi.
Znalazłem taki opis:

Ustawianie głośności

Program posiada także opcje ustawiania głośności filmu. Wszystko to dzięki funkcji API ? WaveOutSetVolume:

WaveOutSetVolume(0, $90009000);   


W drugim parametrze należy podać wartości dla prawego oraz lewego głośnika ? w tym wypadku wartość wynosi $9000. 

Ale nie potrafię tego wrzucić w scroll'a a poza tym nawet nie chce mi się to wywołać :/

0

Zobacz sobie jak reguluję głośnością w programie pod poniższym adresem. Kod wygooglowałem już
kiedyś, to samo jest w mojej odpowiedzi w tym wątku. A kod program zamieściłem tutaj - pobierz.
Głośnością reguluje globalnie w całym systemie - inaczej niż poprzez taki kod jak podałem nie umiem ;-/

0

Dzięki panowie, ładnie śmiga :)
Grzegorz16 skorzystałem z twojego linku, ale moje zadanie ograniczyło się do wklejenia wszystkiego w odpowiednie miejsce, a chciałbym wiedzieć jak to działa.
Chodzi mi tutaj dokładnie o te dwie procedury, próbowałem je sam przeanalizować, ale niewiele z tego wyszło.
Nie wiem czy to ta osławiona biblioteka BASS o której tyle czytałem, robiąc tego playera, ale nie rozumiem co się tam "dzieje".
Gdybyś miał (albo ktokolwiek inny) kiedyś czas na skomentowanie tych procedur to byłbym bardzo wdzięczny.

PS
Czy mając już powyższy kod mogę w łatwy sposób zrobić scroll'a do balansu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1