Wczytywanie ListView :/

0

Cześć. Mam spory problem, a mianowicie chciałem zapisać elementy ListView do pliku INI, a potem je odczytać. Zapisywanie wyszło tak jak chciałem:

var
   INI: TINIFile;
   i: Integer;
begin
     INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'test.txt');
 for i := 0 to ListView1.Items.Count -1 do begin
     INI.WriteString('User' + IntToStr(i), 'Caption', .ListView1.Items.Item[i].Caption);
     INI.WriteString('User' + IntToStr(i), 'Date', ListView1.Items.Item[i].SubItems.Text);
     INI.WriteBool('User' + IntToStr(i), 'Checked', ListView1.Items.Item[i].Checked);
  end;
   INI.Free;
end;

Ale gorzej już z wczytywaniem, ponieważ INI NIE MA takiego czegoś jak Count i niemam jak w pętli wrzucić tych itemów :/ Może jakieś pomysły ? Z góry dzięki :)

0

INI nie ma count ale ma ReadSection i wypisywanie do TStrings które ma już wartość Count :)

0

Hmmm, w helpie <ort>pisało </ort>o tym tak:

uses IniFiles;
procedure TForm1.FormActivate(Sender: TObject);

var
  AppIni: TIniFile;
begin
  AppIni := TIniFile.Create('win.ini');
  AppIni.ReadSections(ListBox1.Items);
  AppIni.ReadSection('Ports',Listbox2.Items);
  AppIni.ReadSectionValues('Ports',ListBox3.Items);
  AppIni.Free;
end;

Tylko, że moje elementy w pliku INI są np.: takie : User1, User2, User3, a ja ich nieznam bo to zalezy ile będzie wpisów w ListView :/ Pomoże ktos mi to rozkminić, pls :|

0

A pokaż kawałek tego pliku ini.

0

Przykładowy plik, kiedy do ListViewa dodałem 3 elementy:

[User0]
Caption=element2
Date=2004-10-31 1252
Checked=1
[User1]
Caption=test_element1
Date=2004-10-31 1244
Checked=1
[User2]
Caption=uzytkownik 3
Date=2004-10-31 1257
Checked=1

Tylko teraz jak to wczytać <ort>z powrotem </ort>:|

0

a nie możesz sobie z osobnej sekcji np: [main] zapisać ile masz tych "userów"
i potem już w pętli zaczynasz od zera a kończysz na tej wcześniej odczytanej warotści??

0

Zrób tak jak LukaStrz napisał, abo dajesz to w XMl i po kłopocie.. - można też wykorzystać pliki typowane przecież...

0

Dzięki, to była już dla mnie wskazówka z tym zapisaniem Count, ale teraz zrobiłem tak, i co dalej niechce dobrze działać, znaczy dodaje tylko jeden element zamiast wszystkich i to jeszcze bez danych takich jak np.: Caption:

var
   INI: TINIFile;
   q, i: integer;
   Item: TListItem;
begin
     INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'a.txt');
     q := INI.ReadInteger('Users', 'Count', -1);
 for i := 0 to q -1 do begin
     Item := QOptions.ListView1.Items.Add;
     Item.Caption := INI.ReadString('User' + IntToStr(q), 'Caption', '');
     Item.SubItems.Text := INI.ReadString('User' + IntToStr(q), 'Date', '');
     Item.Checked:= INI.ReadBool('User' + IntToStr(q), 'Checked', True);
     INI.Free;
 end;
end;

Czy da się jeszcze coś zrobić, czy naprawde polececie mi przejście na inny typ plików ? :|

0

a ja bym proponowal Ci zrobic to tak bez ini bo co zrobisz jak przekroczysz dopuszczalny rozmiar pliku

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;
0

Wiem, widziałem już tego Tipsa na torrym :P Temat już nieaktualny, bo juz spbie poradziłem, ale BTW.: Ile może zmieścić najwięcej plik INI ? Bo o tym niewiedziałem, że jest ograniczenie.

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