Listbox i odtwarzanie po kliknieciu na plik z listy

0

Hejka.
Mam pytanie jak w temacie na listboxiie mam dodane pliki jak zrobić by na zaznaczonym pliku z listwy 2xclick i się odtwarzał mam mediaplayera na formie.

Próbowałam sama ale będę szczera programowanie to nie moja bajka po prostu musze zaliczyć.
Szukałam w gogle ale nie potrafiłam znaleźć podobnej playlisty jako przykładu
Dziękuję

zrobiłam cos takiego jak poniżej.
ale klikając w uruchomionym programie wywala komunikat:

Nie można ustalić typu urządzenia na podstawie podanego rozszerzenia pliku :(
w lisboxie załadowane są pliki mp3

procedure TForm2.ListBox1Click(Sender: TObject);
begin
 if ListBox1.ItemIndex > -1 then
   begin
   MediaPlayer1.Open;
   MediaPlayer1.Play;
   end;
end;
0

A przypisałeś cokolwiek do MediaPlayer.FileName?

0

Nie, tego już nie potrafię :( Co mogłam tyle zrobiłam dalej to już czarna magia

0

Powoli zaczynam kumać ale czegoś mi brakuje kurcze jeszcze

procedure TForm2.ListBox1Click(Sender: TObject);
begin
if ListBox1.ItemIndex > -1 then
begin

   MediaPlayer1.FileName:=ListBox1.ItemIndex ;
   MediaPlayer1.Open;
   MediaPlayer1.Play;
   end;
   end;
 end;


end.
0

Jeśli nie znasz choćby podstaw programowania to raczej nie napiszesz żadnego programu;

MediaPlayer1.FileName:=ListBox1.ItemIndex ;

MediaPlayer.FileName to łańcuch znaków, a ListBox.ItemIndex to liczba - nie możesz bezpośrednio przypisać liczby do łańcucha znaków, czego rezultatem będzie błąd kompilacji; Jeśli chcesz pobrać tekst z zaznaczonej pozycji w ListBox i jego przypisać do właściwości MediaPlayer to należy tak to zapisać:

MediaPlayer.FileName := ListBox.Items[ListBox.ItemIndex];
0

Dziękuję ale mam pytanko bo wywala komunikat że nie można znaleźć określonego pliku.

Sprawdź czy nazwa pliku i ścieżka jest poprawna

To może być z mojej winy bo do listboxa wczytałam nazwy plików a nie całą ścieżkę. Czy to będzie powodem ?

0

Poczytaj o ścieżkach względnych i bezwzględnych; Jeżeli używasz ścieżek względnych to muszą odpowiadać bieżacej ścieżce, czyli tzw. Current Directory lub jak kto woli Working Directory (z reguły jest to ścieżka pliku wykonywalnego).

0

Dziękuje za pomoc.
Ostatnia prośba ale proszę nie pisz że bez podstaw itd... na samym wstępie napisałam że to nie moja bajka
interesuje się grafiką i fotografią przez to muszę jakoś przebrnąć, ale sama próbuje coś też wydusić.
Naprawdę wiele pomogłeś dziękuję wiec zrozumiem.
szukałam o ścieżkach ale nie znalazłam konkretnych przykładów by porównać.
Chciała bym by tutaj przeszukiwać i dodawać plik z pod folderów od wskazanego ale pal licho i tak kolejna noc nie przespana.
Niech tylko to zatrybi na więcej do jutra nie zdarzę nad tym siędze już z dwa tygodnie:
Powiedz tylko PROSZĘ gdzie jest błąd

procedure TForm2.Button1Click(Sender: TObject);
var
  Directory: String;
  begin
  if SelectDirectory('Dodaj pliki', 'C:', Directory) then                       ** // tutaj**
     Listamp3(IncludeTrailingPathDelimiter(Directory), ListBox1.Items);
  end;

procedure Listamp3(const APath: String; AFilesList: TStrings);
var
  fileload: TSearchRec;
begin
  if FindFirst(APath + '*.mp3', faAnyFile, fileload) = 0 then            ** // tutaj 
**  try
    repeat
      AFilesList.Add(fileload.Name);
    until FindNext(fileload) <> 0;
  finally
    FindClose(fileload);
  end;
end;
0

jaki masz błąd ? bo na pierwszy rzut oka wszystko jest prawidłowo

0

Jak klikam w plik mp3 na liście chce go odtworzyć wywala komunikat:

"Sprawdź czy nazwa pliku i ścieżka jest poprawna"

0

czyli wywala błąd nie w zacytowanym kodzie , ale zupełnie gdzie indziej, chociaż wynika z błędu w tym kodzie

to powinno zadziałać zgodnie z Twoimi oczekiwaniami

procedure Listamp3(const APath: String; AFilesList: TStrings);
var
  fileload: TSearchRec;
begin
  if FindFirst(APath + '*.mp3', faAnyFile, fileload) = 0 then
    try
      repeat
        AFilesList.Add(APath + fileload.Name); 
      until FindNext(fileload) <> 0;
    finally
      FindClose(fileload);
    end;
end;

Krótko mówiąc, kod który wkleiłaś robi dokładnie to do czego został zaprojektowany , czyli do listboxta wstawia same nazwy plików, a Ty potrzebujesz nazwę z ścieżką

0

Może trzeba też ustawić DeviceType? Nie używałem tego komponentu, ale spróbuj dodać na początku jeszcze to:

MediaPlayer1.DeviceType := dtAutoSelect;

Przy czym pasowałoby sprawdzić też, czy ścieżki faktycznie są prawidłowe.

0

Duże Browary dla was Chłopaki StoKrotne DZIĘKUJĘ :)

Nic nie róbcie bo dużo pomogliście ale zapytam dużo było by zmian jeśli bym chciała by by pliki były by do dawne nie tylko ze wskazanego folderu ale i z pod folderów.
Jeśli nie to na którym miejscu w kodzie się skupić przy ButtonClick ?

0

aby przeszukać wszystkie podfoldery w poszukiwaniu plików '*.mp3" należało by zaprząc do tego rekurencję,przeróbka nie była by duża

0

A co do:

AFilesList.Add(APath + fileload.Name);

tak bo jak zaczęłam robić ten program to chciałam mieć w liście nazwy plików tylko a nie całą ścieżkę widoczną, miałam nadzieje że to się jakoś zapamięta, potem zapomniałam w którym miejscu to było
nie dziwcie się blondynka :) żeby to ukryć cała ścieżkę a wyświetlać musiała bym ją wczytać do pamięci? nie da się dodać linijki z czymś ala visible :) to nie na moją głowę

