CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Playlista na listview zapis/odczyt z pliku.
Strona 2 z 3

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: środa, 18 grudnia 2019, 22:44
przez polymorphism
Zrozumiałeś w ogóle, co ta funkcja robi, czy tylko przeczytałeś path w komentarzu i ... w sumie nie wiem, co sobie pomyślałeś. Jaki to ma związek z tematem wątku?

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: środa, 18 grudnia 2019, 22:54
przez Peter_M
polymorphism napisał(a):Nie pomyliłeś kolumn z wierszami?
Fakt, miało być wiersze. Nie mniej jednak wiadomo o co mnie chodzi.
polymorphism napisał(a):Jeśli w listview nie ma pełnych ścieżek, to nie zapiszesz ich do pliku. Chyba że dodasz jeszcze jedną kolumnę, np. Path, w której będą pełne ścieżki do plików mp3. No i wtedy z górki.
Są na pewno, ponieważ mogę odtwarzać wybrane piosenki.
polymorphism napisał(a):Inna opcja, bardziej pr0, to listview działający w trybie virtual, wtedy całą playlistę trzymasz w wektorze (wraz ze ścieżkami). Poczytaj o właściwości TListView::OwnerData.
Czytałem o tej właściwości, i wygląda na to że było by to odpowiednie, musiał bym jakies przykłady zastosowania komponentu ListView z użyciem OwnerData popatrzyć, swoją drogą ja pro koderem nie jestem początkujący programista - amator :)
swoją drogą może Autor forum CyfrowyBaron, ma jakieś materiały, sugestie?
lukagrom napisał(a):Naturalnie mój błąd ze złych przyzwyczajeń, oczywiście powinno być:
KOD cpp:     UKRYJ  
ofstream music_F1;
 music_F1.open(name_File.c_str());
 music_F1<<result_Mus.c_str();
 music_F1.close();
 


A na stackoverflow znalazłem funkcję do ścieżki dostępu:
Quick and nice solution is to use this function to remove chars from string:

KOD cpp:     UKRYJ  
void removeCharsFromString( string &str, char* charsToRemove ) {
   for ( unsigned int i = 0; i < strlen(charsToRemove); ++i ) {
      str.erase( remove(str.begin(), str.end(), charsToRemove[i]), str.end() );
   }
}

string myAbsolutepath; //fill with your absolute path
removeCharsFromString( myAbsolutepath, "\"" );
 
Funkcja ta najprawdopodobniej usuwa znaki ze stringów, zupełnie nie nada się do zapisu PlayListy z komponentem Listview.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: środa, 18 grudnia 2019, 22:57
przez lukagrom
Tak, zrozumiałem w całej rozciąglości, po czym po kilku głębszych odinstalowałem ten builderowski pakiet dla wybranych, kierując jednocześnie prośbę do admina o usunięcie mego konta z tego dynamicznego forum.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: środa, 18 grudnia 2019, 23:15
przez polymorphism
O jakim pakiecie dla wybranych piszesz? O C++ Builderze?

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: czwartek, 19 grudnia 2019, 11:43
przez polymorphism
Są na pewno, ponieważ mogę odtwarzać wybrane piosenki.

Pisałem o listiew. Czego używasz do odtwarzania tych mp3ek?

musiał bym jakies przykłady zastosowania komponentu ListView z użyciem OwnerData popatrzyć

Nie jest to jakieś skomplikowane. Ustawiasz OwnerData na true. Tworzysz zdarzenie TListView::OnData, w którym kontrolka będzie prosić o podanie danych dla poszczególnych pozycji w listview, które w danej chwili będą wyświetlane. Jeśli mnie pamięć nie myli, w TListView::Items::Count ustawiasz ilość elementów.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: czwartek, 19 grudnia 2019, 13:29
przez Peter_M
polymorphism napisał(a):Pisałem o listiew. Czego używasz do odtwarzania tych mp3ek?
Tak. Ja tak samo nawiązałem do komponentu listview. W jakim sensie? Czy mam inny odtwarzacz czy o coś innego? Wiesz playlistę to troszkę chciałem skopiować z foobar2000 tam prawdopodobnie jest ona zrobiona z komponentu listview.
polymorphism napisał(a):Nie jest to jakieś skomplikowane. Ustawiasz OwnerData na true. Tworzysz zdarzenie TListView::OnData, w którym kontrolka będzie prosić o podanie danych dla poszczególnych pozycji w listview, które w danej chwili będą wyświetlane. Jeśli mnie pamięć nie myli, w TListView::Items::Count ustawiasz ilość elementów.
No tak. Mimo wszystko lepiej się będę czuł mając przed sobą schemat jak można dodać element do listview mając włączony ownerData. Albo może coś poszukam.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: czwartek, 19 grudnia 2019, 13:34
przez Peter_M
lukagrom napisał(a):Tak, zrozumiałem w całej rozciąglości, po czym po kilku głębszych odinstalowałem ten builderowski pakiet dla wybranych, kierując jednocześnie prośbę do admina o usunięcie mego konta z tego dynamicznego forum.
Ale ja jestem bardzo wdzięczny że grupka ludzi którzy mają doświadczenie w tej branży chce mi pomóc z tym komponentem listview robiąc wspólnie playlistę. Ja nie widzę powodu żebyś usuwał konto tu na forum jak i buildera. Naprawdę.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: czwartek, 19 grudnia 2019, 14:21
przez polymorphism
W jakim sensie?

