wczytywanie do listview z pliku

0

Witam, dopiero uczę się programować w delphi więc proszę o zrozumienie. Chciałbym wczytać dane z pliku tekstowego do listview, napisałem coś takiego, ale to nie działa. Prosiłbym o poprawienie kodu. Z góry dziękuję.

procedure TForm6.FormCreate(Sender: TObject);
var
Item: TListItem;
t: integer;
imie,nazwisko,kodimiasto,ulica,nrdomu,nrmieszkania,tele,email,ilbil,kod,wplata: array[0..100000] of string;
x,z: integer;
y: string;
plik: textfile;begin
        listview1.Clear;
        t:=0;
        Assignfile(plik,'c:/zmienna.txt');
        Reset(plik);
        readln(plik, y);
        Closefile(plik);
        x:=strtoint(y);         z:=x;
        x:=0;
        repeat
        x:=x+1;
        Assignfile(plik,'c:/osoby.txt');
        Reset(plik);
        readln(plik, imie[x]);
        readln(plik, nazwisko[x]);
        readln(plik, kodimiasto[x]);
        readln(plik, ulica[x]);
        readln(plik, nrdomu[x]);
        readln(plik, nrmieszkania[x]);
        readln(plik, tele[x]);
        readln(plik, email[x]);
        readln(plik, ilbil[x]);
        readln(plik, kod[x]);
        readln(plik, wplata[x]);
        Closefile(plik);

t:=t+1;
Item := ListView1.Items.Add;
Item.Caption := imie[x];
Item.SubItems.Add(nazwisko[x]);
Item.SubItems.Add(kodimiasto[x]);
Item.SubItems.Add(ulica[x]);
Item.SubItems.Add(nrdomu[x]);
Item.SubItems.Add(nrmieszkania[x]);
Item.SubItems.Add(tele[x]);
Item.SubItems.Add(email[x]);
Item.SubItems.Add(ilbil[x]);
Item.SubItems.Add(kod[x]);
Item.SubItems.Add(wplata[x]);
until z=t;
end;
0

Na początek wypadało by wiedzieć jaką postać mają dane w pliku.

0

ale to nie działa

No to może jak się popatrzymy na kod to będzie działać. Albo czekaj mam pomysł! Daj nam błędy które wyskoczyły to może będzie coś innego zrobić.

0

takie pliki sa.

0

Te pliki nie zawierają żadnych interesujących danych; Potrzeba plików, w których zapisane są wszystkie kontakty;

Po pierwsze - nie korzystaj z plików tekstowych do przechowywania jakichkolwiek kontaktów bo będziesz miał w kółko problemy;


Po drugie - (jeśli spełnione pierwsze) - jeśli chcesz wszystko wczytywać do komponentu to nie twórz macierzy przechowującej dokładnej kopii zawartości listy tylko jedną zmienną łańcuchową, którą będziesz uzupełniał na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) i kopiował jej zawartość do komponentu; Wtedy nie zawalisz całej pamięci podwójnie, a wszystkie dane kontaktów będziesz i tak miał w kontrolce:

var
  fInput: TextFile;
  liContact: TListItem;
  sLine: String;
  I: Byte;
begin
  try
    AssignFile(fInput, 'C:\Osoby.txt');
    Reset(fInput);

    repeat
      liContact := ListView1.Items.Add();

      { IMIĘ }
      ReadLn(fInput, sLine);
      liContact.Caption := sLine;

      { POZOSTAŁE 10 PÓL }
      for I := 0 to 9 do
        begin
          ReadLn(fInput, sLine);
          liContact.SubItems.Add(sLine);
        end;
    until EoF(fInput);
  finally
    if Assigned(fInput) then
      CloseFile(fInput);
  end;
end;

Wersja okrojona, tutaj przedstawiłem tylko sam mechanizm wczytywania; Jest on prawidłowy, jeśli ilość linii w pliku zawsze dzielić się będzie przez 11 (bo tyle macierzy zadeklarowałeś); Jeśli nie to na 100% dostaniesz albo AV, albo odczytasz śmieci; Na dodatek założe się, że jest znacznie szybszy i mniej pamięciożerny od Twojego; Resztę zaprogramuj sam;


Po trzecie (które wyklucza pierwsze) - do przechowywania kontaktów skorzystaj z plików typowanych (opis znajdziesz tu na forum), będziesz mógł bardzo łatwo je odczytywać i zapisywać bez zbędnego przeładowania pamięci;


Po czwarte (jeśli spełnione trzecie) - jeśli już koniecznie chcesz mieć kopię kontaktów wyłącznie w pamięci to zadeklaruj sobie rekord, w którym istnieć będą wszystkie pola, które teraz są osobnymi macierzami:

type
  TKontakt = packed record
    { DŁUGOŚCI ŁAŃCUCHÓW USTAL SAM }
    { TUTAJ PODAŁEM PRZYPADKOWE }
    Imie: String[15];
    Nazwisko,
    Ulica,
    KodMiasto: String[30];
    NrDomu: String[5];
    NrMieszkania: String[5];
    Telefon: String[12];
    Email,
    Ilbil: String[30];
    Kod: String[15];
    Wplata: String[25];
  end;

na bazie tego utwórz sobie macierz dynamiczną i po kolei aż do końca pliku zwiększaj rozmiar macierzy o jeden i do ostatniego jej elementu wczytuj cały rekord z pliku;


Wybór sposoby należy do Ciebie; Miej na uwadze to, że jak plik z kontaktami będzie już trochę ważył, wczytywanie go nie dość, że będzie zajmowało większą ilość czasu to zawalisz niepotrzebnie pamięć jego kopią; Kolekcję kontaktów musisz mieć tylko jedną, a przechowywać ją raczej należałoby w odpowiedniej kontrolce; Zastanów się nad tym;

Dodatkowo odsyłam do artykułu Pliki typowane, gdzie masz dokładnie wytłumaczone jak tworzyć takie pliki, odczytywać i zapisywać w nich informacje, a także masz przykładową aplikację wykorzystującą je (tu: książka adresowa); Warto by było się z nią zapoznać;

0

Nie wiem dlaczego mój post zniknął, bo pisałem jako pierwszy, ale może w pośpiechu coś pomyliłem. Proponuje skorzystać z pliku typowanego, przykladowy kod wraz z exekiem i plikiem dołaczony do tego posta. Napisałem to na bazie dostępnego tutaj kiedyś kodu źródlowego programu programu "Kartoteka" napisanego przez Adama Boducha.

1 użytkowników online, w tym zalogowanych: 0, gości: 1