ForceDirectories — Функция Delphi


ForceDirectories — Функция Delphi

Почему ForceDirectories в КОЛ определена как процедура, а не как функция, как это было изначально?

В Хелпах:
«Category
file management routines
function ForceDirectories(Dir: string): Boolean;»

Я исправил процедуру на функцию следующим образом:
function ForceDirectories(Dir: String): Boolean;
begin
Result := False;
// Copied from unit FileCtrl:
if Length(Dir) = 0 then Exit;
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir) «Could not create folder » + sName, MB_OK + MB_ICONEXCLAMATION ) Почему ForceDirectories в КОЛ определена как процедура, а не как функция, как это было изначально?

В Хелпах:
«Category
file management routines
function ForceDirectories(Dir: string): Boolean;»

Я исправил процедуру на функцию следующим образом:
function ForceDirectories(Dir: String): Boolean;
begin
Result := False;
// Copied from unit FileCtrl:
if Length(Dir) = 0 then Exit;
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir)

Последовательней будет так:
function ForceDirectories(Dir: String): Boolean;
begin
Result := False;
// Copied from unit FileCtrl:
if Length(Dir) = 0 then Exit;
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir) Dir ) [1] Последовательней будет так:
function ForceDirectories(Dir: String): Boolean;
begin
Result := False;
// Copied from unit FileCtrl:
if Length(Dir) = 0 then Exit;
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir)

Это Эдвард Аретино выслал новую версию без учета моих улучшений, и я в спешке как было, так и вставил. Будет изменено повторно. Согласен, что как функция полезней.

Неправильный я код привёл, согласно FileCtrl должно быть вроде так:

function ForceDirectories(Dir: String): Boolean;
if Length(Dir) = 0
then begin
Result := False; Exit;
end;
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir) Dir ) [3] Неправильный я код привёл, согласно FileCtrl должно быть вроде так:

function ForceDirectories(Dir: String): Boolean;
if Length(Dir) = 0
then begin
Result := False; Exit;
end;
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir)

И как вариант — без использования оператора exit:

function ForceDirectories(Dir: String): Boolean;
begin
if Length(Dir) = 0
then Result := False
else begin
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir) ExtractFilePath(Dir ) [4] И как вариант — без использования оператора exit:

