Wczytywanie tekstu z pliku tekstowego do memo

0

post usunięty

0

Napisałeś tak że nie wiadomo dokładnie o co chodzi, ale z tematu wnioskuje że po prostu w ListBoxie
masz mieć listę nazw plików i kiedy klikniesz na jakąś pozycję to o ile plik istnieje w katloagu z plikiem
rxe Twojej aplikacji to zostanie załądowany do Memo. Jeżeli nie to Memo będzie puste. Jeżeli o to Tobie
chodzi to wystarczy umieścić na formate ListBox oraz Memo i w zdarzeniu OnClick dla Listboxa dać kod:

var
  NazwaPliku : string;
begin
  if ListBox1.ItemIndex > -1 then
  begin
    NazwaPliku := ListBox1.Items[ListBox1.ItemIndex];
    if FileExists(NazwaPliku) = True then
    begin
      Memo1.Lines.LoadFromFile(NazwaPliku);
    end
    else
    begin
      Memo1.Clear;
    end;
  end;
end;

I koniecznie poczytaj jakieś kursy, bo pytasz o banały. Jest google, jest help Delphi. Można sobie jakoś
samemu poradzić. Wiesz, ci którzy kiedyś zaczynali jak jeszcze nie było forum też sobie jakoś radzili ;/

0

Przecież kod jaki Tobie podałem działa bez problemów. Tak pokrętnie tłumaczyłeś, ze zrozumiałem że chcesz
po kliknięciu w element ListBoxa wczytac do Memo plik o takiej nazwie jaka widnieje w wybranym elemencie.
Przecież wyraźnie widać że zmiennej NazwaPliku przypisywany jest tekst aktualnie wybranego elementu, jak
byś poczytał kursy i dokumentację to byś wiedział. Bo tak się nic nie nauczysz. Będziesz pytał tutaj o kolejne
jakieś sprawy, wklejał kod na żywca i nic dalej nie rozumiał. Jak chcesz zrobić coś takiego że po wybraniu z
listy elementu pierwszego w Memo pojawia się "jeden", drugiego - "dwa" i tak dalej, to o ile elementów nie
jest zbyt wiele można to zrobić poprzez tablicę stałych. Jak więcej to można elementy wczytac z pliku do
niewizualnego komponentu TStringList. Poszukaj sobie w google jak się używa tego komponentu. A póki co
masz taki przykładowy kod. A przy okazji dodam, że wiadomo iż w kursach nie znajdzie gotowego kodu dla
Twoich pomysłow, znajdziesz tam informację które Ciebie powinny naprowadzić, jak coś zrobić samodzielnie.

const
  Tablica : array[0..2] of string = ('raz', 'dwa', 'trzy');
begin
  if (ListBox1.ItemIndex > -1) and (ListBox1.ItemIndex <= High(Tablica)) then
  begin
    Memo1.Text := Tablica[ListBox1.ItemIndex];
  end
  else
  begin
    MEmo1.Text := '';
  end;
end;
0
var
  NAzwaPliku : string;
begin
  if ListBox1.ItemIndex > -1 then
  begin
    NAzwaPliku := ExtractFilePath(application.ExeName) + 'txt\' + ListBox1.Items[ListBox1.ItemIndex] + '.txt';
    if FileExists(NazwaPliku) = True then
    begin
      Memo1.Lines.LoadFromFile(NazwaPliku);
    end
    else
    begin
      Memo1.Clear;
    end;
  end;
end;
0

Kmish: proszę bardzo, ale już mnie puchi ubiegl. Tylko sobie popraw NAzwa na "Nazwa" i application też
z dużej litery. Kod będzie ładniej wyglądał, bo ja pisałem na szybko tak jak pewnie puchi i stąd literówki.

0

