CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pozycja TrackBar(slider) - zapis do pliku.
Strona 1 z 2

Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: wtorek, 15 października 2019, 17:47
przez Peter_M
Witam. piszę sobie prosty equalizer multimedialny i chciałbym zapytać w jaki sposób mogę zapisać położenia sliderów do pliku. Jest na to jakiś w miarę prosty sposób?
Chciałbym do tego celu użyć komponentów SaveDialog i OpenDialog.
Próbowałem z użyciem dyrektywy fstream, ale plik wynikowy zwraca same zera, a slidery po zapisaniu do pliku, lecą w dół, Equalizer używa zewnętrznej libki LibZPlay(darmowej), oraz na formie jest 20 Bandów.

O to mój kod:
KOD cpp:     UKRYJ  
        if(SaveSettings->Execute()) //SaveSettings to jest komponent SaveDialog
                {

                        ofstream ofs(SaveSettings->FileName.c_str());
                        TTrackBar *BandPosition[20] = {B20Hz, B40Hz, B90Hz, B150Hz, B220Hz,
                        B320Hz, B450Hz, B600Hz, B800Hz, B1_2kHz, B2_0kHz, B3_0kHz, B4_5kHz,
                        B6_0kHz, B8_0kHz, B10_0kHz, B12_0kHz, B14_0kHz, B17_0kHz, B20_0kHz};

                        for(int i = 0, mdB = 0; i<20&&ofs<<mdB; ++i)
                        {
                                MainForm->EQSetPlayer->SetEqualizerBandGain(i, mdB);
                                BandPosition[i]->Position = BandPosition[i]->Max-mdB/1000 + BandPosition[i]->Min;

                        }
                }

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: wtorek, 15 października 2019, 21:52
przez Cyfrowy Baron
Użyj plików *.ini. To najprostszy sposób

http://programuj.cal.pl/cyfbar/teor6.html

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: wtorek, 15 października 2019, 22:22
przez Peter_M
W zasadzie tak. Ale chciałem zapisywać do plików txt.
Ponieważ przyjmijmy, że użytkownik będzie chciał załadować dane ustawienia z kilku plików, a nie jednego, gdyby użytkownik tylko chciał z jednego pliku to oczywiście pliki .ini to najprostszy sposób, dlatego właśnie chciałem użyć do tego celu komponenty SaveDialog, i OpenDialog.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 09:31
przez Mironas
Plik INI to też jest plik tekstowy. Nie ma problemu aby wczytywać/zapisywać dane do pliku INI wybranego w OpenDialog/SaveDialog.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 11:17
przez polymorphism
Rozwiązanie, które dostałeś na Forum Pasja Informatyki, nie działa?



ale plik wynikowy zwraca same zera

A co ma zapisywać, skoro w pętli zapisujesz wartość mdB, która ma się nijak do ustawień EQ? Zawartość pętli wygląda, jakby miała to być pętla odczytująca ustawienia EQ z pliku, a nie zapisująca.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 13:22
przez Peter_M
Mironas napisał(a):Plik INI to też jest plik tekstowy. Nie ma problemu aby wczytywać/zapisywać dane do pliku INI wybranego w OpenDialog/SaveDialog.

Zastanowię się nad tym wariantem.
polymorphism napisał(a):Rozwiązanie, które dostałeś na Forum Pasja Informatyki, nie działa?
Jak widać, plik wynikowy zwraca same zera.
polymorphism napisał(a):A co ma zapisywać, skoro w pętli zapisujesz wartość mdB, która ma się nijak do ustawień EQ? Zawartość pętli wygląda, jakby miała to być pętla odczytująca ustawienia EQ z pliku, a nie zapisująca.

No tak, otrzymana wskazówka z forum pasja informatyki zawiera pętlę odczytującą i skoro taki jest jej zapis to pomyślałem, że podobnie napiszę jako pętlę zapisującą z użyciem klasy ofstream.
Może potrafił byś przekształcić kod lub dać wskazówkę jak by miało to wyglądać? Będę wdzięczny.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 14:19
przez polymorphism
Przecież dostałeś tam przykłady obu pętli - zapisującej i odczytującej.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 14:55
przez lukagrom
A mnie się nasunęło takie pytanie, związane z problemem zapisu. Zapisuje w czystym C tablicę int-ów, bez problemu. Z kolei gdy chcę zapisać tablicę komponentu TTrackBar z wartością Position (int), kompilator się wywala (access violation at address). Już pokazuj o co chodzi.
1) zapis tablicy int-ów:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int i,tab[20];
 FILE *plik;
  plik=fopen("dane_trackow11.txt","w");
  for(i=0;i<20;i++)
  {
    tab[i]=i+1;
    fprintf(plik,"%d\n",tab[i]);
   }
   fclose(plik);

}
 

I ten sam sposób z wartością Position(int), tablicy komponentów:
KOD cpp:     UKRYJ  
void __fastcall TForm1::rClick(TObject *Sender)
{

  int i;
  TTrackBar *BandPosition[20]   ;
  FILE *plik;
  plik=fopen("dane_trackow12.txt","w");
  for(i=0;i<20;i++)
        {
                BandPosition[i]->Position=i;
                fprintf(plik,"%d\n",BandPosition[i]->Position);

        }
        fclose(plik);
}
 

