保存,编辑和加载信息。我想加载的信息是我自己添加的内容。每行信息将包含4个部分(字符串,整数,字符串,整数)。通过4个独立的编辑框和一个按钮,我将把这些信息添加到“数据库”中(不确定我是否需要数据库,或者是否可以通过类似Tstringlist的方式完成)。每次单击按钮时,它都会在“数据库”中添加当时键入的内容。
保存数据的唯一要求是当我从列表中键入第一个字符串时,它可以将属于它的其余信息放在备忘录或编辑框中。所以我想我必须能够搜索。只是想让它尽可能简单。只有大约10到15行信息。如果可能的话,如果我以后可以再加载它们会很好。
答案 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条记录,谁会关心性能影响?!
免责声明:我没有运行代码,我没有测试过等等。