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] zapis listy TListView do pliku

alberthus 03 Cze 2011 22:20 3248 21
  • #1 03 Cze 2011 22:20
    alberthus
    Poziom 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.

    0 21
  • #3 03 Cze 2011 22:46
    alberthus
    Poziom 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ć?

    0
  • #5 04 Cze 2011 14:17
    alberthus
    Poziom 16  

    Captiony, czy razem z SubItemsami.

    0
  • #6 04 Cze 2011 14:30
    Dżyszla
    Poziom 42  

    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).

    0
  • #7 04 Cze 2011 14:47
    alberthus
    Poziom 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...........

    0
  • #8 04 Cze 2011 15:47
    Dżyszla
    Poziom 42  

    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?

    0
  • #9 04 Cze 2011 16:03
    alberthus
    Poziom 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.

    0
  • #10 04 Cze 2011 17:27
    Dżyszla
    Poziom 42  

    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.

    0
  • #12 06 Cze 2011 17:33
    Dżyszla
    Poziom 42  

    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)

    0
  • #13 06 Cze 2011 18:56
    alberthus
    Poziom 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?

    0
  • #14 06 Cze 2011 19:04
    Dżyszla
    Poziom 42  

    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.

    0
  • #15 06 Cze 2011 20:03
    alberthus
    Poziom 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??

    0
  • #16 06 Cze 2011 20:40
    Dżyszla
    Poziom 42  

    Ctrl+F11:
    [Delphi] zapis listy 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.

    0
  • #17 07 Cze 2011 19:12
    alberthus
    Poziom 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?

    0
  • #19 07 Cze 2011 19:41
    alberthus
    Poziom 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.....

    0
  • #20 07 Cze 2011 22:20
    blue_17
    Poziom 32  

    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

    0
    Załączniki:
  • #21 07 Cze 2011 22:28
    alberthus
    Poziom 16  

    Zrobiłem. Działa jak trzeba. Dzięki.

    0
  • #22 09 Cze 2011 23:33
    alberthus
    Poziom 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;

    0