Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

Не воспринимается путь к файлу кирилицей   Найти похожие ветки 

 
Laguna ©   (2011-10-12 11:59) [0]

Сохраняя в базе картинку выполняю следующее:

 FotoTblDomFoto1.LoadFromFile(FilenameEdit1.Text)
,
где  для примера
FilenameEdit1.Text = "c:\Новая папка\Картинки\Img111.bmp"

вылетает вот эта ошибка http://s017.radikal.ru/i419/1110/be/3a63b68395b6.jpg
Отслеживая по коду обнаружил, что появляется она в момент отработки TFileStream.

constructor TFileStream.Create(const FileName: string; Mode: Word; Rights: Cardinal);
begin
 if Mode = fmCreate then
 begin
   inherited Create(FileCreate(FileName, Rights));
   if FHandle < 0 then
     raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
 end
 else
 begin
   inherited Create(FileOpen(FileName, Mode));
   if FHandle < 0 then
     raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
 end;
end;

Что же получается, загружать картинки можно только из папок, набранных латинскими буквами? Или есть какой обход данной ошибки?


 
Омлет ©   (2011-10-12 12:08) [1]

Дело не в кириллице.
"C:\Новая папка\Картинки\"C:\Новая папка\Картинки\Img111.bmp"" - путь кривой.


 
Laguna ©   (2011-10-12 12:12) [2]

Такой путь формируется для вывода ошибки на экран(ИМХО). А по коду ведь все просто - полю таблицы присваивается файл, находящийся по пути FilenameEdit1.Text. Почему же тогда путь из латинских букв принимает нормально?


 
Laguna ©   (2011-10-12 12:17) [3]

Вроде разобрался. Кирилица действительно ни при чем. Ошибка появляется, если в пути наименования папок с пробелами. Это не излечимо? Конечно можно взять за правило не загружать картинки из таких папок, но всетаки интересно.


 
RWolf ©   (2011-10-12 12:17) [4]

В Builder"е слэши в строковых литералах нужно удваивать.
FilenameEdit1.Text = "c:\\Новая папка\\Картинки\\Img111.bmp"


 
Медвежонок Пятачок ©   (2011-10-12 12:18) [5]

Такой путь видит дебуггер. Это реальный путь с которым ты пытаешься работать


 
RWolf ©   (2011-10-12 12:19) [6]

впрочем, торможу — это не Builder же.
никаких проблем быть не должно в принципе.


 
Медвежонок Пятачок ©   (2011-10-12 12:21) [7]

Это не излечимо?

Излечимо.
Но надо уметь работать со строками.


 
OW ©   (2011-10-12 12:22) [8]

"" обрамить?


 
Омлет ©   (2011-10-12 12:23) [9]

> Laguna ©   (12.10.11 12:17) [3]
> Кирилица действительно ни при чем. Ошибка появляется, если в пути наименования папок с пробелами.


И пробелы ни при чем. Говорят же - неверно формируется строка пути до файла. В FotoTblDomFoto1.LoadFromFile или раньше. Ошибка у тебя в программе.


 
Laguna ©   (2011-10-12 12:30) [10]

Не знаю что значит Но надо уметь работать со строками., если передаются стандартные параметры для компонентов. А вот убрал пробелы и с кирилицей путь берется нормально.


 
Медвежонок Пятачок ©   (2011-10-12 12:37) [11]

Что же получается, загружать картинки можно только из папок, набранных латинскими буквами?

Там все сложнее.
Если файл в латинице, но на картинке есть русские буквы, то тоже будет глючить.


 
Laguna ©   (2011-10-12 12:42) [12]


> Если файл в латинице, но на картинке есть русские буквы,
>  то тоже будет глючить.

Глубокая мысль

procedure TBlobField.LoadFromFile(const FileName: string);
var
 Stream: TStream;
begin
 Stream := TFileStream.Create(FileName, fmOpenRead);  //<-- Здесь ошибка/B>
 try
   LoadFromStream(Stream);
 finally
   Stream.Free;
 end;