Przecież teraz pliki masz wczytywane z innego katalogu niż exe. Konkretnie z podkatalogu txt. A jeżeli chcesz
odczytywać je z jakiegos katalogu na dysku to raczej nie możesz podać ścieżki "na sztywno", bo u kogoś kto
na przykład ma system na innej partycji albo nie ma takiego katalogu kod nie będzie działał, ale można taki
katalog pobrać na przykład z pola edycyjnego a później zapisać do pliku typu ini. Okno do wyboru katalogu:
Dialog do wyboru katalogu - to mój gotowiec, ale możesz sobie
zrobić okno po swojemu. Jak korzystać z ini: plików Pliki INI a co
do przechowywania danych to można pliki zaszyfrować jakąś metodą, można też spakowac je używając może
modułu zlib. Jest to prosta metoda, ale użytkownik niedoświadczony sobie tego nie rozpakuje a na pewno już
nie podajrzy w łatwy sposób. Można też użyć plików typu XML dla nieco bardziej założonych danych. O tym w
googlach sobie poczytaj. Co do baz danych to jestem noga i się nie znam, ale też się da to zrobić. Są rózne w
budowie bazy i komponenty do ich obsługi. Ale najpierw radził bym Tobie opanować podstawy, bo póki co to
taki banalny program piszemy za Ciebie. Jak opanujesz podstawy języka to bierz się za obsługę baz danych.
Ja tego w swoich programach nie potrzebuje za bardzo, także się tym nie interesowałem, ale myślę, ze przy
odrobinie samodzielności i chęci wszystko da się wykombinować samodzielnie albo znaleźć info w Internecie.
Jeżeli chodzi o proste bazy oparte na plikach tekstowych lub typowanych to zobacz na artykuł pod adresem:
Bazy danych oparte na własnych formatach bo nie wiem co chcesz w tych plikach
przechowywać. Jeżeli będą to dane bardziej złożone, na przykład dłuższy tekst, to może skorzystać z jakiś
komponentów. To byś musiał konkretnie popytać co chcesz przechowywać w swojej bazie, bo moze Ci do
szcześćia wystarczyly by pliki typowane. A nazwy komponentów do baz danych które można użyć (też nie
wiem jaką wersją dokładnie dysponujesz) ktoś tutaj Tobie podpowie jak podasz konkrety co do tej bazy.

0
Kmish napisał(a)

Nie, jest ok. Katalog jest ok tylko myślałem że to txt użyte w kodzie jest związane z roższerzeniami a nie z katalogiem :)

No to ok, ale koniecznie poczytaj podstawy jakieś, bo w tak banalnym fragmencie nie zorientowałeś
się że ExtractFilePat(Application.ExeName) wyodrębni ze ściezki i nazwy pliku aplikacji (czyli może to
być ParamStr(0) lub w aplikacji okienkowej też Application.ExeName) samą ścieżkę zakończoną "",
a do tego dodanie zostanie nazwa podkatalogu jaki chciałeś. Programowanie to nie zgadywanie, tu
należy rozumieć kod, dlatego najpierw sobie pogoogluj, poczytaj podstawy i samodzielnie kombinuj.

tu chodzi ci o to że można zaszyfrować pliki txt ?

Tak. Sposobów jest wiele. O tym również sobie możesz poczytac szukając w googlach informacji.

można by było spakować wszystkie pliki tekstowe w 1 plik i żeby to było zaszyfrowane takżeby nie
można było tego odczytać (czyt. żeby odczytanie nie było tak łatwe jak otwarcie pliku tekstowego w
podkatalogu z plikami txt ) ??

Są komponenty do obsługi zipa na przykład. Tylko że spakowanie modułem zlib w taki sposób jak ja
myślę to nie jest to samo jakbyś pakowal wiele plików w jeden. To spakowanie pojedynczego pliku,
ale w sposób taki że nie rozpakujesz tego WinZipem czy WinRarem, bo to nie będzie takie typowe
archiwum jakie tworzą te programy. Co do baz danych, to o ile się orientuje - można w nich także
umieszczać pliki. Jednak używanie baz danych o ile się orientuje jest możliwe w wersjach Delphi, do
zastosowania komercyjnego lub w Turbo Delphi. Dlatego mając Delphi 7 Personal nie możesz używać
komponentów do baz danych (jak się mylę - to niech ktoś sprostuje). Jest jeszcze kwestia legalnosci,
o ile się tym przejmujesz. Legalnie za darmo do użytku komercyjnego możesz produkowąc aplikację
w Turbo Delphi. W wersjach Personal do użytku niekomercyjnego, bo inaczej musisz zakupić Delphi.