Chodzi mi o bibliotekę. Nie pytam się przecież, czy używasz Winampa, czy też innego foobara ;)

Albo może coś poszukam.

Albo poeksperymentuj. Stwórz nowy projekt z listview i sprawdź to całe OwnerData. Na tym polega nauka programowania, że jak nie ma czegoś pokazane wprost, to trzeba kombinować, testować. W ostateczności napisz priva do Barona, niech Ci przykładowy projekt zrobi. Ja nie mogę, bo nie używam C++ Buildera od lat.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: czwartek, 19 grudnia 2019, 15:08
przez Peter_M
Tak. Biblioteka to libzplay, pamiętam jak pomogłeś mi w bitmapie dla graphu, ale jak doczytałem może ona podstawowe formaty plików audio odtwarzać natomiast MP4 wma WMV i innych już nie, zwraca błąd . Kurde jak tak patrzę na ten mój projekt to robi się powoli gruby odtwarzacz audio.
No będę kombinował testował na testowym projekcie gdzie mam miejsce na testy nowych funkcji co by nie psuć aplikacji bazowej (MP3Play). Dzięki temu sam widzę po sobie że jakiś progress jest.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: czwartek, 19 grudnia 2019, 20:46
przez polymorphism
Z tego, co widzę, w tej bibliotece można dodać pliki do kolejki odtwarzania, ale nie widzę, żeby można było tę kolejkę jakoś edytować, czy nawet listować (popraw mnie, jeśli się mylę). Czyli taka playlista musi być w formie zewnętrznej listy (np. std::vector<klasa_reprezentująca_plik>).

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: czwartek, 19 grudnia 2019, 23:27
przez Peter_M
polymorphism napisał(a):Z tego, co widzę, w tej bibliotece można dodać pliki do kolejki odtwarzania,
Tak, jest tam Funkcja AddFile
polymorphism napisał(a):ale nie widzę, żeby można było tę kolejkę jakoś edytować, czy nawet listować (popraw mnie, jeśli się mylę).
No właśnie, Ja również nie znalazłem nic na ten temat.
polymorphism napisał(a):Czyli taka playlista musi być w formie zewnętrznej listy (np. std::vector<klasa_reprezentująca_plik>).
Można prosić o jakiś przykład twego zamysłu, jak by miało to wyglądać?

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: piątek, 20 grudnia 2019, 12:20
przez polymorphism
Tak to widzę:
KOD cpp:     UKRYJ  
class PlaylistItem
{
        unsigned mNumber;
        std::string mTitle;
        std::string mArtist;
        std::string mAlbum;
        std::string mPath;

public:
        PlaylistItem(ZPlay &zplay, std::string path)
        : mPath(std::move(path))
        {
                // tu z IDtagów wyciągasz resztę danych
        }      

        unsigned getNumber() const { return mNumber; }
        std::string getTitle() const { return mTitle; }
        std::string getArtist() const { return mArtist; }      
        std::string getAlbum() const { return mAlbum; }
        std::string getPath() const { return mPath; }
};



std::vector<PlaylistItem> playList;
...

// gdzieś, gdzie jest obsługa przycisku play
player->Close();

for (size_t i = playFrom; i < playList.size(); ++i)
        player->AddFile(playList[i].getPath(), sfAutodetect);

player->Play();


// zapis playlisty
std::ofstream ofs("filename");

for (auto &i : playList)
        ofs << i.getPath() << '\n';


// odczyt playlisty
std::string path;
std::ifstream ifs("filename");

