Delphi TStringList for loop
这里是一个VCL应用程序,我有一个与我的Ini文件的链接,我想继续在那里添加带有时间和日期戳的行,只需按下一个按钮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
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你可能是对的。我在新的千禧年节日时把它从工具箱里掉了下来;)@杰瑞:或者一条简单的小溪。也可以使用流轻松地附加,甚至是文本。