0

Ale jak np. zrobię aplikację w delphi 7 Personal, którą udostępnię w internecie do pobrania za darmo to tak jest legalnie, nie ?

Tak jak pisałem, wtedy tak.

I jeszcze powiedz mi jedną rzecz a potem zajmuję się czytaniem poradników i kursów (tak à propos znasz może jakiś dobry kurs tak naprawdę od podstaw ... ? dla całkowicie zielonych i żeby był napisany "prostym i zrozumiałym językiem" ? )

To pogoogluj sobie i zobacz co Tobie pasuje. Ten na 4programmers jest raczej ok. A co do mojej nauki to
żaden kurs nie był potrzabny. Ja zainteresowałem się Delphi po lekrurze jedno częściowego (jak się później
okazało) artykułu w nieisnitejącym już piśmie "PC Shareware" (ten sam wydawca co "CD-Action"). Wtedy
dorwałem jeszcze demo Delphi 1 później Delphi 3 Professional i kombinowałem. Szukałem na sieci, wiele
się nauczyłem analizując kody źródlowe znalezione w sieci oraz czytając dokumentację w postaci helpa.
Tobie też radzę kombinować samodzielnie, zaglądac do sieci i helpa. Delphi jst bardzo proste - według
mnie - na start. Mi się spodobało to że tak łatwo się projektuje interface i język jest w miare prosty, a
i sporo nauczyłem się niedawno w przeciągu dwóch lat, bo na jakiś czas zarzuciłem programowanie, ale
udzielając ludziom odpowiedzi na tym forum i rozwiązując ich problemy, często jak się okazało banalne.
Wiele jednak jeszcze nie umiem i pewnie już z lenistwa się nigdy nie naucze. Kupiłem raz ksiązkę jeszcze
do Delphi chyba 3 w latach dziewięćdziesiątych. Później pożyczyłem od informatyka z pracy ojca księgę
wydaną przez Helion, ale nie czytałem jej całej dokładnie. Help plus google plus kurs stąd to podstawy.

Czy można zablokować możliwość edycji zawartości okienka memo... tak żeby użytkownik
programu nie mógł zaznaczać wyświetlanego tekstu, kopiować go ani dopisywać jakiegoś innego.

Aha i jeśli się da zablokować to memo to jak zrobić żeby pojawiły się w nim takie paski do przesuwania
tekstu w dół jeśli nie zmieści się w okienku.

Nawet nie zadałeś sobie trudu spojrzenia na listę własności komponentu Memo. Ma on takie coś jak własność
ReadOnly. Do tego ScrollBars. Jak ustawisz ją na inną niż ssNone to pasek/paski pokażą się tylko wtedy gdy
tekst przekroczy wymiary Memo widocznego na ekranie. A blokadę kopiowania ja bym zrobił tak, jak poniżej.

// ...
  public
    NieWolnoKopiowac : boolean;
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  PusteMenu : TPopUpMenu;
begin
  NieWolnoKopiowac := False;
  PusteMenu := TPopUpMenu.Create(Self);
  Memo1.PopupMenu := PusteMenu;
  Memo1.ReadOnly := True;
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ((Shift = [ssCtrl]) and (Key = Ord('C')))
  or ((Shift = [ssCtrl]) and (Key = VK_INSERT)) then
  begin
    NieWolnoKopiowac := True;
  end;
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if NieWolnoKopiowac = True then
  begin
    Key := #0;
  end;
end;

Masz tutaj bonus jeszcze pomocny przy nauce, bo zaraz znowu będziesz zadawal kolejne
pytania i się nic nie nauczysz. Ten program zwie się Rekordy, bo w oryginalne dane typu
Nazwa użytkownika i jego numer GG - były zapisywane do pliku typowanego złożonego z
rekordu. Teraz plik kompresuje się i dekompresuje przy użyciu funkcji z modułu ZLib, no
i masz przykład jak zapisać do pliku jakieś dane i je wczytać. Użyty Ctx_Rec_Length jest
po to aby zapisać oraz odczytać dokładną ilość znaków jaką zajmuje nazwa użytkownika.
Bo normalnie musiał bys w pliku typowanym ograniczyć wielkość pola rekordu - czyli np.
dać Nick : string[30]; i wtedy nick mógłby mieć maksymalnie 30 znaków, zaś tak jest w
pliku zapisana długość, ktora później jest odczytywana i dzięki temu nie musimy zbytnio
wydlużać wpisów. Nie musimy też używać tablic dynamicznych. Nazewnictwo zmiennych
i komponentów w kodzie jest nieco z angielska, ale kod na tyle prosty że się powinieneś
w nim połapać. W sumie mając taki przykład wiesz już jak można zapisać w pliku takim
jakiś dłuższy tekst, na przykład z Memo i później odczytać. Modyfikuj sobie kod do woli.
http://www.speedyshare.com/files/19978925/rekordy.rar
Co do kodu to jeszcze informacja. Jak dasz sobie procedure do pakowania strumienia i
funkcję rozpakowującą jako komentarz to możesz zobaczyć pod jakimś edytorem hex
lub jakąś normalną przeglądarką typo Lister w Total Commanderze, jak taki plik bez
kmpresji wygląda. Dodam, że zmienna Group : set of Byte; jest dodatkowo, bo taki
kod używam w pisanym sobie aktualnie z użyciem komponentu TEasyGG - własnego
komunikatora GG. Przechowuje ona zbiór numerów grup, lecz możesz zrezygnować z
tej zmiennej i ją usunąc lub dać jako komentarz, wtedy plik będzie jeszcze mniejszy.

0

Ech, jak nie wiesz takich rzeczy i nie umiesz skorzystać z gotowego kodu to dariuj sobie może na jakiś
czas w ogóle programowanie albo czytaj o podstawach. Wiadomo pezecież w OnCreate formatki oraz 2
pozostale w OnKeyPress oraz OnKeyDown dla Memo. Programowanie to nie zgadywanie, póki sobie nie
zadarz trudu i nie poczytasz podstaw, nie przeanalizujesz samodzielnie działania IDE w ktorym tworzysz
aplikacje - to nie ruszysz z miejsca. Takie rzeczy jak dodawanie zdarzen przez Object Inspektora - to w
moim przekonaniu i pewnie nie tylko w moim tak absolutna podstawa, jak umiejętność włącznie kompa.

0
Kmish napisał(a)

służy on do wyszukiwania pozycji w listboxie ale nie wiem gdzie go dać ...
szukany tekst chciałbym wpisywać w komponent Edit1 i żeby po naciśnięciu enteru lub przycisku "OK" (button1) obok została znaleziona pozycja wpisana w okienko Edit1.

