Как избежать перезаписи TStringList.SaveToFile моих предыдущих изменений? - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь записать свой TStringList в файл TXT (mydbtxt.txt).

У меня есть два исходных файла: MainForm и Frame. В моей MainForm есть TabControl и Button, где я могу динамически добавлять дополнительные вкладки. Когда вкладки добавлены, фрейм будет Parent из новых вкладок.

Когда я добавляю новую вкладку и заполняю ее некоторыми данными, моя вторая вкладка всегда будет перезаписывать мою первую вкладку. Пожалуйста, помогите, последняя версия продолжает перезаписывать мою предыдущую запись.

См. Мое изображение:

образ

procedure TForm1.bSaveClick(Sender: TObject);
var
  strList: TStringList;
  i:integer;
begin
  strList := TStringList.Create;
  try
    for i := 0 to TabControl1.TabCount - 1 do
    begin
      strList.Delimiter := ' ';
      strList.QuoteChar := ',';
      strList.Add('PlanName,SavingAccount,InitialCapital,TopUp,Every,RemindOn,CashOutBy,Percentage,TotalInitialCapital' +#13#10
                              + profileFrame.plan_title.Text +','
                              + profileFrame.savingAccount_edit.Text +','
                              + profileFrame.initialCapital_edit.Text +','
                              + profileFrame.topUp_edit.Text +','
                              + profileFrame.every_comboBox.Selected.Text +','
                              + profileFrame.remindOn_comboBox.Selected.Text +','
                              + profileFrame.cashOutBy_comboBox.Selected.Text +','
                              + profileFrame.percentage_edit.Text +','
                              + profileFrame.initialCapital_edit.Text);
    end;
    strList.SaveToFile(TPath.GetDocumentsPath + TPath.PathSeparator + 'mydbtxt.txt');

  finally
    strList.Free;
  end;

end;

Вот как я создаю свой фрейм и как добавляю фрейм в TabControl:

procedure TForm1.AddNewTab;
begin
  profileFrame := TProfileFrame.Create(Self);

  //TabItem
  TabItem := TabControl1.Add();
  inc(tab_name_Count);
  tabItem.Text := tab_name_Count.ToString;
  //
  profileFrame.Parent := tabItem;

end;

1 Ответ

1 голос
/ 04 августа 2020

У вас есть одна переменная profileFrame, которую вы переназначаете каждый раз при вызове AddNewTab(). В bSaveClick() вы используете ту же переменную в al oop, поэтому, конечно, каждая строка, добавленная к TStringList, будет иметь одни и те же данные. Потому что у вас нет доступа к отдельным TProfileFrame объектам, которые вы создали ранее. Вы получаете доступ только к последнему TProfileFrame, созданному вами.

Поскольку каждый объект TProfileFrame является дочерним по отношению к TTabItem, вы можете попробовать следующее:

procedure TForm1.bSaveClick(Sender: TObject);
var
  strList: TStringList;
  i:integer;
  TabItem: TTabItem;
  profileFrame: TProfileFrame;
begin
  strList := TStringList.Create;
  try
    for i := 0 to TabControl1.TabCount - 1 do
    begin
      TabItem := TabControl1.Tabs[i];
      profileFrame := TabItem.Children[0] as TProfileFrame;
      strList.Add('PlanName,SavingAccount,InitialCapital,TopUp,Every,RemindOn,CashOutBy,Percentage,TotalInitialCapital');
      strList.Add(profileFrame.plan_title.Text +','
                + profileFrame.savingAccount_edit.Text +','
                + profileFrame.initialCapital_edit.Text +','
                + profileFrame.topUp_edit.Text +','
                + profileFrame.every_comboBox.Selected.Text +','
                + profileFrame.remindOn_comboBox.Selected.Text +','
                + profileFrame.cashOutBy_comboBox.Selected.Text +','
                + profileFrame.percentage_edit.Text +','
                + profileFrame.initialCapital_edit.Text);
    end;
    strList.SaveToFile(TPath.Combine(TPath.GetDocumentsPath, 'mydbtxt.txt');
  finally
    strList.Free;
  end;
end;

procedure TForm1.AddNewTab;
var
  TTabItem: TTabItem;
  profileFrame: TProfileFrame;
begin
  profileFrame := TProfileFrame.Create(Self);

  //TabItem
  TabItem := TabControl1.Add();
  inc(tab_name_Count);
  tabItem.Text := tab_name_Count.ToString;
  //
  profileFrame.Parent := tabItem;

end;

При этом нет необходимости дублировать имена столбцов для каждой записи, которая добавляется к TStringList. Это просто загрязнит текстовый файл и затруднит его чтение. Попробуйте вместо этого:

procedure TForm1.bSaveClick(Sender: TObject);
var
  strList: TStringList;
  i:integer;
  TabItem: TTabItem;
  profileFrame: TProfileFrame;
begin
  strList := TStringList.Create;
  try
    strList.Add('PlanName,SavingAccount,InitialCapital,TopUp,Every,RemindOn,CashOutBy,Percentage,TotalInitialCapital');
    for i := 0 to TabControl1.TabCount - 1 do
    begin
      TabItem := TabControl1.Tabs[i];
      profileFrame := TabItem.Children[0] as TProfileFrame;
      strList.Add(profileFrame.plan_title.Text +','
                + profileFrame.savingAccount_edit.Text +','
                + profileFrame.initialCapital_edit.Text +','
                + profileFrame.topUp_edit.Text +','
                + profileFrame.every_comboBox.Selected.Text +','
                + profileFrame.remindOn_comboBox.Selected.Text +','
                + profileFrame.cashOutBy_comboBox.Selected.Text +','
                + profileFrame.percentage_edit.Text +','
                + profileFrame.initialCapital_edit.Text);
    end;
    strList.SaveToFile(TPath.Combine(TPath.GetDocumentsPath, 'mydbtxt.txt');
  finally
    strList.Free;
  end;
end;

Тогда файл будет выглядеть примерно так:

образ

...