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

Pozycja TrackBar(slider) - zapis do pliku.

dział ogólny

Pozycja TrackBar(slider) - zapis do pliku.

Nowy postprzez Peter_M » wtorek, 15 października 2019, 17:47

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;

                        }
                }
Avatar użytkownika
Peter_M
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): poniedziałek, 3 grudnia 2018, 23:36
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: RAD Studio 10.3.2
SKYPE: pikus_666
Gadu Gadu: 68554272
    WindowsChrome

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

Nowy postprzez Cyfrowy Baron » wtorek, 15 października 2019, 21:52

Użyj plików *.ini. To najprostszy sposób

http://programuj.cal.pl/cyfbar/teor6.html
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez Peter_M » wtorek, 15 października 2019, 22:22

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.
Avatar użytkownika
Peter_M
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): poniedziałek, 3 grudnia 2018, 23:36
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: RAD Studio 10.3.2
SKYPE: pikus_666
Gadu Gadu: 68554272
    WindowsChrome

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

Nowy postprzez Mironas » środa, 16 października 2019, 09:31

Plik INI to też jest plik tekstowy. Nie ma problemu aby wczytywać/zapisywać dane do pliku INI wybranego w OpenDialog/SaveDialog.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 467
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 22
Otrzymał podziękowań: 66
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

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

Nowy postprzez polymorphism » środa, 16 października 2019, 11:17

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez Peter_M » środa, 16 października 2019, 13:22

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.
Avatar użytkownika
Peter_M
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): poniedziałek, 3 grudnia 2018, 23:36
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: RAD Studio 10.3.2
SKYPE: pikus_666
Gadu Gadu: 68554272
    WindowsChrome

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

Nowy postprzez polymorphism » środa, 16 października 2019, 14:19

Przecież dostałeś tam przykłady obu pętli - zapisującej i odczytującej.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

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

Nowy postprzez lukagrom » środa, 16 października 2019, 14:55

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.
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

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

Nowy postprzez lukagrom » środa, 16 października 2019, 15:23

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};
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 129
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

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

Nowy postprzez Peter_M » środa, 16 października 2019, 15:32

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.
Avatar użytkownika
Peter_M
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): poniedziałek, 3 grudnia 2018, 23:36
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: RAD Studio 10.3.2
SKYPE: pikus_666
Gadu Gadu: 68554272
    WindowsChrome

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

Nowy postprzez Peter_M » środa, 16 października 2019, 15:59

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.
Avatar użytkownika
Peter_M
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): poniedziałek, 3 grudnia 2018, 23:36
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: RAD Studio 10.3.2
SKYPE: pikus_666
Gadu Gadu: 68554272
    WindowsChrome

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

Nowy postprzez polymorphism » środa, 16 października 2019, 18:29

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

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

Nowy postprzez Peter_M » czwartek, 17 października 2019, 11:39

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.
Avatar użytkownika
Peter_M
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): poniedziałek, 3 grudnia 2018, 23:36
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: RAD Studio 10.3.2
SKYPE: pikus_666
Gadu Gadu: 68554272
    LinuxChrome

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

Nowy postprzez polymorphism » czwartek, 17 października 2019, 13:09

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Peter_M
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

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

Nowy postprzez Peter_M » czwartek, 17 października 2019, 14:08

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.
Ostatnio edytowano czwartek, 17 października 2019, 14:09 przez Peter_M, łącznie edytowano 1 raz
Avatar użytkownika
Peter_M
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): poniedziałek, 3 grudnia 2018, 23:36
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: RAD Studio 10.3.2
SKYPE: pikus_666
Gadu Gadu: 68554272
    WindowsChrome

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron