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 - Wczytywanie tekstu do Edit i Memo z pliku txt

jimi1985 20 Maj 2008 21:16 10784 8
REKLAMA
  • #1 5162105
    jimi1985
    Poziom 2  
    Posty: 3
    Witam szanowne grono programistów i programistek,
    jestem początkującym programistom i mam pytanie dotyczące programiku który pisze.
    Otóż pisze baze danych opartą na pliku txt.
    Form sklada sie z Listboxa, 2 pól Edit i 1 Memo.

    Record wyglada tak:

    type
      TOprog = record
        Tytul : string[50];
        Autor : string[50];
        Tekst: AnsiString;
      end;
    


    Wszystko zawieram oczywiscie w tablicy.
    Najpierw zapisuje moje dane do pliku txt.


    procedure zapiszProgram;
    
    var
      plik : TextFile;
      i : integer;
    
    begin
      AssignFile(plik, PROGPLIK);
      rewrite(plik);
      for i := 0 to liczbaProg-1 do
        with katalog[i] do
          begin
            writeln(plik, Tytul);
            writeln(plik, Autor);
            writeln(plik, Tekst);
          end;
      CloseFile(plik);
    end;
    


    zapisywanie działa dobrze, otwierając plik txt widze wszystkie dane których wcześniej używałem.
    Odczytywanie też działa do momentu wciśnięcia entera w polu Memo. Wtedy czytanie po linijce sie nie sprawdza.


    procedure odczytajProgram;
    
    var
      plik : TextFile;
      i: integer;
    begin
      {$i-}
      AssignFile(plik, PROGPLIK);
      reset(plik);
      i := 0;
      if IOResult =0 then
      begin
        while not eof(plik) do
        begin
          with katalog[i] do
          begin
            readln(plik, Tytul);
            readln(plik, Autor);
            readln(plik, Tekst);
          end;
          Inc(i);
        end;
       CloseFile(plik);
      end;
      {$i+}
      liczbaProg := i;
    end;



    Zatem moje pytanie brzmi co zrobić aby dane się wczytały tak jakbym tego chciał, czyli aby dane mimo posiadania odstępów w postaci entera - wczytywaly sie do pola memo?

    PS. Mam jeszcze pytanie mniej ważne ale które mnie ciekawi. Otóż czy jest możliwość dodania do Recordu obrazka? Tak aby po wybraniu danego programu z listboxa nie tylko wyświetlały mi się informacje dotyczące programu ale także obrazek (różny w zależności od programu). I czy takowe obrazkowe dane da sie zapisać do pliku txt (moze jako odnośnik?) ?

    Z góry dziękuje za fachową pomoc
  • REKLAMA
  • #2 5162128
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 224
    Ustaw własny separator pól i zapisuje/czytaj nie liniami lecz znakami do napotkania separatora (np. #0).

    Dodano po 1 [minuty]:

    2. Da się. Wykorzystuje się tutaj funkcje Load/SaveStream. Teoretycznie można nawet obrazek zapisać wprost do TXT.
  • REKLAMA
  • #3 5162464
    Konto nie istnieje
    Konto nie istnieje  
  • #4 5162694
    jimi1985
    Poziom 2  
    Posty: 3
    Moze przedstawie mój programik, oarłem go na książce o delphi...

    Jeśli ktoś ma jeszcze jakiś pomysł chętnie wysłucham :-)

    W załączniku zapodaje program skladajacy sie z dwoch unitow interfejs i implementacja...

    Nadal nie mam pomysłu na zapisywanie... -> w czesci unitu-> implementacja... Jestem na to chyba za głupi.
    Załączniki:
    • opro.rar (179.62 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #5 5162843
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    oloam napisał:
    memo posiada taka wlasciwosc: Memo1.Lines.LoadFromFile(FileName:String); ktora dobrze sie sprawdza jezeli chodzi o pliki tekstowe


    Cytat:

    Nadal nie mam pomysłu na zapisywanie... -> w czesci unitu-> implementacja... Jestem na to chyba za głupi.


    memo posiada taka wlasciwosc: Memo1.Lines.SaveToFile(FileName:String); ktora dobrze sie sprawdza jezeli chodzi o pliki tekstowe.
    A te rekordy i zapis w pliku tekstowym to się trochę wykluczają.
  • REKLAMA
  • Pomocny post
    #6 5163024
    Konto nie istnieje
    Konto nie istnieje  
  • #7 5163170
    jimi1985
    Poziom 2  
    Posty: 3
    Oloam dziekuje Ci slicznie, niech Bóg wynagrodzi Ci w dzieciach :-)...
    Tylko teraz jeden problem, bo zmieniles rekord Tekst na ograniczony string[255], a tutaj wolałbym mieć AnsiString który o wiele więcej pomieści, czy da się to tak zrobić?
  • REKLAMA
  • #8 5163337
    Konto nie istnieje
    Konto nie istnieje  
  • #9 5163486
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 224
    dlatego ja pisałem o separatorze pól i zapisie strumieniowym, a nie blokowym :) Wydaje mi się to znacznie prostsze. Jeszcze inną alternatywą jest zapis całego stringa, a więc włącznie z jego długością -albo przez wskazanie w pamięci, albo przez wyciągnięcie tej wartości funkcją Length(). Następnie przy odczycie czyta się tylko dwa pierwsze pola blokiem, a przed odczytem pola o zmiennej długości odczytuje się wcześniej jego długość, a następnie blokiem x kolejnych bajtów do ustawionego stringa (SetLength).

Podsumowanie tematu

✨ Dyskusja dotyczy problemu zapisu i odczytu danych tekstowych w aplikacji Delphi, która wykorzystuje rekord TOprog z polami Tytul, Autor (string[50]) oraz Tekst (AnsiString) przechowywanymi w tablicy. Autor próbuje zapisywać dane do pliku tekstowego, jednak napotyka trudności z poprawnym odczytem i zapisem pola Tekst o zmiennej długości. Wskazano, że standardowy zapis rekordów do pliku tekstowego jest problematyczny ze względu na różne długości pola AnsiString. Zaproponowano alternatywne metody: użycie separatorów pól (np. znak #0) do zapisu i odczytu danych jako strumienia, wykorzystanie funkcji Memo1.Lines.LoadFromFile i SaveToFile do obsługi tekstu w komponencie Memo, a także zapis całych rekordów do pliku typowanego (file of TOprog) zamiast pliku tekstowego. Poruszono kwestię ograniczenia długości pola Tekst do string[255] w rekordzie i zaproponowano rozwiązanie dzielenia długiego tekstu na tablicę krótszych stringów. Inna sugestia to zapis długości pola AnsiString przed samym tekstem, co umożliwia dynamiczne odczytanie zmiennej długości danych. Podsumowując, zalecane jest stosowanie strumieniowego zapisu z separatorami lub plików typowanych dla rekordów z polami o zmiennej długości, a do prostych operacji na tekście komponent Memo oferuje wygodne metody LoadFromFile i SaveToFile.
Wygenerowane przez model językowy.
REKLAMA