1

w ten sposób przeszukasz wszystkie podfoldery

procedure Listamp3(const APath: String; AFilesList: TStrings);
var
  fileload: TSearchRec;
begin
  if FindFirst(APath + '*.mp3', faAnyFile, fileload) = 0 then
    try
      repeat
        AFilesList.Add(APath + fileload.Name);
      until FindNext(fileload) <> 0;
    finally
      FindClose(fileload);
    end;
  if FindFirst(APath + '*.*', fadirectory, fileload) = 0 then
    try
      repeat
        if (fileload.Name <> '.') and (fileload.Name <> '..') then
          Listamp3(APath + fileload.Name + '\', AFilesList);
      until FindNext(fileload) <> 0;
    finally
      FindClose(fileload);
    end;

end;
0

Właśnie czytałam o rekurencji... jak mam Dziękować ?
mało jest takich ludzi, nawet tutaj
DZIĘKUJĘ

0

Chłopaki wybaczcie że truję i psuję sobotę i wasz spokój zrobiliście bardzo wiele,
wszystko śmiga pytam z ciekawości przy dwóch plikach .mp3(inne się otwierają) przy próbie odtworzenia wywala komunikat

Wystąpił błąd podczas incicjowania MCI

Windows player poza tym program je otwiera a tu się burzy,

Ale to pewnie jakieś może biblioteki albo cholera wie co, Pytam bo Wy się znacie na rzeczy i gdyby jutro taki się przypadek przydarzył na zajęciach przy testowaniu wiedzieć w namiastce co odpowiedzieć

0

Ale jestem głupia dostałam zaliczenie nie przyjęłam dostałam w punktach co program ma robić.
Mam miesiąc, głupia ambitna blondynka. Zaliczony już empik i co było o Delphi to moje.

Czemu pisze i zaśmiecam forum bo chce powiedzieć że się udało dzięki WAM i podziękować jeśli jesteście z okolic Katowic zapraszam na zasłużone piwo SERIO.

Korzystając z okazji zapytam Was czy to co dodam w punktach ogarnę w miesiąc:
Jak to było z wami na początku

  1. forma pierwsza buton (główny folder programu) czyli tak jak zrobiliśmy a w zasadzie Wy od razu wczytuje do listboxa (jest na formie2) ale jest też możliwość odwołania się do wskazanego folderu przez inne procedury(w kolejnym semestrze jakie to kurna było śmieszne ) by za każdym razem nie otwierać okna dialogowego.
    Wybrany folder wyświetla się w labelu

  2. w listboxie przy plikach wyświetla się index (są numerowane ale nie od zera jak to robi listbox tylko od 1) do ilości wczytanych, suma plików w listboxie jest wyświetlana na bieżąco w labelu. (Po usunięci / dodaniu pliku suma się aktualizuje)

  3. w listboxie wyświetla się tylko nazwa pliku bez ścieżki i rozszerzenia.

  4. przycisk start/next play odtwarza pliki losowo ale nie automatycznie po końcu odtwarzania jednego pliku trzeba znów kliknąć.

Dla mnie to już chyba piąty rok programowania, mam miesiąc już się mam modlić ? Ile coś takiego kosztuje by ktoś to zrobił chociaż kupiłam książki mam załamke

0

Większość jest bardzo prosta do wykonania, więc nie ma się co załamywać od razu;

  1. Co to znaczy "odwołania się do danego folderu przez inne procedury"? Można to wykonać w ten sposób, że wybieramy katalog główny i program ładuje do listy utworów wszystkie pliki znajdujące się w tym katalogu oraz w jego podkatalogach; Wyświetlenie ścieżki katalogu w etykiecie to jedna instrukcja przypisania, więc nic skomplikowanego;
  2. Też nic skomplikowanego - liczbę pozycji z komponencie można odczytać za pomocą właściwości ListBox.Count; Aby wyświetlić tę liczbę w etykiecie, należy ją przekonwertować na ciąg znaków, np. za pomocą funkcji IntToStr lub Format (ta druga wygodniejsza); Możliwość zareagowania na dodanie/usunięcie pozycji to obsługa zdarzenia ListBox.OnChange komponentu, więc znów nic trudnego;
  3. Można to wykonać w ten sposób, że pozycje kontrolki zawierają pełne ścieżki plików dźwiękowych, ale wyświetlane są jedynie nazwy; Wystarczy obsłużyć zdarzenie ListBox.OnDrawItem i samemu kilkoma instrukcjami malować tekst; Jeśli zawartość podkatalogów także ma być ładowana do listy utworów to będzie to dobry pomysł;
  4. Losowanie utworu ogranicza się do wylosowania liczby z zadanego przedziału, a to w całości implementuje funkcja RandomRange.
0

Źle pewnie pierwszy punkt sformułowałam spróbuję.
Chodzi o to by ścieżka do folderu była zapamiętana jakoś oddzielnie aczkolwiek tym samym przyciskiem od razu dodalibyśmy pliki do listboxa . Nie wiem funkcja co zapamięta automatycznie ścieżkę co będzie możliwość odwołania się do niej.
A jak to z byt skomplikowane rozbić na dwa buttony
Button1 otwiera okno dialogowe by wskazać folder ścieżkę do niego wyświetla w labelu ale ją zapamiętuje.
button2 wczytuje po clicku pliki do listboxa ze scieźki do folderu wskazanego buttonem1

3 i tego punktu nie wykonam bo tego nie ogarniam resztę może siedząc w książkach metoda prób i błędów się uda wierze w to.

Ale z 1 i 3 proszę o pomoc nawet postawie piwo czy zapłacę podajcie numer konta poczekajcie aż przelew dojdzie jak dojdzie pomożecie jestem po prostu przerażona chyba nie dam rady

0
procedure TForm3.ButtonSelectDirClick(Sender: TObject);
var
  Directory: String;
begin
  if SelectDirectory('Dodaj pliki', 'C:', Directory) then
    self.Labelpath.caption := Directory;
end;

procedure TForm3.ButtonListDirClick(Sender: TObject);
begin
  if trim(self.Labelpath.caption) <> '' then
    Listamp3(IncludeTrailingPathDelimiter(self.Labelpath.caption), ListBox1.Items);
end;
0

Bardzo proszę rozjaśnij, nie gniewaj się
dodaje to ale labelpath i błąd dodałam labela1 tu tez zmieniłam na label1path masakra ze mną wiem

0

labelpath to obiekt klasy Tlabel który wyświetla i równocześnie przechowuje ścieżkę do folderu

0

Proszę powiedz jednym słowem rozbiłeś to na dwa butony tak jak prosiłam
było tak:

procedure TForm2.Button1Click(Sender: TObject);
var
  Directory: String;
  begin
  if SelectDirectory('Dodaj pliki', 'C:', Directory) then                       ** // tutaj**
     Listamp3(IncludeTrailingPathDelimiter(Directory), ListBox1.Items);
  end;


procedure Listamp3(const APath: String; AFilesList: TStrings);
var
  fileload: TSearchRec;
begin
  if FindFirst(APath + '*.mp3', faAnyFile, fileload) = 0 then
    try
      repeat
        AFilesList.Add(APath + fileload.Name);
      until FindNext(fileload) <> 0;
    finally
      FindClose(fileload);
    end;
  if FindFirst(APath + '*.*', fadirectory, fileload) = 0 then
    try
      repeat
        if (fileload.Name <> '.') and (fileload.Name <> '..') then
          Listamp3(APath + fileload.Name + '\', AFilesList);
      until FindNext(fileload) <> 0;
    finally
      FindClose(fileload);
    end;
 
end;

Pierwszego butona mam zamienić procedury do lisboxa nie zmieniać a kolejny dodać
pytam bo wywala taki błąd

[dcc32 Error] Unit2.pas(83): E2003 Undeclared identifier: 'Labepath'
ale mam label w sekcji type dodany

type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    MediaPlayer1: TMediaPlayer;
    Button4: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}
[
0

masz Tlabel , ale nazywa się Label1 , a w kodzie masz podstawienie pod label o nazwie "Labelpath'

 Labelpath: TLabel;
0

a to odnośnie punktu 3

procedure TForm3.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Flags: Longint;
  Data: String;
begin
  self.ListBox1.canvas.FillRect(Rect);
  Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
  Data := inttostr(index + 1) + ' : ' + extractfilename(self.ListBox1.Items[index]);
  DrawText(self.ListBox1.canvas.Handle, Data, Length(Data), Rect, Flags);
end;

przypisz tę metodę do własności 'ondrawitem' listboxa
a w listboksie będą same nazwy plików z numerem kolejnym

0

wiem że nie mogę o to prosić ale już mam taki burdel że nie wiem jak to poukładać z tym co było
znalazł byś czas by to wszystko ułożyć ? Proszę, pewnie przez to ze to mam na dwóch formach już mam mętlik Sama już widzę potrójnie ten kod

Zrobiłam to na jedną formę Wyrzuciłam wszystko od nowa na jedną formę: Zerknij tylko
burzy się funkcja - TForm1.ListBox1DrawItem- pewnie zapomniałam o czymś i buton 2 nie doaje plików do listboxa (buton 1 miałał tylko zapisać ścieżkę) Ja już mam mętlik i depresje jak baba chyba się poddaje

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.FileCtrl, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    Labelpath:TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

  procedure ListFiles(const APath: String; AFilesList: TStrings);
var
  LFileRec: TSearchRec;
begin
  if FindFirst(APath + '*.mp3', faAnyFile, LFileRec) = 0 then
    try
      repeat
        AFilesList.Add(APath + LFileRec.Name); // doaje całą ścieżke
      until FindNext(LFileRec) <> 0;
    finally
      FindClose(LFileRec);
    end;
  if FindFirst(APath + '*.*', fadirectory, LFileRec) = 0 then
    try
      repeat
        if (LFileRec.Name <> '.') and (LFileRec.Name <> '..') then
          ListFiles (APath + LFileRec.Name + '\', AFilesList);
      until FindNext(LFileRec) <> 0;
    finally
      FindClose(LFileRec);
    end;
 end;

 procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Flags: Longint;
  Data: String;
begin
  self.ListBox1.canvas.FillRect(Rect);
  Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
  Data := inttostr(index + 1) + ' : ' + extractfilename(self.ListBox1.Items[index]);
  DrawText(self.ListBox1.canvas.Handle, Data, Length(Data), Rect, Flags);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  Directory: String;
begin
  if SelectDirectory('Dodaj pliki', 'C:', Directory) then
    self.Labelpath.caption := Directory;
end;

procedure TForm1.Button2Click(Sender: TObject);

begin
  if trim(self.Labelpath.caption) <> '' then
     ListFiles(IncludeTrailingPathDelimiter(self.Labelpath.caption), ListBox1.Items);
end;

end.
1

nie bardzo wiem gdzie masz problem ale wklejam działający kod
ustawienie stylu listboxa na lbOwnerDrawFixed wstawiłem do Create formy, ale równie dobrze można to zrobić z poziomu inspektora obiektów

unit Unit3;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ButtonSelectDir: TButton;
    ButtonListDir: TButton;
    Labelpath: TLabel;
    procedure ButtonSelectDirClick(Sender: TObject);
    procedure ButtonListDirClick(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ListFiles(const APath: String; AFilesList: TStrings);
var
  LFileRec: TSearchRec;
begin
  if FindFirst(APath + '*.mp3', faAnyFile, LFileRec) = 0 then
    try
      repeat
        AFilesList.Add(APath + LFileRec.Name); // doaje całą ścieżke
      until FindNext(LFileRec) <> 0;
    finally
      FindClose(LFileRec);
    end;
  if FindFirst(APath + '*.*', fadirectory, LFileRec) = 0 then
    try
      repeat
        if (LFileRec.Name <> '.') and (LFileRec.Name <> '..') then
          ListFiles(APath + LFileRec.Name + '\', AFilesList);
      until FindNext(LFileRec) <> 0;
    finally
      FindClose(LFileRec);
    end;
end;

procedure TForm1.ButtonSelectDirClick(Sender: TObject);
var
  Directory: String;
begin
  if SelectDirectory('Dodaj pliki', 'C:', Directory) then
    self.Labelpath.caption := Directory;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  self.ListBox1.Style := lbOwnerDrawFixed;
end;

procedure TForm1.ButtonListDirClick(Sender: TObject);
begin
  if trim(self.Labelpath.caption) <> '' then
    ListFiles(IncludeTrailingPathDelimiter(self.Labelpath.caption), ListBox1.Items);
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Flags: Longint;
  Data: String;
begin
  self.ListBox1.canvas.FillRect(Rect);
  Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
  Data := inttostr(index + 1) + ' : ' + extractfilename(self.ListBox1.Items[index]);
  DrawText(self.ListBox1.canvas.Handle, Data, Length(Data), Rect, Flags);
end;

end.

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