end;


 
Dimka Maslov ©   (2011-10-12 12:44) [13]

В кириллическом варианте буква с что из себя представляет? Не кириллическая ли она? В моей практике подобные случаи бывали.


 
Юрий Зотов ©   (2011-10-12 12:51) [14]

> Laguna

Если полное (с путем) имя файла содержит пробелы, то оно должно быть заключено в кавычки.


 
Laguna ©   (2011-10-12 12:57) [15]

Исключено, ввод не вручную, а выбором самого FilenameEdit1 через стандартное диалоговое окно. Да я говорю что дело в пробелах, правда не могу объяснить почему так получается и где рыть.


 
Медвежонок Пятачок ©   (2011-10-12 12:58) [16]

Сохраняя в базе картинку выполняю следующее:
FotoTblDomFoto1.LoadFromFile(FilenameEdit1.Text)
где  для примера
FilenameEdit1.Text = "c:\Новая папка\Картинки\Img111.bmp"


вот что бывает, когда не слышал про опенфайл диалог.


 
Омлет ©   (2011-10-12 12:58) [17]

> Юрий Зотов ©   (12.10.11 12:51) [14]
> Если полное (с путем) имя файла содержит пробелы, то оно должно быть заключено в кавычки.


В какие кавычки?
Вот этот код прекрасно работает:


 bmp := TBitmap.Create;
 bmp.LoadFromFile("C:\а б.bmp");

Кавычки тут только для компилятора.


 
Медвежонок Пятачок ©   (2011-10-12 12:59) [18]

FilenameEdit1.Text

Текст-то у него конечно есть.
Но подозреваю, что это только унаследованное и для косметики.
А правильное имя файла лежит совсем в другом свойстве.


 
Омлет ©   (2011-10-12 12:59) [19]

> Laguna ©   (12.10.11 12:57) [15]

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


 
Laguna ©   (2011-10-12 13:01) [20]

>Юрий Зотов

> Если полное (с путем) имя файла содержит пробелы, то оно
> должно быть заключено в кавычки.


Нет, проверил, не помогло
FotoTblDomFoto1.LoadFromFile("""+ FilenameEdit1.Text + """)


 
Медвежонок Пятачок ©   (2011-10-12 13:03) [21]

Нет, проверил, не помогло
FotoTblDomFoto1.LoadFromFile("""+ FilenameEdit1.Text + """)


//FotoTblDomFoto1.LoadFromFile("""+ FilenameEdit1.Text + """)
ShowMessage(FilenameEdit1.Text);


 
Laguna ©   (2011-10-12 13:05) [22]

> Омлет

Да весь код с возникающей ошибкой я уже выкладывал [0]
Ну вот чуть по другому, взял из проекта.

if FilenameEdit1.Text <> "" then
      FotoTblDomFoto1.LoadFromFile(FilenameEdit1.Text)
     else
      FotoTblDomFoto1.Clear;


 
Омлет ©   (2011-10-12 13:06) [23]

> Laguna ©   (12.10.11 13:05) [22]

FotoTblDomFoto1 - какого типа?
FilenameEdit1 - какого типа?


 
Омлет ©   (2011-10-12 13:08) [24]

И вообще, по-хорошему надо так:

if OpenDialog1.Execute then
begin
 FotoTblDomFoto1.LoadFromFile(OpenDialog1.FileName);
 FilenameEdit1.Text := OpenDialog1.FileName;
end;


 
Laguna ©   (2011-10-12 13:10) [25]

> Медвежонок Пятачок


> ShowMessage(FilenameEdit1.Text);


И что?
http://s57.radikal.ru/i156/1110/2d/fb4549193e86.jpg


 
Медвежонок Пятачок ©   (2011-10-12 13:12) [26]

Теперь тоже самое, но в реальном своем конструкторе перед реальным открытием файла.


 
Laguna ©   (2011-10-12 13:16) [27]

> Омлет

> FotoTblDomFoto1 - какого  типа?

BloobField

>FilenameEdit1 - какого типа?


type
 TMaskedText = type string;
 property Text: TMaskedText;



> И вообще, по-хорошему надо так:if OpenDialog1.Execute thenbegin
>  FotoTblDomFoto1.LoadFromFile(OpenDialog1.FileName);  FilenameEdit1.
> Text := OpenDialog1.FileName;end;


Так я ведь FilenameEdit1 использую для выбора файла, а не OpenDialog1


 
Медвежонок Пятачок ©   (2011-10-12 13:19) [28]

маскедит для выбора файла?


 
RWolf ©   (2011-10-12 13:20) [29]


> Laguna ©   (12.10.11 13:10) [25]
> > Медвежонок Пятачок > ShowMessage(FilenameEdit1.Text);
> И что?

то, что строка выводится в кавычках.
а LoadFromFile требует имя без кавычек.


 
Dimka Maslov ©   (2011-10-12 13:24) [30]

Делаем Use Debug DCUs, заходим отладчиков в TFileStream и смотрим, что именно передаётся как FileName


 
Омлет ©   (2011-10-12 13:32) [31]

> Laguna ©   (12.10.11 13:16) [27]

1. Вопрос был, какого типа FilenameEdit1, а не FilenameEdit1.Text.
2. Думаю, всё-таки, TBlobField, а не BloobField.


 
Laguna ©   (2011-10-12 13:33) [32]

Я вот на что обратил внимание. Когда на экран выдается ошибка, то посмотрите внимательно на количество кавычек.
http://s012.radikal.ru/i320/1110/69/044fd7b0b99f.jpg
Получается, что имя файла без пути подставляется как полный путь. Странноо...

Касаемо параметра в создании потока, то вот
http://s017.radikal.ru/i426/1110/01/65d5e9a6bf69.jpg


 
Laguna ©   (2011-10-12 13:35) [33]

> Омлет

> Вопрос был, какого типа FilenameEdit1, а не FilenameEdit1.Text.


Ну какого типа может быть стандартный компонент?

FilenameEdit1: TFilenameEdit;


 
Медвежонок Пятачок ©   (2011-10-12 13:37) [34]

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

А кто сказал, что оно было без пути перед экспандом?
(Зачем кстати экспанд? )


 
Laguna ©   (2011-10-12 13:41) [35]

> Медвежонок Пятачок

> А кто сказал, что оно было без пути перед экспандом?(Зачем
> кстати экспанд? )

Да никаких экспандов я не делаю. Это еррора так формирует имя. Я просто передаю то, что находится в FilenameEdit1.Text и только.


 
Медвежонок Пятачок ©   (2011-10-12 13:44) [36]

На скрине имя файла с полным путем в кавычках, и к нему применено ExpandFileName.

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


Не получается и не странно.
Экспанд сделан полному имени с путем.


 
OW ©   (2011-10-12 13:45) [37]

TFilenameEdit - что это?

а нельзя просто как то
 if dlgOpen1.Execute then
 begin
   ProcessMe( dlgOpen1.FileName );
 end;


 
Laguna ©   (2011-10-12 13:52) [38]

Я кажется понял в чем дело. Более внимательная трассировка подталкнула.
http://i033.radikal.ru/1110/b4/74a5eac1222f.jpg
Обратите внимание сколько здесь кавычек - по 3 с каждой стороны. Вот здесь наверное собака и порылась.

Я передаю содержимое FilenameEdit1.Text как есть, а оно в свою очередь включает уже в себя обрамление из кавычек
http://s017.radikal.ru/i415/1110/fd/4a3c40530280.jpg

После обеда сделаю функцию их убирать и попробую что ролучится. Кажется в этом все дело...


> На скрине имя файла с полным путем в кавычках, и к нему
> применено ExpandFileName.

Ну не делал я экспандов, чесслово...


 
Медвежонок Пятачок ©   (2011-10-12 13:57) [39]

