首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TStringList for循环

TStringList for循环
EN

Stack Overflow用户
提问于 2018-10-09 20:56:04
回答 2查看 1.2K关注 0票数 1

这是一个VCL应用程序,我有一个与我的Ini文件的链接,我想继续在其中添加带有时间和日期戳的行,只需按一个按钮。

代码语言:javascript
复制
private
  FLog: TStringList;
  FIni: TIniFile;
  aTime: TDateTime;

procedure TForm2.btnBreakClick(Sender: TObject);
begin
  FLog := TStringList.Create;
  try
    aTime := Now;
    begin
      FIni.WriteString('FileName', 'Break', FormatDateTime('dd/mm/yyyy hh:nn', aTime));
    end;
  finally
    FLog.Free;
  end
end;

使用这段代码,我只能替换以前的时间和日期戳,我曾尝试使用for循环来替换,但没有成功。

这是当前几行代码的结果。

代码语言:javascript
复制
[FileName]
Break=09-10-2018 13:35

我想要的是,每次我点击break按钮,它需要添加到文件中的另一个时间。

EN

回答 2

Stack Overflow用户

发布于 2018-10-09 22:50:58

INI文件包含键/值对。要完成您所要求的操作,您需要在每次按下按钮时创建一个唯一的键名,否则您将覆盖每次现有的值,正如您已经发现的那样。

尝试更多像这样的东西:

代码语言:javascript
复制
procedure TForm2.btnBreakClick(Sender: TObject);
var
  Keys: TStringList;
  MaxBreak, I, Num: Integer;
begin
  MaxBreak := 0;
  Keys := TStringList.Create;
  try
    FIni.ReadSection('FileName', Keys);
    for I := 0 to Keys.Count-1 do
    begin
      if StartsText('Break', Keys[I]) then
      begin
        if TryStrToInt(Copy(Keys, 6, MaxInt), Num) then
        begin
          if Num > MaxBreak then
            MaxBreak := Num;
        end;
      end;
    end;
  finally
    Keys.Free;
  end;
  FIni.WriteString('FileName', 'Break'+IntToStr(MaxBreak+1), FormatDateTime('dd/mm/yyyy hh:nn', Now));
end;

或者这样:

代码语言:javascript
复制
procedure TForm2.btnBreakClick(Sender: TObject);
var
  I: Int64;
  Key: string;
begin
  for I := 1 to Int64(MaxInt) do
  begin
    Key := 'Break' + IntToStr(I);
    if not FIni.ValueExists('FileName', Key) then
    begin
      FIni.WriteString('FileName', Key, FormatDateTime('dd/mm/yyyy hh:nn', Now));
      Exit;
    end;
  end;
end;

或者这样:

代码语言:javascript
复制
procedure TForm2.btnBreakClick(Sender: TObject);
var
  NumBreaks: Integer;
begin
  NumBreaks := FIni.ReadInteger('FileName', 'NumBreaks', 0);
  Inc(NumBreaks);
  FIni.WriteInteger('FileName', 'NumBreaks', NumBreaks);
  FIni.WriteString('FileName', 'Break' + IntToStr(NumBreaks), FormatDateTime('dd/mm/yyyy hh:nn', Now));
end;
票数 4
EN

Stack Overflow用户

发布于 2018-10-10 01:01:18

尽管你提到了TIniFile,但你的帖子和评论告诉我,这不一定是你想要的。尽管可以使用TIniFile (如另一个答案所示),但它实际上并不适用于您所描述的用法。

对于简单的事件记录,我建议使用一个普通的文本文件,以及向其中添加事件的TStringList,如下例所示。这个例子是我很久以前用过的代码的简化摘录。

代码语言:javascript
复制
var
  EventFile: TFileName;

procedure EventRecorder(EventTime: TDateTime; Description, Comment: string);
var
  sl: TStringList;
  es: string;
begin
  sl: TStringList;
  try
    if FileExists(EventFile) then
      sl.LoadFromFile(EventFile);
    es := FormatDateTime('yyyy-mm-dd hh:nn:ss', EventTime)+' '+Description+' '+comment;
    sl.Add(es);
    sl.SaveToFile(EventFile);
  finally
    sl.free;
  end;
end; 

典型用法

代码语言:javascript
复制
procedure TForm2.btnBreakClick(Sender: TObject);
begin
  EventRecorder(now, 'Break', '');
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52721618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档