连接4条信息并保存

2024-03-20

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

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


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

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

同样,要点是这不是最终的生产代码,而是旨在为您提供一个起点。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接4条信息并保存 的相关文章

随机推荐