No sam sobie odpowiedziałeś przecież. Jak ma to wykonywać jakiś button to w OnClick dla tego Buttona.
A jak po wciśnięciu Entera w polu edycyjnym to w zdarzeniu OnKeyPress. Taki kod jak poniżej załatwi to:

  if (Key = #13) and (Edit1.Text <> '') then
  begin
    Button1.Click;
  end;

Ale widzę że Ty nadal uparcie bawisz się w "sto pytań do" zamiast czytać kursy i samodzielnie kombinować.
Przy okazji zobacz sobie źródła tego programu. Bawiłem się teraz chwilę i zrobiłem coś takiego. W jednym
pliku przechowywany jest nazwa tekstowa, opis tekstowy oraz rodzaj obrazka i sam obrazek. Przeanalizuj
to sobie, a może się w końcu czegoś nauczysz. Pamiętaj: samodzielność i myslenie - przede wszystkim :P
http://www.speedyshare.com/files/19989580/prosta_baza.rar

0

A gdzie masz zapisany np ten plik z żabą ? (ikonke) Program naprawdę ciekawy

Cieszę się, że program się podoba. Plik ikonki żabki byl wzięty oczywiście z moich zasobów na dysku, a
wszystkie dane są zapisywane oraz odczytywane do pliku database.dat w katalogu z plikiem exe programu.
Przeanalizuj sobie źródło to będziesz wiedział. Mam nadzieję, że niczego nie przeoczyłem i program działać
będzie cały czas jak należy. W sumie na tej zasadzie można stowrzyć własny format archiwum. Zapisać do
jednego pliku dane o nazwach plików (z ich długością), rozmiarem pliku i sumę kontrolną, a następnie już
calość potraktować tymi procedurami do pakowania Streamów z modułu ZLib, no i mamy swoje archiwum.

I teraz czy jeśli zapisał bym zakodowany tekst w plikach txt to czy dało by się napisać taki
kod który podczas wczytywania tekstu z plików tekstowych do memo (w tym programie który
pomagacie mi pisać) odszyfrowuje ten tekst z pliku tekstowego z powrotem na oryginalny i
wyświetla odszyfrowany tekst w memo chociaż w pliku txt jest zaszyfrowany.
Jeśli się da to proszę żebyś napisał mi taki kod i powiedział jak go użyć i mój program będzie
skończony A potem już zaczynam naukę od początku, krok po kroku Obiecuję.

Poniżej masz proste szyfrowanie oparte chyba na Szyfrze Cezara. Podpowiedział mi je Zeus autor gry "5x5",
dostępnej na portalu gry WP.PL. Również użyłem je w swojej bardziej rozbudowanej niż Jego wersji też gry
"5x5", której jednak portal wp.pl nie chciał umieścić olewając mnie, ale trudno się mówi. Na formatce musisz
umieścic Memo o nazwie TekstMemo i dwa przyciski. Jeden szyfruje tekst wpisany do Memo i zapisuje go do
pliku zaszyfr.dat, a drugi przycisk odszyfrowujący wpisze do TekstMemo odszyfrowaną zawartość pliku, o ile
ten istnieje na dysku. Do operacji szyfrowania i odszyfrowania użyłem MemoryStreamów, bo są szybkie, no i
poza tym nie mogłem użyć StringList, bo w zaszyfrowanym tekstcie mógł by się (w zależności od długości i
zawartości stałej Passwordzik oraz szyfrowanego tekstu) znaleźć znak o kodzie 0, a to przerywało by łancuch
tekstowy uniemożliwiając jego dalsze wczytanie. Bo Twój przykład mi nic nie mówi. Wkeiłeś coś bez głowy z
sieci i chcesz odszyfrować. Jeżeli szyfr jest odwracalny to odpowiednim kodem powineienś zaszyfrowany tekst
odszyfrować. Tak jak u mnie w przypadku szyfrowania dodajemy wartość do bajtu, odwrotnie odejmujemy ją.
A za lekturę podstaw powinieneś się - według mnie - wziąć już dawno, a nie kombinowac tak na chybił trafił.

var
  Form1 : TForm1;
  OdStr, ZaStr : TMemoryStream;

const
  PlikZa = 'zaszyfr.dat';
  Passwordzik = 'm0j3_sup3r_t4jn3_h4su0';

implementation

{$R *.dfm}

procedure TForm1.ZaszyfrBtnClick(Sender : TObject);
var
  B : Byte;
  I : LongInt;
begin
  OdStr := TMemoryStream.Create;
  ZaStr := TMemoryStream.Create;
  TekstMemo.Lines.SaveToStream(OdStr);
  OdStr.Position := 0;
  for I := 0 to OdStr.Size - 1 do
  begin
    OdStr.Read(B, 1);
    B := B + Ord(Passwordzik[I mod Length(Passwordzik) + 1]) * 2;
    ZaStr.Write(B, 1);
  end;
  ZaStr.Position := 0;
  ZaStr.SaveToFile(PlikZa);
  OdStr.Free;
  ZaStr.Free;
end;

procedure TForm1.OdszyfrBtnClick(Sender : TObject);
var
  B : Byte;
  I : LongInt;
begin
  if FileExists(PlikZa) = True then
  begin
    OdStr := TMemoryStream.Create;
    ZaStr := TMemoryStream.Create;
    ZaStr.LoadFromFile(PlikZa);
    ZaStr.Position := 0;
    for I := 0 to ZaStr.Size - 1 do
    begin
      ZaStr.Read(B, 1);
      B := B - Ord(Passwordzik[I mod Length(Passwordzik) + 1]) * 2;
      OdStr.Write(B, 1);
    end;
    OdStr.Position := 0;
    TekstMemo.Lines.LoadFromStream(OdStr);
    OdStr.Free;
    ZaStr.Free;
  end;
end;

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