2014-01-04 1 views
0

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

Как можно: 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; 

С наилучшими пожеланиями, G


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

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. 

Спасибо :)

ответ

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; 
+0

Почему вы повторяете OPself? 'if not direxists then createdir;' –

+1

@Free. Чтобы указать, как неправильно отпечаток кода может вызвать ошибки («SaveToFile» фактически находится за пределами «if»). –

+0

Знаете ли вы с ForceDirectories (dirName); вы просто получите ошибку, которая не может создать каталог. – Goaul