Простые TListView Экономят и загружают к и от файла (Экономящий просто ценности последовательности колонки)

Я использую Дельфи 2010, и я искал Интернет и нашел несколько примеров, но ни один из них не работал. Я использую его май из-за 2010 и unicode? Так или иначе......

Я ищу два установленного порядка, чтобы сделать, простое экономит и загружает к и от файла для TListView. Я только интересуюсь экономией ценностей последовательности в каждой колонке. т.е. заголовок и подпункты. Я не интересуюсь экономией расположения или любых объектов.

procedure SaveToFile(const FileName: string);
procedure LoadFromFile(const FileName: string);
1
nl ja de
@TLama правильный, вы действительно don' t хотят заставить визуальный контроль быть вашей основной структурой данных.
добавлено автор David Heffernan, источник
Теперь вы достигли времени когда you' ll понимают это необходимо сохранять данные отделенными от контроля за GUI.
добавлено автор TLama, источник
Только для простого destop приложения, не будет держать намного больше чем пару сотни пунктов
добавлено автор JakeSays, источник

2 ответы

Вот что-то очень сырое. Это использует довольно ограниченный формат разделенного текста счета. Содержанию не позволяют содержать действующие символы табуляции. Я также не осуществил проверки на ошибки вообще на функции груза. Я уверен, что можно добавить это.

uses
  ComCtrls, Types, StrUtils;

procedure ListViewSaveToFile(ListView: TListView; const FileName: string);

  procedure AddTextToLine(var Line: string; const Text: string);
  begin
    Line := Line + Text + #9;
  end;

  procedure MoveCompletedLineToList(const Strings: TStringList; var Line: string);
  begin
    Strings.Add(System.Copy(Line, 1, Length(Line)-1));//remove trailing tab
    Line := '';
  end;

var
  Strings: TStringList;
  LatestLine: string;
  i, j: Integer;

begin
  LatestLine := '';

  Strings := TStringList.Create;
  try
    for i := 0 to ListView.Items.Count-1 do begin
      AddTextToLine(LatestLine, ListView.Items[i].Caption);
      for j := 0 to ListView.Items[i].SubItems.Count-1 do begin
        AddTextToLine(LatestLine, ListView.Items[i].SubItems[j]);
      end;
      MoveCompletedLineToList(Strings, LatestLine);
    end;
    Strings.SaveToFile(FileName, TEncoding.UTF8);
  finally
    Strings.Free;
  end;
end;

procedure ListViewLoadFromFile(ListView: TListView; const FileName: string);
var
  Strings: TStringList;
  i, j: Integer;
  Fields: TStringDynArray;
  Item: TListItem;
begin
  Strings := TStringList.Create;
  try
    Strings.LoadFromFile(FileName);
    ListView.Clear;
    for i := 0 to Strings.Count-1 do begin
      Fields := SplitString(Strings[i], #9);
      Item := ListView.Items.Add;
      Item.Caption := Fields[0];
      for j := 1 to high(Fields) do begin
        Item.SubItems.Add(Fields[j]);
      end;
    end;
  finally
    Strings.Free;
  end;
end;
5
добавлено

Я предложил свое собственное решение, используя TStringList и Пары имя/значение, который, кажется, работает просто великолепно. Я храню заголовок Изделия на имя и все sub колонки в стоимости, тогда я просто разбираю стоимость для отдельных подпунктов

procedure LoadFromFile(AListView: TListView; AFileName: string);
var
 I : Integer;
 SL: TStringList;
 Item: TListItem;
 Col0, Col1, Col2, Col3, Col4, Col5: String;
begin
  SL:= TStringList.Create;
  try
    SL.LoadFromFile(AFileName);
    AListView.Items.BeginUpdate;
    AListView.Items.Clear;
    for I:=  0 to SL.Count - 1 do
    begin
     Item:= AlistView.Items.Add;
     Item.Caption:= SL.Names[I];
     parseValue(SL.ValueFromIndex[I], Col0, Col1, Col2, Col3, Col4, Col5);
     Item.SubItems.Add(Col0);
     Item.SubItems.Add(Col1);
     Item.SubItems.Add(Col2);
     Item.SubItems.Add(Col3);
     Item.SubItems.Add(Col4);
     Item.SubItems.Add(Col5);
    end;
    AListView.Items.EndUpdate;
  finally
   SL.Free;
  end;
end;

    procedure SaveToFile(AListView: TListView; AFileName: string);
    var
     I: Integer;
     SL: TStringList;
    begin
     SL:= TStringList.Create;
     for I := 0 to AListView.Items.Count - 1 do
     begin
      SL.Add(AlistView.Items[I].Caption + '=' +
             AlistView.Items[I].SubItems[0] + ',' +
             AlistView.Items[I].SubItems[1] + ',' +
             AlistView.Items[I].SubItems[2] + ',' +
             AlistView.Items[I].SubItems[3] + ',' +
             AlistView.Items[I].SubItems[4] + ',' +
             AlistView.Items[I].SubItems[5])
     end;
     try
      SL.SaveToFile(AFileName);
     finally
       SL.Free;
     end;
    end;

 procedure parseValue(AValue: String; var Col0, Col1, Col2, Col3, Col4, Col5: String);
 var
  I: Integer;
  S: String;
  L: TStringList;
 begin
  //create a temporary list to store the data parts in
  L:= TStringList.Create;
  try
  //iterate through the length of the string
  for I:= 1 to length(AValue) do
  begin
   //if the char is not a comma, append it to S
   if AValue[I] <> ',' then
    S:= S + AValue[I]
   else
  //if char is a comma, add S to temporary list and reset S
   begin
    L.Add(S);
    S:= '';
   end;
  end;
  //add the last string to temporary list
  L.Add(S);
  //assign the items in temporary list to variables to be passed back 
  Col0:= L[0];
  Col1:= L[1];
  Col2:= L[2];
  Col3:= L[3];
  Col4:= L[4];
  Col5:= L[5];
  finally
   L.Free;
  end;
 end;
0
добавлено
Что вы собираетесь сделать, когда вы изменяете количество колонок. Вы не должны трудно кодировать это. И почему перестраивают SplitString.
добавлено автор David Heffernan, источник
Никакой probs. Ваше решение прекрасно довольно хотя! Don' t понимают меня превратно. Я предлагал критику, которая была, надо надеяться, конструктивна. Don' t забывают добавлять проверку на ошибки, хотя в случае, если пользователь связывался с содержанием файла между, экономят и загружают.
добавлено автор David Heffernan, источник
Я не изменяю количество колонок и меня wasn' t знающий о череде разделений. Я буду использовать ваше решение, я просто пытался видеть, могу ли я написать что-то сам. Изучение
добавлено автор JakeSays, источник
Delphi & Lazarus
Delphi & Lazarus
274 участник(ов)

Чат про Delphi и Lazarus