while(std::getline(ifs, path))
        playList.emplace_back(*player, path);

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: piątek, 20 grudnia 2019, 16:47
przez lukagrom
Jeszcze sobie pozwolę dygresję dopisać, bo sam dziergam coś podobnego.
Przyjmując uproszczenie założenie, że baza muzyczna jest już na dysku i przyjmuje postać, katalogów z plikami .mp3, to ja bym do odtwarzania i poruszania się wybrał prymitywniejsze rozwiązania, bo bazujące bezpośrednio na komponentach C++ Buildera.
Czyli. Skoro są już katalogi i pliki, to komponenty: DirectoryListBox, FileListBox, ListBox i do samego odtwarzania builderowy MediaPlayer.
W skrócie na początku należy połączyć DirectoryListBox i FileListBox czyli własność FileList DirecoryListBox na FileListBox,
Tym samym już można przemieszczać się po wybranych na dwóch komponentach przemieszczać się po katalogach i plikach (inna kwestia czy poszło by to zawęzić do jakiegoś obszaru np głównego katalogu muzyka z podkatalogami i plikami muzycznymi).
Odtworzenie interesującej playlisty z takiej bazy jest trywialne - klikamy na wybrane pliki z FileListBox i przenosimy z automatu do ListBoxa.
KOD cpp:     UKRYJ  
void __fastcall TForm1::FileListBox1Click(TObject *Sender)
{
 ListBox1->Items->Add(FileListBox1->FileName);
}
 

Odtworzenie pojedyńczego utworu przez kliknięcie w utwór z ListBoxa:
KOD cpp:     UKRYJ  
 MediaPlayer1->FileName=ListBox1->Items->Strings[ListBox1->ItemIndex];
 MediaPlayer1->Open();
 MediaPlayer1->Play();
 

Odtworzenie wybranej listy (i tego nie jestem pewien, bo tworzę to trochę na sucho).
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 int ilosc_Utworow=ListBox1->ItemIndex;
 for(int i=0;i<ilosc_Utworow;i++)
 {
  MediaPlayer1->FileName=ListBox1->Items->Strings[i];
  MediaPlayer1->Open();
  MediaPlayer1->Play();
  MediaPlayer1->Close();
 }

}
 

I pozostaje kwestia zapisu całości playlisty lub pojedyńczego utworu, co jest tylko wykorzystaniem ListBoxa i wielu z możliwych "builderowych" metod zapisu jak choćby SaveToFile, czy użycie w ogóle komponentu SaveDialog. Oczywiście należy dla koponentów uwzględnić w filtrach właściwości plików (.mp3,.wav, etc), żeby nie pojawiały się zawiechy MediaPlayera.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: piątek, 20 grudnia 2019, 17:28
przez Peter_M
O jak miło, widzieć przyjaciela Lukagrom, mam nadzieję, że jednak zmienił zdanie i pozostanie w gronie builderowców.
lukagrom napisał(a):Przyjmując uproszczenie założenie, że baza muzyczna jest już na dysku i przyjmuje postać, katalogów z plikami .mp3, to ja bym do odtwarzania i poruszania się wybrał prymitywniejsze rozwiązania, bo bazujące bezpośrednio na komponentach C++ Buildera.
Czyli. Skoro są już katalogi i pliki, to komponenty: DirectoryListBox, FileListBox, ListBox i do samego odtwarzania builderowy MediaPlayer.
Tak, tylko że ja już cały mechanizm odtwarzania , dodawania pojedynczych piosenek mam już zrobiony i bazuje na darmowej bibliotece LibZPlay. Pozostała właśnie PlayLista właściwie to jej zapis i odczyt, a także tzw Drag and drop, która bazuje na komponencie ListView, ponieważ dodawanie DirectoryList, mam zbudowane na komponencie TsDirectoryList z pakietu AlphaSkins. Nie mniej jednak ListBox ma wiele wspólnego z ListView, więc twoje wskazówki porady, na pewno będą pomocne w napisaniu funkcji zapisu i odczytu playlisty z pliku na komponencie ListView.

Re: Playlista na listview zapis/odczyt z pliku.

Nowy postNapisane: piątek, 20 grudnia 2019, 17:47
przez lukagrom
Ale to swoją drogą, nie dziwne, że mając potężny pakiet programistyczny, którego wersje są horendarnie drogie, trzeba uciekać do zewnętrznych bibliotek i to jeszcze open source? Gdybym miał czas to bym znalazł jakiegoś gotowca z jakiejś złożonej playlisty z wypasioną obsługą plików. Zakładam, że mimo wszystko komponenty Embarcadero i ich metody, na pewno umożliwiają jakąś drogę komfortową i jednocześnie skrótową dla takich zagadnień. Oni mieli kiedyś nawet taką dewizę, jak najmniej pisania, klikaniem i automatyką, wszystko można ogarnąć.