Kompiluje się ok, tyleż że dostaje zawiechy. Zakładam, że chyba trzeba specjalnie "rzutować" tą tablice - BandPosition.
Podejrzewałem, też że może fprintf zle wpspolpracuje w petli. Jednakze i ten przyklad na dole, juz bez petli, tez dostaje zawiechy w czasie uruchomienia.
KOD cpp:     UKRYJ  
 int i;
  TTrackBar *BandPosition[2];
  BandPosition[0]->Position=4;
  FILE *plik;
  plik=fopen("dane_trackow13.txt","w");
  fprintf(plik,"%d",BandPosition[0]->Position);
        fclose(plik);
 

Analogicznie sprawa się ma przy zap[isie z użyciem biblioteki fstream. Również zawiecha przy zapisie BandoPosition[i]->Position.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 15:23
przez lukagrom
Już rozwiązałem. Te TrackBarry do których odwołuje się tablica, muszą gdzieś istnieć, więc dla ostatniego przykładu wystarczy dopisać:
KOD cpp:     UKRYJ  
TTrackBar *BandPosition[2]={TrackBar1,TrackBar2};
 

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 15:32
przez Peter_M
polymorphism napisał(a):Przecież dostałeś tam przykłady obu pętli - zapisującej i odczytującej.

Tak, są tam, lecz próbowałem je zastosować, ale zapis tworzy plik z samymi zerami, a odczyt niestety nie ładuje utworzonego pliku.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 15:59
przez Peter_M
Zadziałało. Aż sam nie wierzę, że to uczyniłem, z waszymi wskazówkami.
W pętli zapisującej Po prostu dałem aby zapisywał pozycję do pliku.
Coś takiego:
KOD cpp:     UKRYJ  
                        ofstream ofs(SaveSettings->FileName.c_str());
                        TTrackBar *BandPosition[20] = {B20Hz, B40Hz, B90Hz, B150Hz, B220Hz,
                        B320Hz, B450Hz, B600Hz, B800Hz, B1_2kHz, B2_0kHz, B3_0kHz, B4_5kHz,
                        B6_0kHz, B8_0kHz, B10_0kHz, B12_0kHz, B14_0kHz, B17_0kHz, B20_0kHz};
                        for(int i = 0; i<20; i++)
                        {
                                int SaveBands = BandPosition[i]->Position; //dodałem tu zmienną SaveBands typu int
                                ofs<<SaveBands<<"\n";

                        }

A w pętli Odczytującej podobnie wpisałem:
KOD cpp:     UKRYJ  
                ifstream ifs(LoadSettings->FileName.c_str());
                TTrackBar *BandPosition[20] = {B20Hz, B40Hz, B90Hz, B150Hz, B220Hz,
                B320Hz, B450Hz, B600Hz, B800Hz, B1_2kHz, B2_0kHz, B3_0kHz, B4_5kHz,
                B6_0kHz, B8_0kHz, B10_0kHz, B12_0kHz, B14_0kHz, B17_0kHz, B20_0kHz};
               
                for(int i = 0; i<20; i++)
                {
                   int LoadBands = BandPosition[i]->Position; //Dodałem zmienną typu int LoadBands;
                   ifs>>test;
                   BandPosition[i]->Position = LoadBands;
                }


Suwaki działają zgodnie z przeznaczeniem. Nie bylo konieczności wywoływania funkcji GetEqualizerBandGain z biblioteki LibZPlay.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: środa, 16 października 2019, 18:29
przez polymorphism
Ta druga pętla jest bez sensu. Wpisujesz pozycję suwaka do LoadBands, po czym z powrotem tę wartość przypisujesz do tego samego suwaka, a to, co czytasz z pliku, nie ma żadnego znaczenia.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: czwartek, 17 października 2019, 11:39
przez Peter_M
Jednak znaczenie ma. Ponieważ kod odpowiedzialny za bandy mam przypisany do zdarzeń onChange suwaków i gdy załaduje z pliku ustawienia to suwaki ładują swoją pozycję zgodnie z tym co jest w pliku. Czyli tak jak chciałem. I myślę że dlatego nie było potrzeby odrazu ładować ustawień do funkcji SETEQUALIZERBANDGAIN z biblioteki libzplay.
A gdy robiłem z użyciem przykładów, to za skarby nie mogłem załadować ustawień i suwaki szły w pozycję 0.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: czwartek, 17 października 2019, 13:09
przez polymorphism
Jednak znaczenie ma.

Jak ma, skoro czytasz z pliku wartość do zmiennej test i nic z nią później nie robisz?

A gdy robiłem z użyciem przykładów, to za skarby nie mogłem załadować ustawień i suwaki szły w pozycję 0.

Niewykluczone, że coś robiłeś źle.

Re: Pozycja TrackBar(slider) - zapis do pliku.

Nowy postNapisane: czwartek, 17 października 2019, 14:08
przez Peter_M
polymorphism napisał(a):Jak ma, skoro czytasz z pliku wartość do zmiennej test i nic z nią później nie robisz?

No tak, Błąd w nazewnictwie zmiennej, zamiast test powinno być LoadBands. W przeciwnym razie kompilator zwrócił by ->Undefind symbol test.
polymorphism napisał(a):Niewykluczone, że coś robiłeś źle.

Być może jestem na tyle słaby jeszcze w kodowaniu, że nie potrafię rozkminąć o co autorowi chodziło w napisanym kodzie. Nie mniej jednak teraz wszystko działa jak trzeba, po długiej walce.