Используйте поле TEdit, чтобы указать количество сгенерированных файлов

в XE5 я сделал приложение, в котором по умолчанию загружается небольшой файл txt с несколькими строками, используя функцию OnShow. Также есть 1 поле TEdit1 со значением по умолчанию = 300 и кнопка TButton для сохранения файла в указанном каталоге.

Как это возможно: 1.) используя значение в поле TEdit1, чтобы получить это количество файлов в указанном каталоге, значение может быть изменено при необходимости; 2.) все сгенерированные файлы должны иметь вид: 1.txt, 2.txt, 3.txt... и т.д.

Теперь функция кнопок:

procedure TForm1.GenerateClick(Sender: TObject);
var
  dirName : String;
begin
  // Create a new directory
  dirName := 'gen';
  if DirectoryExists(dirName)
then
  Memo1.Lines.SaveToFile('gen\default.txt')
else
  CreateDir(dirName);
  Memo1.Lines.SaveToFile('gen\default.txt');
end;

С уважением, Г


весь рабочий код:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IOUtils, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    SaveFile: TButton;
    Generate: TButton;
    Memo1: TMemo;
    procedure LoadFile(Sender: TObject);
    procedure SaveFileClick(Sender: TObject);
    procedure GenerateClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.LoadFile(Sender: TObject);
begin
if FileExists('template.txt')then begin
Memo1.Lines.LoadFromFile('template.txt');
  end
  else
    ShowMessage('Cant find template.txt, add text and use SAVE button !!!');
end;

procedure TForm1.SaveFileClick(Sender: TObject);
begin
Memo1.Lines.SaveToFile('template.txt');
end;

procedure TForm1.GenerateClick(Sender: TObject);
var
  dirName, fName : String;
  i, max: integer;
begin
  // Create a new directory
  dirName := 'gen';

  if NOT DirectoryExists(dirName) then
    CreateDir(dirName);

  fName := Edit1.Text;
  max := StrToInt(fName);

  for i := 1 to max do begin
    fName := dirName + '\'+ IntToStr(i) + '.txt';
    Memo1.Lines.SaveToFile( fName );
  end;

end;
end.

Спасибо :)


person Goaul    schedule 04.01.2014    source источник


Ответы (1)


Сама идея хранить данные в визуальных компонентах несколько вонючая. Но если вы настаиваете - тогда вы можете просто хранить целые значения в свойстве .TAG. Но ладно, изучите несколько случайных функций ниже и изучите ключевые слова begin и end:

Обновление: преобразование относительного имени в полное для ForceDirectories. Используемые функции:

Код с использованием готовой функции, предоставленной Delphi, становится таким:

procedure TForm1.GenerateClick(Sender: TObject);
var
  dirName, fName : String;
  i, max: integer;
begin
  // Create a new directory
  dirName := 'gen';

  dirName := ExpandUNCFileName(dirName); 
  // converting possible relative path to absolute

  dirName := IncludeTrailingPathDelimiter(GetCurrentDir) + dirName;
  // yet another way to do the same, as above
  // GCD function would return paths like "C:\" or like "C:\Users\Name\Documents"
  // so we don't know in advance if there would be slash at the end or not

  ForceDirectories(dirName);

  fName := EditField.Text;
  max := StrToInt(fName);

  // even better:  max := EditField.Tag; and change TAG property, not TEXT in IDE

  for i := 1 to max do begin
    fName := dirName + PathDelimiter + IntToStr(i) + '.txt';
    MemoField.Lines.SaveToFile( fName );
  end;

end;

Можно также вызвать TDirectory.CreateDirectory(dirName); вместо ForceDirectories, но я не могу сейчас проверить, работает ли первый с относительными путями или также требует расширения пути перед вызовом. Если это возможно, то неизмененный dirName будет допустимым параметром для прямого вызова функции.


На самом деле ваша исходная функция имеет странную, сломанную структуру. Двойное сохранение. Ниже я привожу правильную структуру вашего исходного кода для удобства чтения:

procedure TForm1.GenerateClick(Sender: TObject);
var
  dirName : String;
begin
  // Create a new directory
  dirName := 'gen';

  if DirectoryExists(dirName)
  then
    Memo1.Lines.SaveToFile('gen\default.txt')
  else
    CreateDir(dirName);

  Memo1.Lines.SaveToFile('gen\default.txt');
end;
person Arioch 'The    schedule 04.01.2014
comment
Почему вы повторяете OPself? if not direxists then createdir; - person Free Consulting; 04.01.2014
comment
@Free - Чтобы показать, как неправильный отступ кода может привести к ошибкам («SaveToFile» на самом деле находится за пределами «if»). - person Sertac Akyuz; 04.01.2014
comment
Итак, вы знаете, что ForceDirectories(dirName); вы просто получите сообщение об ошибке, что не можете создать каталог. - person Goaul; 04.01.2014
comment
@SertacAkyuz, я полагаю, что OP уже знал о составных операторах, просто у него было плохое форматирование. Оригинал имел безобидное дублирование кода, в то время как этот пример искусственно сделан незначительно вредным. Я не вижу смысла. - person Free Consulting; 04.01.2014
comment
@Free - без искусственного вмешательства, это тот же код, что и в вопросе. - person Sertac Akyuz; 04.01.2014
comment
@SertacAkyuz, о, теперь понятно. - person Free Consulting; 05.01.2014
comment
@goaul ну да, в Delphi есть ограничения на FD - только что описанные в более новой справке Delphi. Исправлено Также проверьте эту функцию — она может работать или не работать с соответствующим путем: docwiki.embarcadero.com/Libraries/XE2/en/ - person Arioch 'The; 05.01.2014
comment
@Arioch'Спасибо, оба способа работают, как и предполагалось. :) - person Goaul; 06.01.2014