Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] jak synchronizowac dwa listboxy?? Zapisywanie do pliku

mysiak 30 Mar 2011 12:38 1803 10
  • #1 30 Mar 2011 12:38
    mysiak
    Poziom 16  

    Witam. Jako, że zacząłem nie dawno swoją przygodę z programowaniem - ostrzegam, że jestem początkujący - zapoznaję się dopiero z programowaniem.

    W programie, który piszę mam 3 listboxy i potrzebuję aby itemy listbox1 można było zapisać do pliku i potem otworzyć. Listbox1 służy jako playlista więc dodatkowo musiałem ukryć ścieżki do plików aby wyglądało to jak play lista a nie jak playlista z sciezkami do plików. Zapisuję to do pliku za pomocą funkcji savetofile. Po zamknięciu programu i twarciu z powrotem wczytuję zapisany plik za pomocą openfromfile i wszystko wraca na listbox1 ale program nie pamięta już ścieżek więc zwyczajnie to nie działa.

    Można by dla listbox1 stworzyć listbox2, gdzie listbox2 trzymałby ścieżki do plików i dane były by zapisywane z listbox2 i w czytywane do listbox2 i z listbox2 do lisbox1.

    Problemem jest dla mnie:

    Jak przy zapisie sprawdzić czy zawartość listbox1 jest równa listbox2 i jeżeli coś się zmieniło w listbox1 to takie same zmiany program musi wykonać w listbox2 i potem zapisać. Podam przykład:

    Po dodaniu itemów do listbox 1:

    Listbox1 Listbox2
    A.mp3 C:/ A.mp3
    B.mp3 C:/ B.mp3
    C.mp3 C:/ C.mp3

    W trakcie używania programu z listbox1 została usunięta pozycja B.mp3:


    Listbox1 Listbox2
    A.mp3 C:/ A.mp3
    C.mp3 C:/ B.mp3
    _____ C:/ C.mp3

    Przed zapisaniem listbox1.items do pliku program musi zorientować się że coś usunięto w listbox1 i zrobić to samo w listbox2. Przed zapisem listboxy mają wyglądać tak:
    Listbox1 Listbox2
    A.mp3 C:/ A.mp3
    C.mp3 C:/ C.mp3
    Następuje zapisanie Listbox2 do pliku. Po wczytaniu zapisanego pliku uzupełniany jest Listbox2 a z niego metodą string uzupełnia się listbox1 i to akurat mam już zrobione.

    Trochę chaotycznie ale starałem się jak najdokładniej. Serdecznie pozdrawiam i liczę na odpowiedzi.

    0 10
  • Pomocny post
    #2 30 Mar 2011 13:24
    arnoldziq
    Moderator Programowanie

    TListBox nie posiada metody onChange. Więc automatyczne przenoszenie zawartości nie wchodzi w rachubę...
    Najprawdopodobniej, po dokonaniu każdej zmiany "z zewnątrz" będziesz musiał wywołać jakąś niewielką procedurę, która wymieni obie zawartości list.
    Jest na to proste rozwiązanie.
    Ponieważ wszystkie elementy TListBox są zawarte w TStrings, wystarczy dokonywać zmian na jednym, zadeklarowanym osobno TStrings, a potem tylko przepisywać jego zawartość do obu TListBoxów.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Podobnie z usuwaniem elementów...

    0
  • #3 30 Mar 2011 22:50
    mysiak
    Poziom 16  

    Witam. Dziękuję serdecznie za odpowiedź :) Niestety po wpisaniu kodu kompilator nie pokazuje błędów i program rusza ale zaraz wywala błąd acces violation i kompilator pokazuje strzałeczką linijkę

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    Proszę o pomoc.
    P.S. Print Screen w załączniku.

    [Delphi] jak synchronizowac dwa listboxy?? Zapisywanie do pliku

    Proszę umieszczać obrazki za pomocą przycisku Dodaj Obrazek - arnodziq

    0
  • Pomocny post
    #4 31 Mar 2011 11:00
    arnoldziq
    Moderator Programowanie

    To jedynie wskazuje na to że obiekt lista, nie został utworzony.
    Skopiowanie kodu nic nie da. Procedury TForm1.FormCreate oraz TForm1.FormDestroy muszą być połączone z projektem. A ten błąd wskazuje na to, że nie są.
    Tak powinien wyglądać Object Inspector dla przykładowej formy.
    [Delphi] jak synchronizowac dwa listboxy?? Zapisywanie do pliku
    Jeżeli nie ma u Ciebie tych procedur podłączonych jako zdarzenia, to nie są one wywoływane, a co za tym idzie; obiekt lista, nie jest tworzony przy tworzeniu formularza.
    W załącznikach masz skompilowany plik EXE oraz kody źródłowe z plikiem EXE w osobnym załączniku.
    Zobacz co się stanie, gdy zaznaczysz osobne pozycje na obu listach i naciśniesz przycisku "Usuń".

    0
  • #5 31 Mar 2011 13:48
    mysiak
    Poziom 16  

    Ok dziękuję. Co do przykładu to właśnie o coś takiego mi chodziło. Ale:

    W moim programie to nie działa. Dodaję do listbox2 swoje itemy czyli wczytuje pliki mp3 i kiedy wywołam tą procedurę, która jest powyżej to on zastępuje moje mp3 w listbox 1 i pisze to samo w listbox 2. A ja potrzebuję żeby mi przepisywalo listbox2 do listbox1 i synchronizowało ewentualne dodawanie lub usuwanie. Prawdopodobnie z niewiedzy czegoś nie przeedytowałem i jeżeli można to proszę o oświecenie :)

    0
  • #6 31 Mar 2011 13:55
    arnoldziq
    Moderator Programowanie

    Jeżeli Twój kod, nie jest objęty tajemnicą państwową, to zamieść go tutaj.
    Na pewno coś poradzimy.

    0
  • #7 01 Kwi 2011 01:09
    mysiak
    Poziom 16  

    Witam. Oczywiście program ani jego kod nie jest obięty żadną tajemnicą tak więc zamieszczam w załączniku. Program służy dokładnie do utworzenia playlisty w listbox1 i kolejkowaniu do listbox2 z którego po kolei są uruchamiane. Co do problemu założenie jest takie:

    - Trzeba zrobić tak, żeby po użyciu przycisku dodaj pliki Listbox1 i listbox4 wczytywały te same pliki z tym, że listbox4 musi mieć pełne ścieżki do plików i to jest już napisane przeze mnie.
    - W przypadku usunięcia pozycji np. XYZ.mp3 z listbox1 ma się usunąć pozycja z listbox4 odpowiadająca usuniętej pozycji z listbox1. Troche masło maślane ale po odpaleniu programu na pewno szanowni koledzy domyślą się o co chodzi. Z góry przepraszam za bałagan w kodzie - mam zamiar go uporządkować ale póki co na razie program jest pisany na zasadzie eksperymentowania gdyż moje umiejętności programistyczne niestety ograniczają się jedynie to tego poziomu.

    0
  • #8 01 Kwi 2011 11:21
    arnoldziq
    Moderator Programowanie

    No, jeżeli dwie listy mają pokazywać to różne wartości, a mimo to mają być ze sobą powiązane, to sprawa dość mocno się komplikuje. :(
    Wg. mnie trzeba trzeba zastosować jakieś dodatkowe obiekty, do przechowywania tych wartości. I do wzajemnego ich łączenia. Ciągle można zastosować TListBox i właściwości TStrings jako elementów.
    Co do twojego kodu, to tak jak przypuszczałem, nie masz utworzonym procedur OnCreate i OnDestroy.
    [Delphi] jak synchronizowac dwa listboxy?? Zapisywanie do pliku
    Niestety nie jestem w stanie poprawić Twojego kodu, bo masz podłączone kontrolki których nie posiadam, a nie bardzo mogę je teraz podłączyć.

    0
  • #9 01 Kwi 2011 12:52
    mysiak
    Poziom 16  

    Witam. Możliwe, że usunąłem te procedury bo wczoraj kombinowałem jak koń pod góre ;)

    To ja mam dwie propozycje tylko nie wiem jak je rozwiązać:

    1. Proszę o zaproponowanie innego sposobu na zapisywanie i odczytywanie listbox1 do i z pliku.
    2. Proszę o podpowiedź w następującym rozwiązaniu:

    Czy istnieje możliwość napisania takiej procedury? ( poniżej podaję w uproszczeniu bo nie umiem napisać kodu a być może wcale się nie da ):

    Jeżeli w listbox1 zostanie usunięta pozycja np. 3 to usuń 3 pozycję w listbox4.

    Dalej myślę, że bym sobie poradził chodź mogę być w błędzie ;)

    I przy takim rozwiązaniu potrzebna by była procedura na likwidowanie duplikatów w listbox1. Gdyby coś w mojej chaotycznej wypowiedzi było nie jasne to proszę o pytania - chętnie wyjaśnię na przykładzie krok po kroku.

    P.S. Napisz jakich kontrolek CI brakuje to podeślę. Domyślam sie, że napewno Taudiomixer czy cos w tym stylu.

    0
  • #10 01 Kwi 2011 13:03
    arnoldziq
    Moderator Programowanie

    No, usunięcie tej samej pozycji z obu list jest całkiem proste. Ale to jest synchronizacja tylko "w jedną stronę".

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    A zapis (i odczyt) można wykonać jedną komendą...
    Kod: delphi
    Zaloguj się, aby zobaczyć kod
    lub
    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #11 01 Kwi 2011 16:01
    mysiak
    Poziom 16  

    Witam. Zapisywanie i otwieranie wykonuję tym samym sposobem ;) Dziękuję bardzo. Niby proste ale początkujący sam na to nie wpadnie. Zgadza się to jest w jedną stronę bo na usuwaniu będzie pięknie ale co z dodawaniem??

    Moja procedura przenoszenia itemów jest tak skonstruowana że w przypadku jeszcze jednego jej wywołania itemy z listbox4 dodadzą się do listbox1 mimo tego, że już tam są i w wyniku tego wpisy które już były się zdublują a te które zostały świeżo dodane będą pojedyńcze. Wystarczy tylko usunąć duplikaty w listbox1 i po robocie tylko, że nie umiem tego zrobić ;)

    0