связать 4 фрагмента информации и сохранить их - PullRequest
0 голосов
/ 20 февраля 2011

Сохранение, редактирование и загрузка информации. Информация, которую я хочу загрузить - это то, что я добавлю сам. Каждая строка информации будет содержать 4 фрагмента (строка, целое число, строка, целое число). Через 4 отдельных поля редактирования и кнопку я добавлю эту информацию в «базу данных» (не уверен, нужна ли мне база данных или это можно сделать с помощью чего-то вроде Tstringlist). Каждый раз, когда нажимается кнопка, в базу данных добавляется контент, набранный в тот момент.

Единственным требованием к сохраненным данным является то, что, когда я набираю первую строку из списка, она может поместить оставшуюся информацию, которая ей принадлежит, также в блокнот или поля редактирования. Так что я полагаю, что должен уметь искать. Просто хочу, чтобы все было максимально просто. Там будет только от 10 до 15 строк информации. и, если возможно, было бы хорошо, если бы я мог загрузить их снова позже.

1 Ответ

2 голосов
/ 20 февраля 2011

Вот очень простой код, который поможет вам в этом. Там нет проверки ошибок, и вы, несомненно, захотите разработать и изменить его дальше. Дело в том, что должны быть некоторые идеи, которые помогут вам написать код, который работает для вас.

Теперь, когда я разделил запятые полей, но не пытался обрабатывать появление запятых ни в одном из значений. Если это проблема, выберите другой разделитель или не используйте запятые. Я играл с написанием каждого поля в отдельной строке (эффективно используя новую строку в качестве разделителя), но это делает код чтения более сложным для написания.

Опять же, главное в том, что это не окончательный производственный код, но он предназначен для того, чтобы дать вам отправную точку.

function Split(const s: string; Separator: char): TStringDynArray;
var
  i, ItemIndex: Integer;
  len: Integer;
  SeparatorCount: Integer;
  Start: Integer;
begin
  len := Length(s);
  if len=0 then begin
    Result := nil;
    exit;
  end;

  SeparatorCount := 0;
  for i := 1 to len do begin
    if s[i]=Separator then begin
      inc(SeparatorCount);
    end;
  end;

  SetLength(Result, SeparatorCount+1);
  ItemIndex := 0;
  Start := 1;
  for i := 1 to len do begin
    if s[i]=Separator then begin
      Result[ItemIndex] := Copy(s, Start, i-Start);
      inc(ItemIndex);
      Start := i+1;
    end;
  end;
  Result[ItemIndex] := Copy(s, Start, len-Start+1);
end;

type
  TValue = record
    i1, i2: Integer;
    s: string;
  end;

  TMyDict = class(TDictionary<string,TValue>)
  public
    procedure SaveToFile(const FileName: string);
    procedure LoadFromFile(const FileName: string);
  end;

{ TMyDict }

procedure TMyDict.SaveToFile(const FileName: string);
var
  Strings: TStringList;
  Item: TPair<string,TValue>;
begin
  Strings := TStringList.Create;
  Try
    for Item in Self do begin
      Strings.Add(Format(
        '%s,%s,%d,%d',
        [Item.Key, Item.Value.s, Item.Value.i1, Item.Value.i2]
      ));
    end;
    Strings.SaveToFile(FileName);
  Finally
    FreeAndNil(Strings);
  End;
end;

procedure TMyDict.LoadFromFile(const FileName: string);
var
  Strings: TStringList;
  Item: TPair<string,TValue>;
  Line: string;
  Fields: TStringDynArray;
begin
  Strings := TStringList.Create;
  Try
    Strings.LoadFromFile(FileName);
    for Line in Strings do begin
      Fields := Split(Line, ',');
      Assert(Length(Fields)=4);
      Item.Key := Fields[0];
      Item.Value.s := Fields[1];
      Item.Value.i1 := StrToInt(Fields[2]);
      Item.Value.i2 := StrToInt(Fields[3]);
      Add(Item.Key, Item.Value);
    end;
  Finally
    FreeAndNil(Strings);
  End;
end;

Обратите внимание, что вы не пытаетесь найти файл на диске. Вы просто загружаете его в память, в словарь и оттуда смотрите.

Словарь отлично подходит, когда вы всегда используете один и тот же ключ. Если у вас несколько ключей, то словарь менее удобен, но кого волнует влияние на производительность, если у вас всего 15 записей?!

Отказ от ответственности : я не запускал код, я не проверял его и т. Д. И т. Д.

...