function ForceDirectories(Dir: String): Boolean;
begin
if Length(Dir) = 0
then Result := False
else begin
Dir := ExcludeTrailingPathDelimiter(Dir);
if (Length(Dir)

ForceDirectories: не получается создать директорию

02.10.2012, 20:28

Создать директорию
Искал темы, нашёл только с рутом для админа, поэтому создаю новую. Нужно просто создать директорию.

Не получается вывести директорию фаилов
Хочу показать все фалы .txt в папки но не получается. Выводит array что не так? 7 02.10.2012, 21:18 2 03.10.2012, 00:52 [ТС] 3

да так работает!

Добавлено через 2 часа 16 минут
Как не допустить повторного создания директории? Ну т. е. осуществлять проверку и если директории уже существует тогда continue , а если нет тогда создаем ее и continue?

03.10.2012, 01:10 4
03.10.2012, 01:10
16.04.2020, 20:20 5

Скопировал код, у меня на строке ForceDirectoriesUTF8(IncludeTrailingPathDelimiter(MyDir) + ‘inMyDir’);
выдается ошибка Identifier not found ForceDirectoriesUTF8.

16.04.2020, 21:04 6
17.04.2020, 16:48 7
17.04.2020, 18:31 8
17.04.2020, 18:31
17.04.2020, 18:31

Как создать директорию?
А как создать директорию? Заранее благодарен.

Как создать директорию?
Достала вся эта путаница со строками, когда пишешь то ли на С или С++ или С#, я вообще без.

Нужно вывести на экран информацию про системную директорию и директорию windows
Помогите плз!Нужно написать прогу которая выводит на екран такую инфу:Computer name,user.

ForceDirectories возвращает значение False

Я использую ForceDirectories функцию следующим образом:

И он возвращается , False и никаких каталогов вообще не созданы. GetLastError возвращает 0. Я запустить программу с правами администратора.

Каждый вызов завершается успешно и создаются каталоги. Однако, это аннулирует полезность ForceDirectories функции. Кто — нибудь знает , почему он ведет себя таким образом? (Я смотрю на вас , Дэвид)

Изменить путь разделитель, что является правильным для вашей платформы (Win32) и все будет хорошо:

Для того, чтобы сделать код переносимый между платформами (в рамках подготовки к какому-то момент в будущем, когда это может иметь отношение к вашей коде Delphi) вы можете:

Это может быть улучшено для повторного использования (только для поиска / замены символа который не является = PathDelim), но демонстрирует принцип.

ForceDirectories возвращает False

Я использую функцию ForceDirectories следующим образом:

И он возвращает False , и никакие каталоги вообще не создаются. GetLastError возвращает 0. Я запускаю программу с правами администратора.

Каждый вызов выполняется успешно, и каталоги создаются. Однако это исключает полезность функции ForceDirectories . Кто-нибудь знает, почему он ведет себя так? (Я смотрю на тебя, Дэвид)

directory delphi delphi-2010

2 ответа

9 Решение Deltics [2011-02-26 02:32:00]

Измените свой разделитель пути на то, что подходит для вашей платформы (Win32), и все будет хорошо:

Чтобы сделать код переносимым на разных платформах (при подготовке к некоторому будущему времени, когда это может иметь отношение к вашему коду Delphi), вы можете:

Это может быть улучшено для повторного использования (только поиск/замена символа, который не является = PathDelim), но демонстрирует принцип.

По-видимому, ForceDirectories нравится только \ , а не / . Решена глупая проблема.

ForceDirectories — Функция Delphi

В этой статье я постараюсь познакомить Вас с некоторыми стандартными функциями для работы с директориями. И еще приведу несколько пользовательских функций и примеры их использования. Также рассмотрен вопрос вызова диалога выбора директории.

Для начала начнем с простой функции для создания новой папки. Общий вид функции такой:

То есть если папка успешно создана функция возвращает true. Сразу же простой пример ее использования:

При нажатии на кнопку программа пытается создать папку с именем TestDir на диске C: и если попытка увенчалась успехом, то выводится соответствующее сообщение. Следует отметить, что если вы не указываете имя диска, на котором хотите создавать папку, то функция будет создавать папку в той же директории, где находится сама программа.

приведут к одному и тому же результату.

Теперь рассмотрим функцию для удаления папок. Ее объявление выглядит так:

Сразу же хочу предупредить, что данная функция способна удалять только пустые папки, и если там что-нибудь будет, то произойдет ошибка! Но выход есть. Здесь нам на помощь придет пользовательская функция с простым названием MyRemoveDir. Вот описание функции:

Копируете это все в Вашу программу, а затем эту функцию можно вызвать например так:

Теперь маленько отстранимся от непосредственной работы с папками и рассмотрим волнующий многих вопрос. Как вызвать диалог выбора папки (как при установке программ)?? ПРОСТО.

Подключаем в uses модуль Filectrl.pas (то есть uses FileCtrl;). Теперь ставим на форму еще кнопочку (чтобы не путаться :) и пишем такой код:

При выборе директории в заголовке формы отобразиться ее название!

Теперь рассмотрим следующую процедуру. К примеру Вам надо создать папку Dir1 по адресу: C:\MyDir\Test\Dir1, но при этом папок MyDir и Test на Вашем компьютере не существует. Функция CreateDir здесь не сработает, поэтому воспользуемся процедурой ForceDirectories. Ее общий вид таков:

Пример ее использования (как всегда я поставил на форму новую кнопку, а там написал)

Если директория указанная в параметре Name существует — то функция возвратит true.

Надеюсь, что помог Вам описанием данных функций и процедур. Сразу хочется дать совет: почаще заглядывайте в HELP, там много интересной и полезной информации!

ForceDirectories Routine

Unit Edit

Description Edit

(Please provide a description in your own words. It is illegal to use the wording from the Delphi Help.)

Technical Comments Edit

(Known issues / Documentation clarifications / Things to be aware of)

Examples Edit

(Please provide links to articles/source code that show how to use this item.)

See Also Edit

(Please provide links to items specifically related to this item.)

User Comments/Tips Edit

(Please leave your name with your comment.)

ForceDirectories — Функция Delphi

На этом шаге мы рассмотрим компонент TDirectoryEdit .

Компонент TDirectoryEdit представляет собой строку редактирования для ввода имен каталогов файловой системы. Являясь наследником TComboEdit, компонент TDirectoryEdit имеет кнопку, нажатие на которую приводит к открытию модального диалога выбора каталога (используется функция SelectDirectory из модуля FileCtrl). Выбранное имя каталога заносится в строку редактирования, если пользователь нажмет кнопку ОK в диалоге выбора имени каталога. Вы имеете доступ к выбранному имени каталога как к свойству Text компонента TDirectoryEdit.

Внешний вид компонента (рис.1):

Рис.1. Компонент TDirectoryEdit с открытым диалоговым окном

Рассмотрим свойства данного компонента :

Таблица 1. Свойства компонента TDirectoryEdit

type

TDirDialogKind = (dkVCL, dkWin32);

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

  • dkVCL – отображается стандартное диалоговое окно для открытия каталога TOpenDialog;
  • dkWin32 — отображается диалоговое окно в виде окна “обзор папок”.

Свойство Описание
property DirectInput: Boolean; Свойство отвечает за разрешение (или запрет) прямого ввода данных в строку редактирования компоненты TDirectoryEdit . DirectInput = False — прямой ввод данных в строку запрещен, и пользователь должен использовать кнопку для вызова диалога для внесения изменений в данные компонента.
property ButtonWidth: Integer; Ширину кнопки, являющейся составной частью TDirectoryEdit. Если это свойство имеет значение 0, то кнопка не показывается и событие OnButtonClick не вызывается (несмотря на значение свойства ClickKey).
property ClickKey: TShortCut; Свойство задает «горячую» клавишу или комбинацию клавиш для данного компонента, при нажатии которых будет автоматически открываться модальный диалог выбора каталога.
property DialogOptions: TSelectDirOpts;Позволяет задать режимы для диалога выбора имени каталога (в 32-битной версии при установке свойства DialogKind в значение dkWin32 значение свойства DialogOptions игнороируется).
property GlyphKind: TGlyphKind;Свойство позволяет указать, что кнопка имеет предопределенное изображение, задаваемое типом TGlyphKind:

  • gkCustom – цветная кнопка ;
  • gkDefault – черно-белая кнопка ;
  • gkDropDown — ;
  • gkEllipsis — ;

Приведем пример: создадим приложение, которое позволит заполнять компонент TTextListBox, добавляя каждый раз в новую строку имя выбранного в компоненте TDirectoryEdit имени каталога (аналогично примеру для компонента TFilenameEdit).

Поместим на форму TextListBox1, RxSpeedButton1 и RxSpeedButton2 (рис.2).

Рис.2. Форма с расположенными на ней компонентами TextListBox1, RxSpeedButton1 и RxSpeedButton2

RxSpeedButton1 (“Добавить строку”) – это кнопка для добавления новой строки в список TextListBox.

RxSpeedButton2 (“Очистить список”) – это кнопка для удаления записей из списка.

Свойству DirectInput компоненты DirectoryEdit1 придадим значение False, чтобы запретить прямой ввод данных в строку. Для компонента TextListBox1:

TextListBox1.Items[0]:=’ Выбор имени каталога:’ – строка будет служить заголовком списка.

Для компонента RxSpeedButton1 напишем обработчик события OnClick:

Для компонента RxSpeedButton2 напишем обработчик события OnClick:

Работа программы показана на рис.3(а-г).

Рис.3а. Диалоговое окно компонента TDirectoryEdit

Рис.3б. Добавлена строка в список TextListBox1

Рис.3в. Добавлена вторая строка в список TextListBox1

Рис.3г. Очистка списка

Текст этого примера можно взять здесь.

На следующем шаге мы рассмотрим компонент TDateEdit .

После инструкции ForceDirectories Delphi завершает процедуру

У меня есть эта простая процедура, но я нашел проблему, но при отладке я обнаружил, что Delphi успешно выполняет ForceDirectories но перепрыгивает непосредственно в конец процедуры, не выполняя строки после нее, почему это так?

Я использую Delphi XE5, 64-битный проект

Обновление: я заметил также размещение точек останова на линии после того, как showmessage имеет значок x для недопустимой точки прерывания вместо маленькой красной значки для допустимой точки останова, поэтому я проследил с начала процедуры, и я могу подтвердить, начиная с линии, начиная с цикл For не выполняется.

ExportToExcel — это встроенная процедура для экспорта данных в Excel.

Вполне возможно, что pagecontrol1.ActivePage.ComponentCount=0 и код внутри цикла никогда не выполняются.

PS Если отладчик даже не пытается перейти в первую очередь цикла, скорее всего, вы включили оптимизацию. Проверьте свойства проекта «компиляция/генерация кода» (и убедитесь, что вы используете конфигурацию сборки «debug»).

ForceDirectories баг?

Feg16, баг не в функции, а чьей-то голове, что задает такой параметр.

С таких, с которых появились тестеры ;)

