Odczyt tekstu do określonego znaku

0

Witam!
Czy jest to możliwe, aby wyświetlić elementy z jednego pliku txt takie jak np.
styczeń;luty;marzec;kwiecień
maj;czerwiec;lipiec;sierpień
wrzesień;październik;listopad;grudzień
w czterech osobnych okienkach memo? Chciałbym, aby elementy (styczeń, maj, wrzesień) były pod sobą, czyli coś na wzór CSV.

Szukałem informacji na ten temat w internecie, jednakże żadnego działającego konkretnego kodu w Delphi 2007 nie znalazłem.

Z góry dzięki za wszelkie sugestie.

0

Nie podam Ci gotowego rozwiązania, ale podpowiedź:

var
  lista : TStringList;
  miesiace : String;
  x : integer;
begin
  lista := TStringList.Create;
  miesiace := 'styczeń;luty;marzec;kwiecień;maj;czerwiec;lipiec;sierpień;wrzesień;październik;listopad;grudzień';
  ExtractStrings([';'], [], PChar(miesiace), lista);

  for x := 0 to lista.Count - 1 do
    Memo1.Lines.Add(lista.Strings[x]);

  lista.Free;
end;
0

a ja bym to zrobil od razu w memo uzywajac StringReplace()

0

Dzięki za podpowiedzi. Może jeszcze inaczej sformułuje moje pytanie- mianowicie tworzę program, w którym chcę umieścić nazwy i adresy stron www np:

Google;http://www.google.pl
YouTube;http://www.youtube.pl

Memo1 odpowiadałoby za wyświetlenie nazw kolejno pod sobą, zaś Memo2 osobno adresów. Jak to zrobić? Wiem, że dla niektórych może wydawać się to banalne- ale ja dopiero od niedawna programuje w Delphi.

0

A to nie lepiej do Listview to parsować? Dlaczego chcesz do memo's?
Caption jako nazwa, a Subitem1 jako Adres.

0

to już było jakiś miesiąc temu...

1

Zgaduję: robisz programik ze spisem linków do stron internetowych. W tym przypadku do przechowywania danych użyłbym TStringList.

  1. Możesz w prosty sposób zapisać/wczytać dane z dysku (LoadFromFile/SaveToFile)
  2. TStringList pozwala na konstrukcję name=value (odsyłam do helpa)

prosty przykład:

  1. Daj na formę jeden TListBox i jeden TEdit
  2. W sekcji public formy wstaw:
public
   lista : TSTringList;
  1. W zdarzeniu OnCreate formy wstaw:
  var
  x : integer;
begin
  lista := TStringList.Create;
  lista.Add('Google=http://www.google.pl');
  lista.Add('YouTube=http://www.youtube.pl');

  for x := 0 to lista.Count - 1 do
    ListBox1.Items.Add(lista.Names[x]);
  1. W zdarzeniu OnClick ListBox'a wstaw:
  if ListBox1.ItemIndex < 0 then exit;

  Edit1.Text := lista.Values[ListBox1.Items.Strings[ListBox1.ItemIndex]];

W ten sposób klikając na liście nazw w ListBox'ie w Edicie będziesz otrzymywał ich adresy.

PS. Jeśli chcesz mieć dane w pliku w postaci:

Google;http://www.google.pl
YouTube;http://www.youtube.pl

Możesz użyć funkcji StringReplace do dopasowania formatu danych, żeby działał z powyższym przykładem.

Wczytujesz plik do TStringList:

   lista.LoadFromFile(tuNazwaPliku);
   lista.Text := StringReplace(lista.Text, ';', '=', [rfReplaceAll]);

Zapisujesz TStringList do plliku:

   lista.Text := StringReplace(lista.Text, '=', ';', [rfReplaceAll]);
   lista.SaveToFile(tuNazwaPliku);

Albo po utworzeniu listy poprzez lista := TStringList.Create ustawiasz lista.NameValueSeparator podając znak, jaki będzie oddzielał parę name, value. U ciebie jest to średnik, a więc:

lista.NameValueSeparator := ';';

Specjalnie podałem rozwiązanie z podmianą znaków, ponieważ znak = jest domyślnym znakiem rozdzielającym parę name, value.

Po więcej informacji zapraszam pod F1...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.