TStringList для цикла - PullRequest
       3

TStringList для цикла

0 голосов
/ 09 октября 2018

Здесь приложение 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 голосов
/ 09 октября 2018

Хотя вы упомянули 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;
0 голосов
/ 09 октября 2018

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...