Ну не делал я экспандов, чесслово...

я и не говорил, что это ты.
я говорил, что
Экспанд сделан полному имени с путем.

вот он:

raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);

и он сделан ПОЛНОМУ ИМЕНИ ФАЙЛА С ПУТЕМ.

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


Не получается. И не странно.
В конструктор пришло полное имя с путем и с кавычками.


 
Dennis I. Komarov ©   (2011-10-12 14:06) [40]


> TFilenameEdit - что это?

Это стандартный компонент в D7, ты что не знал? Просто это у тебя дельфи не правильная :)
З.Ы.
 Понаставят тут всякое...


 
RWolf ©   (2011-10-12 14:07) [41]


> После обеда сделаю функцию их убирать

AnsiDequotedStr


 
OW ©   (2011-10-12 14:26) [42]


> Dennis I. Komarov ©   (12.10.11 14:06) [40]
> > TFilenameEdit - что это?
> Это стандартный компонент в D7, ты что не знал?

не-а.. И даже теперь не нашел. Да и ладно, все равно юзать не буду
зачем оно, когда есть edit, button и opendialog, простые и надежные, как Калашников


 
Омлет ©   (2011-10-12 14:26) [43]

Подозреваю, что у этого компонента есть свойство FileName.


 
Laguna ©   (2011-10-12 14:51) [44]

> OW

> не-а.. И даже теперь не нашел. Да и ладно, все равно юзать
> не будузачем оно, когда есть edit, button и opendialog,
> простые и надежные, как Калашников

Это компонент из состава Rx Controls.
Он все это в себе объединяет.

Ребята, всем спасибо за обсуждения, решение найдено. Дело было в лишних ковычках. Сейчас все работает как надо.

>RWolf

Отдельное спасибо за AnsiDequotedStr


 
Dimka Maslov ©   (2011-10-12 15:03) [45]

Яркий пример того, почему не надо пользоваться всякими левыми компонентами.


 
OW ©   (2011-10-12 15:17) [46]


> Dimka Maslov ©   (12.10.11 15:03) [45]

+мильон

Да и дело даже не в этом, RX качественно делали, вроде
просто когда открываешь проект, чтоб поправить, начинается.. то одно надо поставить, то другое.. Особенно, какие-нибудь 5 лет давности. Библиотеки не приложены, или утеряны, или испорчены...
Есть время - все переписать на стандарт, имхо.
Без какой-нибудь градиентной заливки кнопки можно легко обойтись.

И камень второй, более глубокий.
Часто их интерфейс рисуется руками, и при переходе на схемы/темы современных осей - перерисовка хромает, интерфейс начинает лажать, а сделать уже мало что можно.


 
QAZ   (2011-10-12 15:24) [47]

ээ какбэ, кавычки для путей с пробелами нужны только для коммандной строки запускаемого приложения
ибо там суть пробела - разделитель
для файловых функций оно не надо


 
Омлет ©   (2011-10-12 15:41) [48]

> Laguna ©   (12.10.11 13:35) [33]
>> Омлет
>> Вопрос был, какого типа FilenameEdit1, а не FilenameEdit1.Text.
> Ну какого типа может быть стандартный компонент?
> FilenameEdit1: TFilenameEdit;


> Laguna ©   (12.10.11 14:51) [44]
> Это компонент из состава Rx Controls.


Дада, очень стандартный. И работает чудно.


 
Dimka Maslov ©   (2011-10-12 17:45) [49]


> ээ какбэ, кавычки для путей с пробелами нужны только для
> коммандной строки запускаемого приложения


А ведь могли бы и до урл-кодирования додуматься. Вдруг нам понадобиться имя файла на сервер передать.


 
Dennis I. Komarov ©   (2011-10-12 19:24) [50]


> OW ©   (12.10.11 14:26) [42]

