zapisywanie listbox

0

Czy może mi ktoś powiedzieć w jaki sposób mozna zapisać listview do pliku najlepiej *.ini lub *.txt ?? Z góry dzięki.

0

Najlepiej to tak:

var
 FileStream : TFileStream;
begin
 if FileExists('listview.txt') then
  FileStream := TFileStream.Create('listview.txt', fmOpenWrite) 
else
 FileStream := TFileStream.Create('listview.txt', fmCreate); 

 FileStream.WriteComponent(ListView1.); 
 FileStream.Free; 
0

Detox: Twój plik ma tylko rozszerzenie txt, ale jest strumieniem...

var c, cc:word;
begin
 for c:=0 to ListView1.Items.Count do
 begin
  dodaj_do_pliku('jakis_plik.txt', ListView1.Items.Item[c].Caption);
  for cc:=o to ListView1.Items.Item[c].SubItems.Count do
     dodaj_do_pliku('jakis_plik.txt', ' 'ListView1.Items.Item[c].SubItems[cc]);
 end;

end;
0

Detox: Twój plik ma tylko rozszerzenie txt, ale jest strumieniem...

Miało być Dat albo inny - zresztą to obojętne jakie rozwiązanie - zależy co chce autor z tym plikiem robić..

0

Miało być Dat albo inny - zresztą to obojętnie jakie rozwiązanie - zależy co chce autor z tym plikiem robić..

Jeżeli chce np. mieć dynamicznie tworzony listView i potem zweryfikować dane to łatwiej będzie mu to zrobić, gdy będzie miał plik TXT (jakkolwiek zawsze może napisać drugi program, który wczyta plik strumieniowy).

Pozdrawiam

0

Czy może mi ktoś powiedzieć w jaki sposób mozna zapisać listview do pliku najlepiej *.ini lub *.txt ?? Z góry dzięki.

A stała by Ci sie krzywda jak bys zajrzał do faq albo poszukał na forum??

a więc będzie to tak

procedure Tform1.wczytywanie(AListView: TListView; sFileName: string);
var
  F: TFileStream;
  IdxItem, IdxSubItem, IdxImage: Integer;
  W, ItemCount, SubCount: Word;
  pText: PChar;
  PTemp: PChar;
  MySignature: array [0..2] of Char;
  sExeName: string;
begin
  with AListView do
  begin
    ItemCount := 0;
    SubCount  := 0;

    sExeName := ExtractFileName(sFileName);

    if not FileExists(sFileName) then
    begin
//      MessageBox(Handle, PChar(Format(Msg1, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F := TFileStream.Create(sFileName, fmOpenRead);
    F.Read(MySignature, SizeOf(MySignature));

    if MySignature <> 'LVF' then
    begin
     // MessageBox(Handle, PChar(Format(Msg2, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F.Read(ItemCount, SizeOf(ItemCount));
    Items.Clear;

    for idxItem := 1 to ItemCount do
    begin
      with Items.Add do
      begin
        //Read imageindex
        F.Read(SubCount, SizeOf(SubCount));
        //Read imageindex
        F.Read(IdxImage, SizeOf(IdxImage));
        ImageIndex := IdxImage;
        //Read the Caption
        F.Read(w, SizeOf(w));
        pText := StrAlloc(w + 1);
        pTemp := StrAlloc(w + 1);
        F.Read(pTemp^, W);
        StrLCopy(pText, pTemp, W);
        Caption := StrPas(pText);
        StrDispose(pTemp);
        StrDispose(pText);
        if SubCount > 0 then
        begin
          for idxSubItem := 1 to SubCount do
          begin
            F.Read(w, SizeOf(w));
            pText := StrAlloc(w + 1);
            pTemp := StrAlloc(w + 1);
            F.Read(pTemp^, W);
            StrLCopy(pText, pTemp, W);
            Items[idxItem - 1].SubItems.Add(StrPas(pText));
            StrDispose(pTemp);
            StrDispose(pText);
          end;
        end;
      end;
    end;

    F.Free;
  end;
end;

procedure Tform1.zapisywanie(AListView: TListView; sFileName: string);
var
  idxItem, idxSub, IdxImage: Integer;
  F: TFileStream;
  pText: PChar;
  sText: string;
  W, ItemCount, SubCount: Word;
  MySignature: array [0..2] of Char;
begin
  //Initialization
  with AListView do
  begin
    ItemCount := 0;
    SubCount  := 0;
    //****
    MySignature := 'LVF';
    //  ListViewFile
    F := TFileStream.Create(sFileName, fmCreate or fmOpenWrite);
    F.Write(MySignature, SizeOf(MySignature));

    if Items.Count = 0 then
      // List is empty
      ItemCount := 0
    else
      ItemCount := Items.Count;
    F.Write(ItemCount, SizeOf(ItemCount));

    if Items.Count > 0 then
    begin
      for idxItem := 1 to ItemCount do
      begin
        with Items[idxItem - 1] do
        begin
          //Save subitems count
          if SubItems.Count = 0 then
            SubCount := 0
          else
            SubCount := Subitems.Count;
          F.Write(SubCount, SizeOf(SubCount));
          //Save ImageIndex
          IdxImage := ImageIndex;
          F.Write(IdxImage, SizeOf(IdxImage));
          //Save Caption
          sText := Caption;
          w     := Length(sText);
          pText := StrAlloc(Length(sText) + 1);
          StrPLCopy(pText, sText, Length(sText));
          F.Write(w, SizeOf(w));
          F.Write(pText^, w);
          StrDispose(pText);
          if SubCount > 0 then
          begin
            for idxSub := 0 to SubItems.Count - 1 do
            begin
              //Save Item's subitems
              sText := SubItems[idxSub];
              w     := Length(sText);
              pText := StrAlloc(Length(sText) + 1);
              StrPLCopy(pText, sText, Length(sText));
              F.Write(w, SizeOf(w));
              F.Write(pText^, w);
              StrDispose(pText);
            end;
          end;
        end;
      end;
    end;
    F.Free;
  end;
end; 

sposób użycia
form1.zapisanie(listview1,'c:\plik.ini');
form1.wczytanie(listview1.'c:\plik.ini');

pliki nie bedą miały formatu ini ale łatwo je wczytywać i zapisywać
nie zapomnij dodać deklaracji w type(tam gdzie wszyskie procedury tworzone przez delphi mają swoje deklaracje)

0
  1. Wstaw spbie kompnent TIniFile (musisz go ściągnąć)
  2. Oto kod do zapisania
var
    iniFile : TIniFile;
begin
    iniFile := TIniFile.Create(ExtractFilePatch(Application.ExeName) + 'nazwa.ini');
    iniFile.WriteString('ListViev1.Items'); //Chyba items ja stosowałem edita do tego

end;

P.S Application.ExeName powoduje zapis w folderze aplikacji więc nie muszisz podawać dokładnej lokalizacj dla pliku .ini pamiętaj jednak, że wcześniej musisz zapisać samą aplikacje. Pozdrowienia [cya]

A sorki miał byc komponent, no to Detoxa sposób... [wstyd]

// nie chodzi o zapisanie 'ListViev1.Items' tylko zawartości ListView1.Items [rotfl] - ŁF

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