链接4条信息并保存

时间:2011-02-20 14:41:06

标签: string delphi save

保存,编辑和加载信息。我想加载的信息是我自己添加的内容。每行信息将包含4个部分(字符串,整数,字符串,整数)。通过4个独立的编辑框和一个按钮,我将把这些信息添加到“数据库”中(不确定我是否需要数据库,或者是否可以通过类似Tstringlist的方式完成)。每次单击按钮时,它都会在“数据库”中添加当时键入的内容。

保存数据的唯一要求是当我从列表中键入第一个字符串时,它可以将属于它的其余信息放在备忘录或编辑框中。所以我想我必须能够搜索。只是想让它尽可能简单。只有大约10到15行信息。如果可能的话,如果我以后可以再加载它们会很好。

1 个答案:

答案 0 :(得分:2)

以下是一些非常基本的代码,可以帮助您实现目标。没有错误检查,你无疑会想要开发它并进一步修改它。关键是应该有一些想法可以帮助你编写适合你的代码。

现在我用逗号分隔了字段,但没有尝试在任何值中处理逗号的外观。如果这是一个问题,那么选择一个不同的分隔符,或转义逗号。我曾经在自己的行上写过每个字段(有效地使用换行符作为分隔符),但这使得阅读代码更难写。

同样,重点是这不是最终的生产代码,而是为了给你一个起点。

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条记录,谁会关心性能影响?!

免责声明:我没有运行代码,我没有测试过等等。