logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Delphi] Jak zapisać całą listę TListView do pliku?

alberthus 03 Cze 2011 22:20 3983 21
REKLAMA
  • #1 9574268
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Witam
    Mam problem z zapisem całej listy TListView do pliku.
    Jak to poprawić??

    P.S funkcja SaveToFile też nie działa, kompilator podkreśla to.
    Załączniki:
    • procedura zapisu.JPG (19.58 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 9574278
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    To nie "nie działa" tylko nie istnieje. Tak samo jak RowCount. ListView ma Itemsy, a one mają swoje własności. Co chcesz zapisać?
  • #3 9574377
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Chcę zapisać całą listę TListView do pliku txt na której znajduje się spis utworów muzycznych.
    Dałem opcję Create żeby stworzyć plik. Więc jak to poprawić?
  • #4 9574496
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Ale chcesz zapisać same Captiony, czy razem z SubItemsami a może jeszcze razem IconIndex, z Data... TListItem to złożony obiekt.
  • #5 9575750
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Captiony, czy razem z SubItemsami.
  • REKLAMA
  • #6 9575789
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    alberthus napisał:
    Captiony, czy razem z SubItemsami.
    To jest pytanie czy stwierdzenie?
    Jeśli chodzi o same Captiony to po prostu utwórz obiekt typu TStringList, do niego dodaj czytane z pętli Captions z kolejnych Itemsów listy TListView, a na koniec użyj metody SaveToFile obiektu TStringList.
    Jeśli chcesz także zapisać SubItems'y to sprawa się komplikuje - można zrobić albo specjalny format pliku, gdzie będziesz zapisywał najpierw Caption, potem liczbę SubItemsów a potem je same (pętla wew.), albo dopisać do listy jako DelimitedText (wynik jako kolejny rekord TStringList), albo zapisywać w kilku plikach, które będą powiązane ze sobą poprzez nazwy (jako, że subitems jest typu TStringList, to można wprost z niego dokonywać zapisu).
  • #7 9575839
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    TListView mam podzielone na kolumny i musi zapisywać do pliku zawartość wszystkich kolumn.
    Więc deklaruję:
    VAR zapis: TStringList; i: inteher;
    begin
    zapis:=TStringList.Create;

    teraz pętla ale nie wiem jak

    for i:=0 to...........
  • #8 9576036
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    TListView.Items:
    - Count
    - Item[i] :
    - - Caption
    - - SubItems :
    - - - Count
    - - - Strings[i]

    To wszystko, czego potrzebujesz. Masz zrobić główną pętlę po Items liczone od 0 do Items.Count-1 i zapisać do StringListy własnosć Caption [zapis.Add(ListView.Items.Item[i].Caption)].
    Sposobów na zapisanie tego, co jest we własności SubItems, odpowiedzialnej za kolejne kolumny, jest już kilka i do Ciebie należy decyzja, jak to chcesz zapisywać. Właściwie - po co ten zapis? To rodzaj eksportu do pliku tekstowego, który będzie ktoś czytał, czy może format, który będzie później odczytywany przez program i na jego podstawie ponownie wypełniania lista?
  • #9 9576079
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    To może wyjaśnię. Robię projekt (zaliczenie) książka adresowa. W pola Edit.text wpisuję imię nazwisko itp. po czy klikam dodaj i pojawia mi się to w TListView.
    I teraz całą listę chcę przetrzymywać w pliku i później odczytywać z niego.
  • REKLAMA
  • #10 9576319
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    W takim razie proponuję taki wybieg - zrezygnuj z pierwszej kolumny (ustaw jej szerokość na 0... Nada się też np do wyświetlania grafiki). W ten sposób łatwo i szybko będziesz mógł pobierać zawartość wszystkich kolumn. Jako, że SubItemst jest typu TStrings to możesz pobrać go w postaci DelimitedText. Taką postać dopisz jako element TStringListy, którą wykorzystasz do zapisu. Odczytując zrobisz dokłądnie odwrotnie, czyli poszczególne elementy TStringList będziesz dopisywał jako DelimitedText do własności SubItemst elementu TListItem.
  • #11 9581785
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Zrobiłem po swojemu i zapisuje wprawdzie nie wiem czy tak być powinno ale działa.
    A jak napisać otwieranie tego pliku?
    Załączniki:
    • zapisywanie jpg.JPG (25.43 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #12 9582820
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Tak, jeśli chodzi o zapisanie samych Caption to jest to poprawne.

    Jednak uwaga - zamiast Destroy używaj raczej Free.

    Odczytywanie robisz dokładnie odwrotnie - czyli na początku LoadFromFile, później pętla po elementach TStringList i w pętli dodawanie do ListView (ListView.Items.Add(zapis[i]).

    Na marginesie: Zamiast wklejać obrazek po prostu skopiuj kod i obejmij go w znaczniki [syntax= Delphi ]tutaj_kod[ /syntax ] (bez spacji)
  • #13 9583147
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Działa:)
    Jednak jest jeszcze jedna kwestia. Jak napisać kod aby przejść z jednego okna na drugie.
    W pierwszym wstawiłęm TButtona i teraz klikając na niego chcę przejść do następnego okna?
  • #14 9583187
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Wyświetlić je? Jeśli jest ujęte w AutoCreateForm opcji projektu, to wystarczy wywołać metodę Show dla tego okna. Jeśli ma być wyświetlone w trybie modalnym - ShowModal. Jeśli chodzi Ci tylko o przełączenie, to SetFocus. Jeśli przywrócenie - BringToFront. Jeśli okno nie jest tworzone automatycznie, to wcześniej trzeba użyć Create względem klasy okna.
  • #15 9583436
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Problem polega na tym że nie wiem co to znaczy...
    Gdzie to się sprawdza i gdzie ustawia.
    Kliknąłęm new Form-Delphi nie wiem jak jest domyślnie okno ustawione.
    Można jaśniej??
  • #16 9583615
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Ctrl+F11:
    [Delphi] Jak zapisać całą listę TListView do pliku?

    Auto-create forms to te, które są tworzone jeszcze przed uruchomieniem programu. Resztę trzeba tworzyć samemu.

    Każda forma domyślnie ma swoją implementację w osobnym pliku. Aby odwołać się do niej z innego należy umieścić ja w sekcji uses (nazwa pliku) i można odwoływać się do klasy. Jeśli skorzystamy z domyślnej zmiennej formy (odpowiadającej nazwie formy) to Delphi przy kompilacji sam zapyta, czy chcemy dodać ją do usesów.
  • #17 9586893
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Po naciśnięciu ctrl+F11 pojawia mi się okno Open Project i nic więcej.
    Zupełnie inne niż na screenie.
    No więc jak zadeklarować i przejść do następnego okna?
  • REKLAMA
  • #19 9587007
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Podsumowując nie mam zielonego pojęcia jak to zrobić, ustawić itp itd tak to jest jak świeżak pyta się doświadczonych programistów.....
  • #20 9587802
    blue_17
    Poziom 32  
    Posty: 2414
    Pomógł: 172
    Ocena: 472
    Doświadczonym programistą nie jestem ale chyba mogę co nieco pomóc

    Masz dwie formy Form1 i Form2 i na nich po TButtonie,

    Na początek dodajesz drugą formę

    file->new->form

    Masz już teraz 2 formy

    Dodajesz na każdą formę przycisk i wpisujesz

    w TButtonie1 na Form1


    Kod: Delphi
    Zaloguj się, aby zobaczyć kod


    a w drugiej formie w w 2 Buttonie wpisujesz

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod


    A jeszcze lepiej gdy w 2 formie wpiszesz zamiast

    Form2.Hide; -> Form2.Close;

    Dlaczego tak to już zapraszam do lektury a może wystarczy troszkę doświadczenia ;)

    Nie wiem w jakim Delphi piszesz ale podczas kompilacji i mając 2 formy powinien kompilator zapytać się czy dodać je do projektu jeśli tak się niestanie wystarczy dodać:

    w formie1 w sekcji implementation

    uses Unit2;

    A w 2 formie w tej samej sekcji co poprzednio tylko

    uses Unit1;

    A jak to działa to w załączniku tylko exe-lka :)

    Pozdrawiam
    Załączniki:
    • project1.rar (1.92 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #21 9587856
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Zrobiłem. Działa jak trzeba. Dzięki.
  • #22 9595321
    alberthus
    Poziom 16  
    Posty: 305
    Pomógł: 1
    Ocena: 16
    Czy mógłby ktoś przetłumaczyć na ,,polski' fragment kodu dotyczący zapisu do pliku??
    Inaczej mówiąc jak to działa.

    begin
    if SaveDialog1.Execute then
    SaveDialog1.FileName;
    plik := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareCompat);
    try
    plik.WriteComponent(ListView1);
    finally
    plik.Free;
    end;

Podsumowanie tematu

✨ W dyskusji poruszono problem zapisu zawartości komponentu TListView do pliku tekstowego w Delphi. Użytkownik chciał zapisać listę utworów muzycznych, jednak napotkał trudności z metodą SaveToFile. Odpowiedzi sugerowały użycie obiektu TStringList do przechowywania Captionów oraz SubItemsów z TListView. Proponowano różne metody zapisu, w tym zapis jako DelimitedText. Użytkownik uzyskał również pomoc w kwestii przechodzenia między formularzami w Delphi, co zakończyło się sukcesem. Na koniec, zapytano o tłumaczenie fragmentu kodu dotyczącego zapisu do pliku.
REKLAMA