не будь так серьезен, на смайла, но все-таки крутые перцы ставят себе сборку с включеными в него Rx, AlphaControls, etc


 
Германн ©   (2011-10-12 21:02) [51]


> крутые перцы ставят себе сборку с включеными в него Rx,
> AlphaControls

В данном случае достаточно одной таблэтки!
Ибо AlphaControls включает в себя этот компонент.


 
знайка   (2011-10-12 21:56) [52]

альфа шмальфа... берите xaml и можно что и то и другое ...


 
Laguna ©   (2011-10-13 00:56) [53]

Кстати, вот еще на что обратил внимание

function ExtFilename(const FileName: string): string;
begin
 if (Pos(" ", FileName) > 0) and (FileName[1] <> """) then
   Result := Format(""%s"", [FileName])
 else Result := FileName;
end;


Т.е. если выбирается путь к файлу в папках которого есть пробелы, то в свойстве Text этот путь обрамляется кавычками. А для загрузки картинки от этих кавычек наоборот приходится избавляться. Зачем так сделано? Я так понимаю для того, чтобы путь как бы не был разорванным.


 
Dimka Maslov ©   (2011-10-13 09:27) [54]


> Зачем так сделано?


Потому-что [censored]. Во первых так делать не надо, а во вторых и сделано-то криво.


 
QAZ   (2011-10-13 10:46) [55]

Удалено модератором


 
han_malign   (2011-10-13 11:51) [56]


> FilenameEdit1: TFilenameEdit;
> Да и дело даже не в этом, RX качественно делали, вроде

- ключевое слово - вроде... Недавно пришлось поковыряться в этом конкретно компоненте - и понял, что проще руками сделать(TComboEdit+TSaveDialog), чем понять полет их мысли...
(вот на TDirectoryEdit - нареканий нет, а с этим они что-то перемудрили)

> автор сего уг, видимо решил "перестраховаться" на все случаи жизни

- к сожалению, это как раз творчество RX... и это только малая часть "странностей" обработки пути в этом модуле(там, по неведомым причинам, разбор командной строки с параметрами делается)...
Похоже под мультиселект затачивали, да не доточили...


 
Laguna ©   (2011-10-13 13:12) [57]

Я не думаю, что RX нужно списывать со счетов. Есть у них много удобных компонентов.

> han_malign
я водзадумал переписать выводимое значение FileName. По идее это нужно было бы сделать на событии

procedure TForm1.FilenameEdit1AfterDialog(Sender: TObject;
 var Name: String; var Action: Boolean);
begin
  if Action then
   (Sender as TFileNameEdit).Text :=  AnsiDequotedStr((Sender as TFileNameEdit).Text, """));
end;

Но нифига не прокатывает. А если поставить на FilenameEdit1Changeто получится зацикливание.


 
Медвежонок Пятачок ©   (2011-10-13 13:19) [58]

какой вкусный кактус. невозможно оторваться.


 
Anatoly Podgoretsky ©   (2011-10-13 15:29) [59]

> Laguna  (13.10.2011 13:12:57)  [57]

RX это наркотик, напрочь мозги отшибает.


 
Cobalt ©   (2011-10-18 16:45) [60]

по такому поводу взводится флаг на запрет реакции на OnChange поля ввода


 
Laguna ©   (2011-10-18 17:56) [61]

НЕ, все нормально, это какойто личный глюк был. Все работает.



Страницы: 1 2 вся ветка

Текущий архив: 2012.01.29;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.007 c
4-1253608495
QAZ
2009-09-22 12:34
2012.01.29
Меню


15-1318278603
Юрий
2011-10-11 00:30
2012.01.29
С днем рождения ! 11 октября 2011 вторник


15-1318195803
Юрий
2011-10-10 01:30
2012.01.29
С днем рождения ! 10 октября 2011 понедельник


2-1318634868
Romancaw
2011-10-15 03:27
2012.01.29
Как при помощи Sendinput отправить текст из tEdit?


2-1318975668
Gu
2011-10-19 02:07
2012.01.29
номер недели