В общем делаю твикер для одной игрушки. Создал диалог сохранения файла. Но ещё мне необходимо его активировать, прописав в главном конфиге игрушки строку вроде "exec filename.cfg" в конце. Вопрос в том, как получить адрес каталога(можно-ли использовать диалог сохранения файла) и дописать необходимую строку в конец файла?

задан 22 Апр '12 2:20

изменен 26 Апр '12 12:01

Expert's gravatar image


51625

Тут два варианта:

  1. Вы создали диалог сохранения файла самостоятельно. То есть, создали форму, на ней накидали компоненты - список файлов, строку имени файла, выпадающий список с расширениями и т.д. В этом случае Вы сами должны в режиме Runtime предусмотреть возможность сохранения полного пути до папки.
  2. Вы используете Windows-диалог сохранения файла. Данный диалог после своего завершения даёт возможность получить полный путь до файла. Пусть это будет переменная FileName: string. Тогда используйте системную функцию ExtractFilePath(FileName). Если в FileName хранилось значение D:\Path\File.txt, то после выполнения функции Вы получите D:\Path. А дописать к строке подстроку можно простым суммированием: 'D:\Path' + '\filename.cfg'.

отвечен 26 Апр '12 11:35

изменен 26 Апр '12 12:20

Первая ссылка в google)

отвечен 23 Апр '12 12:48

То моя-же тема) Просто ошибки компилятор непонятные выдаёт при их решении. Вообще, вопрос не по Delphi, а по Lazarus.

(23 Апр '12 15:57) Furioness

Спасибо, с этим уже разобрался. Теперь другой вопрос: как быть с русскими символами в пути к файлу? Выбивает ошибку, вроде "Unable to create file "путь файла с русскими каталогами иили русским названием файла"".

отвечен 26 Апр '12 16:17

Вероятно, Вы используете какую-то функцию, которая не умеет работать с не-английской кодировкой. Решением может быть либо замена функции на ту, которая работает с языком корректно, либо посмотреть, как правильно нужно передавать строку в данную функцию.

Приведите пример кода, пожалуйста, чтобы понять, в чём может быть проблема.

(26 Апр '12 18:02) Антон Исаев
SaveDialog1.Execute;

  memo1.Lines.SaveToFile(savedialog1.FileName);

отвечен 26 Апр '12 23:21

изменен 27 Апр '12 10:18

Expert's gravatar image


51625

Измените код: SaveDialog1.Execute;

ShowMessage(SaveDialog1.FileName);

memo1.Lines.SaveToFile(savedialog1.FileName);

Что в сообщении выдастся?

И укажите, пожалуйста, точную версию Lazarus, возможно это баг Lazarus'а.

(27 Апр '12 14:14) Антон Исаев

В общем путь выдаёт нормальный, с русскими символами. Пробовал сохранять его в ansi и utf8string - при передаче в memo1.Lines.SaveToFile(s)не помогло. Ещё пробовал напрямую вводить путь, вроде memo1.Lines.SaveToFile('C:Documents and SettingsАдминистраторРабочий столТекстовый документ.txt');
Всё-равно та-же ошибка:"Unable to create file ..."

(27 Апр '12 17:44) Furioness

Вероятно, это баг класса TStrings в Вашей версии Lazarus. Укажите, пожалуйста, какая у Вас версия Lazarus'а, можно посмотреть решение на BugTracker'е Lazarus.

(27 Апр '12 19:01) Антон Исаев

Извиняюсь, забыл про версию) 0.9.30.4

(27 Апр '12 19:21) Furioness

Попробуйте так:

Memo1.Lines.SaveToFile(Utf8ToAnsi(SaveDialog1.FileName));

Как пишут в BugTracker'е Lazarus'а (http://bugs.freepascal.org/view.php?id=17171), функция SaveToFile ожидает ANSI строку. А свойство SaveDialog1.FileName - это UTF8-строка (http://lazarus-ccr.sourceforge.net/docs/lcl/dialogs/tfiledialog.filename.html)

(27 Апр '12 19:47) Антон Исаев

Заработало!!! Спасибо огромное!!! И последний вопрос: как получить чистое имя файла при помощи savedialog (ну чтоб не сохранять savedialog.filename в отдельную строку и оставлять всё, до "")

(27 Апр '12 21:27) Furioness

И ещё такая-же проблема возникает в следующей процедуре, utf8toansi и ansitoutf8 не помогают.

procedure TForm3.addexec; Var F: TextFile; Begin AssignFile(F, (utf8toansi(ExtractFileDir(SaveDialog1.FileName))+'config.cfg')); Append(F); WriteLn(F, 'exec ',SaveDialog1.FileName); CloseFile(F); End;

(27 Апр '12 21:41) Furioness

Чтобы получить отдельно имя файла из строки с полным именем файла, используйте функцию ExtractFileName(SaveDialog1.FileName). Был бы крайне благодарен, если бы Вы пометили, что Ваш вопрос закрыт :)

Насчёт второго момента - предлагаю оформить его отдельным вопросом, т.к. в комментариях очень неудобное оформление.

(27 Апр '12 22:11) Антон Исаев

Здравствуйте

БитКод - это совместно редактируемый форум вопросов и ответов для продвинутых пользователей компьютерной техники.

Присоединяйтесь!

отмечен:

×4

задан
22 Апр '12 2:20

показан
1612 раз

обновлен
27 Апр '12 22:11

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии

Дизайн сайта/логотип © «Сеть Знаний». Контент распространяется под лицензией cc by-sa 3.0 с обязательным указанием авторства.
Рейтинг@Mail.ru