Серега(с) Кто хочет потестировать новый модуль?(я) Лучше всего Макс(м) тестирует. (м) Не, я отказываюсь тестировать Серегины модули, потому, что он каждый раз обижается, когда ошибки находишь. (с) А ЭТО ПОТОМУ, ЧТО ТЫ ГЛУПЫЕ ОШИБКИ НАХОДИШЬ.

Feg16, баг не в функции, а чьей-то голове, что задает такой параметр.

Почему True, если каталоги не создан?

ForceDirectories returns true if it successfully creates all necessary directories

так кому жаловаться чтобы мне сделали refund за неработоспособную дельфи?

Выдает True но каталог не создает. Прощай 5% премии :(

Можешь смело требовать обратно свои 5% если глючный инструмент (Delphi) предоставлен клиентом/работодателем. Это их вина.

а именно: параметр должен быть допустимым/корректным именем каталога

ForceDirectories creates a new directory as specified in Dir, which must be a fully-qualified path name

Вообще-то вызывающий нарушил контракт функции ForceDirectories (а именно: параметр должен быть допустимым/корректным именем каталога). Поскольку контракт функции не соблюдён, то результат вызова — неопределён.Универсальное программистское правило: если ты на вход передаёшь мусор, то функция возвращает тебе мусор.Так что вся вина исключительно на вызывающем, но никак не на ForceDirectories.

Имя должно быть полным. А корректным быть не должно.

Не согласен. Чем это он не допустимый?

CreateDirectory возвращает верный результат, а ForceDirectories — нет.

Если посмотреть по логике ее работы — в ней есть ошибка.

Работа с директориями (папками) в Дельфи

В этой статье я постараюсь познакомить Вас с некоторыми стандартными функциями для работы с директориями. И еще приведу несколько пользовательских функций и примеры их использования. Также рассмотрен вопрос вызова диалога выбора директории.

Для начала начнем с простой функции для создания новой папки. Общий вид функции такой:

То есть если папка успешно создана функция возвращает true. Сразу же простой пример ее использования:

При нажатии на кнопку программа пытается создать папку с именем TestDir на диске C: и если попытка увенчалась успехом, то выводится соответствующее сообщение. Следует отметить, что если вы не указываете имя диска, на котором хотите создавать папку, то функция будет создавать папку в той же директории, где находится сама программа.

приведут к одному и тому же результату.

Теперь рассмотрим функцию для удаления папок. Ее объявление выглядит так:

Сразу же хочу предупредить, что данная функция способна удалять только пустые папки, и если там что-нибудь будет, то произойдет ошибка! Но выход есть. Здесь нам на помощь придет пользовательская функция с простым названием MyRemoveDir. Вот описание функции:

Копируете это все в Вашу программу, а затем эту функцию можно вызвать например так:

Теперь маленько отстранимся от непосредственной работы с папками и рассмотрим волнующий многих вопрос. Как вызвать диалог выбора папки (как при установке программ)?? ПРОСТО.

Подключаем в uses модуль Filectrl.pas (то есть uses FileCtrl;). Теперь ставим на форму еще кнопочку (чтобы не путаться :) и пишем такой код:

При выборе директории в заголовке формы отобразиться ее название!

Теперь рассмотрим следующую процедуру. К примеру Вам надо создать папку Dir1 по адресу: C:\MyDir\Test\Dir1, но при этом папок MyDir и Test на Вашем компьютере не существует. Функция CreateDir здесь не сработает, поэтому воспользуемся процедурой ForceDirectories. Ее общий вид таков:

Пример ее использования (как всегда я поставил на форму новую кнопку, а там написал)

Ну и напоследок приведу функцию для проверки: существует ли директория или нет. Ее общий вид такой:

Если директория указанная в параметре Name существует — то функция возвратит true.

Надеюсь, что помог Вам описанием данных функций и процедур. Сразу хочется дать совет: почаще заглядывайте в HELP, там много интересной и полезной информации!

Илон Маск рекомендует:  Атрибуты тега td
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL