简体   繁体   中英

TStringList for loop

Here its a VCL app and I have a link with my Ini file and I wanna keep adding lines in there with time and date stamps with press of a button.

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;

With this piece of code I can only replace the previous time and date stamp I have tried to do it with a for loop but without succes.

This is the outcome with the current few lines of code.

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

And what I want is that everytime I hit the break button it needs to add on to the file with a other time.

An INI file contains key/value pairs. To do what you are asking for, you need to create a unique key name with every button press, otherwise you are just overwriting an existing value each time, as you have already discovered.

Try something more like this:

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;

Or this:

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;

Or this:

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;

Although you referred to TIniFile , your post and your comments tell me that that is not necessarily what you want. TIniFile is not really intended for the kind of usage you are describing, although it can be used (as the other answer shows).

For simple recording of events I suggest an ordinary text file, and for adding events to it, a TStringList as in the following example. The example is a simplified extract from code I used myself long time ago.

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; 

Typical usage

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM