z listview do memo

0

Siema. Mam listview z 3 kolumnami i chciałbym przenieść to jakoś do memo tak że jeden wiersz w listview to jedna linia w memo, kolumny w z listview w memo mogą być rodzielone np. "-" lub po prostu spacją. Jak to mogę zrobić bo nie mam pomysłu, bo nie ma czegoś takiego jak listview1. text czy innego prostego wyjścia.

Memo:

kolumna1a - kolumna 2a - kolumna 3a
kolumna1b - kolumna 2b - kolumna 3b
kolumna1c - kolumna 2c - kolumna 3c
kolumna1d - kolumna 2d - kolumna 3d
kolumna1e - kolumna 2e - kolumna 3e

0
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j,k: Integer;
  txt: string;
  sl: TStringList;
begin
  sl:= TStringList.Create;
  try
  for i:=0 to ListView1.Items.Count - 1 do
  begin
    txt:= ListView1.Items.Item[i].Caption;
    for j:=0 to ListView1.Items.Item[i].SubItems.Count - 1 do
      txt:= txt + #09 + ListView1.Items.Item[i].SubItems[j]; //#09 to kod znaku Tab
    sl.Add(txt);
  end;

  for k := 0 to sl.Count - 1 do
  memo1.Lines.Add(sl[k]);
  finally
  sl.Free;
  end;
end;
0

Jak napisać kody żeby tylko jedną zaznaczoną pozycję w TListview przeniosło do memo???

0

Najprościej to tak:

var
  S : string;
  I : integer;
  LI : TListItem;
begin
  LI := ListView1.Items[ListView1.ItemIndex];
  if Assigned(LI) then
  begin
    S := LI.Caption;
    for I := 0 to LI.SubItems.Count - 1 do
    begin
      S := S + #09 + LI.SubItems[I];
    end;
    Memo1.Lines.Add(S);
  end;
end;

I polecam poczytać kursy wyjaśniające podstawy to sam będziesz ogarniał tak banalne kwestie :)

0

A czy mógłby kolego napisać kilka zdań w jaki sposób to działa? Tak skrótowo.

0

Spróbuję...

// 1
var
  S : string;
  I : integer;
  LI : TListItem;
begin
// 2
  LI := ListView1.Items[ListView1.ItemIndex];
// 3
  if Assigned(LI) then
  begin
  // 4
    S := LI.Caption;
    // 5
    for I := 0 to LI.SubItems.Count - 1 do
    begin
      // 6
      S := S + #09 + LI.SubItems[I];
    end;
    // 7
    Memo1.Lines.Add(S);
  // 8
  end;
end;

1 - deklaracje zmiennych - tutaj chyba nie ma co tłumaczyć za bardzo, deklarujemy tylko potrzebne zmienne.
2 - zmiennej typu TListItem czyli elementowi dodawanemu zwykle lub odczytywanemu z ListView (w tym przypadku z ListView1) przypisywany jest wybrany element z tego ListView'a (własność ItemIndex to zaznaczony element).
3 - jeżeli zmienne LI jest rózna od nil, co sprawdza funkcja Assigned (czyli to, co jest w zmiennej LI jest inne od wartości "pusta" to znaczy, że element lub cału wiersz w ListView1 został wybrany, jeżeli nie to LI = nil, a na zmiennych typuów obiektowych, które zawierają nil nie można operowac, bo otrzymamy wyjątek Access Violation od kompilatora) i wtedy rób to co poniżej...
4 - zmiennej S przypisz własnośc Caption zmiennej LI (czyli faktycznie pierwszą kolumne ListView1 (te o indeksie 0).
5 - wykonaj pętle na zmiennej I na pozostałych kolumnach od zera (bo taki indeks ma druga fizycznie kolumna, a ostatnia ma indeks równy ilosć SubiItemów czyli Subitems.Count - 1).
6 - do zmiennej S dodaj to co już wniej jest plus znak tabulacji (kod ASCII #09 lub #09) oraz kolejny SubItem (czyli kolumna i indeksie, ktorego numer znajduje się w zmiennej I.
7 - zawartość zmiennej S jest dodawana do elementów Memo1.
8 - koniec bloku kodu rozpoczętego od linii opisanej numerem 3.
Ufff, przyznam, że tłumaczenie oczywistych oczywistości trwa dłużej niż samo napisanie kodu, bo wydawało mi się, że kod jest na tyle prosty, że wszystko idzie zrozumieć. Radzę na prawdę poczytać kursy z podstawami, pogooglować samodzielnie za informacjami co robią dane elementy języka, bo nie sądze aby za każdym razem ktoś tłumaczył Tobie jakiś kod linijka po linijce, po prostu sam musisz chcieć się tego nauczyć i zrozumieć co "robi" dany fragment kodu. Z czasem jak poznasz podstawy nie powinno to być dla Ciebie trudne. Według mnie Delphi to raczej łatwy język nawet na start nauki, bo łatwo można zrozumieć podstawy, także dzięki dużej ilości materiałów łatwych do znalezienia w Internecie.

0

A ten znak tabulacji do czego służy? jak to rozumieć w odniesieniu do Delphi.

0

Służy do rozdzielenia tych wpisów, tak jakbyś w edytorze obsługującym taki znak, jak na przykład Notatnik wcisnąl Tabulator. Równie dobrze może być spacja, znak końca linii, czy co tam chcesz.

0

A mógłby kolega napisać jak działają te instrukcje na plikach.
zapis
if SaveDialog1.Execute then
SaveDialog1.FileName;
plik := TFileStream.Create(SaveDialog1.FileName,__ fmCreate or fmShareCompat);
__
odczyt
if OpenDialog1.Execute then
OpenDialog1.FileName;
plik := TFileStream.Create(OpenDialog1.FileName, __fmOpenRead or fmShareDenyWrite);
__
szczególnie te podkreślone

0

Coś dziwnie ten kod wygląda. Ale pewnie zamiar jest taki, że po kliknięciu na Otwórz / Zapisz w Open / Save Dialogu - otwierany / zapisywany jest plik przy użyciu klasy TFileStream. O nazwie podanej w Open / Save Dialogu. Co do flag użytych przy odczycie / zapisie to sobie wygoogluj, po to jest google i help od IDE tam wszystko jest wyjaśnione. Nie ma sensu wyjaśniać Tobie co linijkę, co robi dany kod. Tak się niczego nie nauczysz. Także googluj, myśl, kombinuj samodzielnie i najważniejsze staraj się samodzielnie rozumieć kod.

0

Tak a propos, zamiast:

    S := LI.Caption;
    for I := 0 to LI.SubItems.Count - 1 do
    begin
      S := S + #09 + LI.SubItems[I];
    end;

wystarczy:

S:=LI.Caption+#9+StringReplace(LI.SubItems.Text,#13,#9,[rfReplaceAll]);

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