Delphi TStringList for loop

Delphi TStringList for loop,delphi,for-loop,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

这里是一个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

我想要的是,每次我点击“中断”按钮时,它都需要在其他时间添加到文件中。

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;
或者这个:

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;

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;
或者这个:

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;

尽管你提到了
文件
,但你的帖子和评论告诉我,这不一定是你想要的<代码>文件并非真正用于您描述的用途,尽管它可以使用(如另一个答案所示)

对于事件的简单记录,我建议使用普通文本文件,对于向其中添加事件,可以使用
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;

尽管你提到了
文件
,但你的帖子和评论告诉我,这不一定是你想要的<代码>文件并非真正用于您描述的用途,尽管它可以使用(如另一个答案所示)

对于事件的简单记录,我建议使用普通文本文件,对于向其中添加事件,可以使用
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;

那么TStringList?INI文件的目的是什么呢?在方括号和键+值对中用名称表示部分。如果需要多个值,则需要使用多个唯一键。如
Break.1
Break.2
等@Brian,或者让值部分为字符串数组,用分隔符分隔。@MBo我有多个按钮,想要列表中的所有内容,并在Tmemofield中读取,但还没有找到其他方法。可能有一个方法,但还没有找到。我们无法立即为您提供代码,因为我们不理解您的问题。您有一个不做任何操作的字符串列表,以及一个按设计运行的ini文件。您的标题询问字符串列表,但除了创建和销毁字符串列表之外,您对字符串列表完全不做任何操作。TStringList的用途是什么?INI文件的部分由方括号和键+值对中的名称表示。如果需要多个值,则需要使用多个唯一键。如
Break.1
Break.2
等@Brian,或者让值部分为字符串数组,用分隔符分隔。@MBo我有多个按钮,想要列表中的所有内容,并在Tmemofield中读取,但还没有找到其他方法。可能有一个方法,但还没有找到。我们无法立即为您提供代码,因为我们不理解您的问题。您有一个不做任何操作的字符串列表,以及一个按设计运行的ini文件。您的标题询问字符串列表,但您对字符串列表完全不做任何处理,除了创建和销毁字符串列表之外,在末尾追加字符串列表非常重要。这是一种罕见的情况,
TextFile
type可能是个好主意。@Jerry你可能是对的。我在新的千禧年节日时把它从工具箱里掉了下来;)@杰瑞:或者一条简单的小溪。人们也可以很容易地使用流进行附加,甚至是文本。对于附加到末尾来说,这是相当沉重的。这是一种罕见的情况,
TextFile
type可能是个好主意。@Jerry你可能是对的。我在新的千禧年节日时把它从工具箱里掉了下来;)@杰瑞:或者一条简单的小溪。也可以使用流轻松地附加,甚至是文本。