Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

нумерация [D7, Win95/98, Win2k, WinXP]


rosl ©   (2005-06-15 01:47:00) 

Уважаемые МАСТЕРА. Я задавал недавно этот вопрос, мне ответили, но я так и не решил свою проблему.
Создаю файлы, в имеин которых стоит номер документа. Формирую их по порядку например первый ___1.txt, второй ___2.txt, но если файлов больше 9 то вместо цифр, должны идти буквы - ___а.txt, ___b.txt. С цифрами понятно, а как сделать чтоб при формировании очередного файла в названии была следующая буква латинского алфавита?
ответ был таков:
S:='123...89abcd...yz';
FileName:=FileNameTemplate+S[FileIndex];
s - string?
FileNameTemplate - тоже не могу понять


rosl   (2005-06-15 05:34:00) [1]

спасибо


Просто Джо   (2005-06-15 04:12:00) [2]

Вот тебе объектно-ориентированный подход :)

-----------------------
Модуль NameTempl.pas:
-----------------------

unit NameTempl;

interface
uses SysUtils;

type

 TFileNameTemplate = class
 private
   FBuffer,
   FPrefix,
   FPostfix,
   FExtension: string;
   FPointer: Integer;
   FUpperCase: Boolean;
   procedure CheckRangeError;
   function CurrentChar: Char;
 public
   constructor Create (const APrefix,APostfix,AExtension: string;
     AUpperCase: Boolean = False);
   function GetName: string;
   procedure Reset;
 end;

var
 FileNameTemplate: TFileNameTemplate;

implementation

{ TFileNameTemplate }

procedure TFileNameTemplate.CheckRangeError;
begin
 if FPointer > Length(FBuffer) then
   raise ERangeError.Create('Range error');
end;

constructor TFileNameTemplate.Create(const APrefix, APostfix,
 AExtension: string; AUpperCase: Boolean);
begin
 FBuffer := '0123456789abcdefghijklmnopqrstuvwxyz';
 FPrefix := APrefix;
 FPostfix := APostfix;
 FExtension := AExtension;
 FUpperCase := AUpperCase;
 Reset;
end;

function TFileNameTemplate.CurrentChar: Char;
begin
 CheckRangeError;
 Result := FBuffer[FPointer];
end;

function TFileNameTemplate.GetName: string;
begin
 Result := '';

 Result := Format(
   '%s%s%s.%s',
   [FPrefix,CurrentChar,FPostfix,FExtension]
 );
 if FUpperCase then
   Result := SysUtils.UpperCase(Result);

 Inc (FPointer);
end;

procedure TFileNameTemplate.Reset;
begin
 FPointer := 1
end;

initialization
 FileNameTemplate := TFileNameTemplate.Create('~~','__','txt',True);

finalization
 FileNameTemplate.Free;

end.


Подключаешь его к проекту (Project/Add to Project...). Добавлюяешь в uses того модуля, в котором будешь его использовать и... все :)

-------------------
Тестовый пример:
-------------------
Кладешь на форму Memoи Button. В обработчике OnClickButton'а пишешь:
Memo1.Lines.Add(FileNameTemplate.GetName);
Запускаешь программу и клацаешь по кнопке несколько раз.

-------------------
Объяснение
-------------------
В модуле объявлена глобальная переменная FileNameTemplate. При старте приложения экземпляр объекта TFileNameTemplateавтоматически создается и ссылка на объект сохраняется в глобальной переменной FileNameTemplate. При завершении приложения объект автоматически уничтожается.
Каждое новое обращение к методу GetNameвозвращает новое имя файла. После того, как дошли до 'z' каждый новый вызов метода GetNameбудет генерировать исключение ERangeErrorс соответствующим сообщением об ошибке. Вызов метода Reset-- обнуляет счетчик и позволяет начать последовательность заново.
Так-с. Рассмотрим конструктор класса:

   constructor Create (const APrefix,APostfix,AExtension: string;
     AUpperCase: Boolean = False);

При создании экземпляра нашего класса можно указать следующие параметры:
  APrefix- строка символов, идущая ДО символа счетчика;
  APostfix- строка символов, идущая ПОСЛЕ символа счетчика;
  AExtension- расширение имени файла. Точку указывать НЕ нужно.
  AUpperCase- логическое значение, указывающее на то, нужно или нет генерировать имя файла в ВЕРХНЕМ регистре. Если его не указывать, будет использовано значение по умолчанию ЛОЖЬ. Т.е, имя файла - в нижнем регистре.
Все эти параметры исправь в вызове конструктора в секции initialization модуля NameTempl на те значения, которые тебе нужны.
Удачи, пользуйся.

П.С. Вот как люди борются с бессоницей ;-)


rosl   (2005-06-15 03:03:00) [3]

вот и я так же
мне бы разобраться с массивом (я в этом не силён)
нашёл кое-какие примеры. но может подкините свой именно по моему вопросу


Германн   (2005-06-15 02:20:00) [4]

s - string. Это точно!
FileNameTemplate - функция, которая возвращает " неизменную часть имени файла" или константа, которая представляет собой " неизменную часть имени файла".

Но по сути сабжа стоит еще и подумать о соответствии "Имени файла" и FileName!

Увы, не читал исходный сабж. Посему мог ответить невпопад. :(


Наверх

Титульная страница Поиск, карта сайта Написать письмо