TStringList for循环

时间:2018-10-09 12:56:04

标签: delphi for-loop

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

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循环来替换我以前尝试过的时间和日期戳,但是没有成功。

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

[FileName]
Break=09-10-2018 13:35

我想要的是,每当我按下中断按钮时,都需要在其他时间添加到文件中。

2 个答案:

答案 0 :(得分:3)

一个INI文件包含键/值对。要执行您想要的操作,您需要在每次按下按钮时创建一个唯一的键名,否则,每次都将覆盖一个现有值,就像已经发现的那样。

尝试更多类似的方法:

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;

或者这个:

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;

或者这个:

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;

答案 1 :(得分:1)

尽管您提到了TIniFile,但您的帖子和评论告诉我,这不一定是您想要的。 TIniFile虽然可以使用(如其他答案所示),但它并不是真正针对您所描述的用法。

为了简单地记录事件,我建议使用一个普通的文本文件,并向其中添加事件,如以下示例所示,使用TStringList。该示例是我很久以前使用的代码的简化摘录。

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; 

典型用法

procedure TForm2.btnBreakClick(Sender: TObject);
begin
  EventRecorder(now, 'Break', '');
end;