Имя: Пароль:
1C
1С v8
v8: Что за глюк с преобразованием строки в число??
0 dave2000
 
22.01.13
22:52
Процедура Кнопка1Нажатие(Элемент)
   
   Путь = "D:\Картинки\";
   Имя = "D:\Картинки\55159203.jpg";

   Shell = Новый COMОбъект("Shell.Application");
   Папка = Shell.Namespace(Путь);
   Файл=СтрЗаменить(Имя,"\","" "");
   Файл=Папка.ParseName(СтрПолучитьСтроку(Файл,СтрЧислоСтрок(Файл)));
   
   РазрешениеСтр = Строка(Папка.GetDetailsOf(Файл,31));    //Возвращает строку типа "800 x 600" (но строку ли?)
   //РазрешениеСтр = "800 x 600";    //Если вот так, напрямую строку присвоить, тогда всё работает
   
   ПозХ = Найти(РазрешениеСтр,"x");
   ШиринаСтр = СокрЛП(Лев(РазрешениеСтр,ПозХ-1));
   ВысотаСтр = СокрЛП(Сред(РазрешениеСтр,ПозХ+1));
   Ширина = Число(ШиринаСтр);      // <== здесь происходит ошибка преобразования
   Высота = Число(ВысотаСтр);
   
КонецПроцедуры


Это код получения разрешения картинки из файла. Сам параметр с разрешением получаем нормально, проблема происходит когда мы вытягиваем из строки вида "800 х 600" значений ширины и высоты и преобразования их в числовые значения, выдаётся ошибка:

> Преобразование значения к типу Число не может быть выполнено
> Ширина = Число(ШиринаСтр);

Подозрение падает на строку, получаемую методом GetDetailsOf() - какая-то она не совсем правильная что ли. Если мы переменной РазрешениеСтр напрямую присвоим строку "800 x 600", то всё работает, ошибок не возникает.

В чём может быть проблема?? Код рабочий, можете проверить у себя. Я пробовал на трёх разных серверах, ошибка повторяется. Неуж-то глюк 1С?
1 MaxS
 
22.01.13
23:00
ШиринаСтр обработать какой-нибудь типовой функцией, которая убирает все нецифровые символы. Или написать такую функцию.
2 DrShad
 
22.01.13
23:11
РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",")
3 DrShad
 
22.01.13
23:11
знание типовых таки необходимо
4 DrShad
 
22.01.13
23:12
[Неуж-то глюк 1С?] отладчик что говорит?
5 НаборДанных
 
22.01.13
23:19
Телепаты, ау...
//Возвращает строку типа "800 x 600" (но строку ли?) - Отладчик отменили уже?
Ширина = Число(ШиринаСтр); ШиринаСтр - Тут что, по словам отладчика?
6 НаборДанных
 
22.01.13
23:27
Очень интересно,


GetDetailsOf(<Элемент>,<Парам>)

Назначение: получение информации об элементе текущей папки. Возвращает строку.

Параметры:

   <Элемент> - объект FolderItem, соответствующий элементу текущей папки.
   <Парам> - целое число, определяющее тип информации. Возможные значения:
       0 - Имя элемента.
       1 - Размер элемента (только для файлов).
       2 - Тип элемента.
       3 - Дата и время последней модификации.
       4 - Дата и время создания.
       -1 - Тип элемента, дата и время последней модификации и размер элемента (только для файлов).

Описание: возвращается информация, похожая на ту, что можно увидеть в окне свойств файла (папки) в проводнике.
7 НаборДанных
 
22.01.13
23:29
Используй WIA.ImageFile.
8 dave2000
 
23.01.13
11:18
(4) (5) Так в том то и дело, что отладчик показывает значение типа "Строка". Но что-то с ней не так, даёт потом ошибку преобразования.
9 dave2000
 
23.01.13
11:19
(7) ну-ка поподробнее плиз
10 dave2000
 
23.01.13
11:22
Для получения параметров картинки был выбран именно такой способ, т.к. он не требует регистрации дополнительных библиотек, т.е. стандартными средствами. Может есть ещё какие стандартные способы?
11 Privalov
 
23.01.13
11:24
(8) Что в строке?
12 dave2000
 
23.01.13
11:26
(5) ШиринаСтр в отладчике имеет тип "Строка", никаких лишних символов нет, а вот преобразовывать в число почему-то не хочет.
13 dave2000
 
23.01.13
11:29
(11) в строке находится значение ?"888 x 710?"
14 dave2000
 
23.01.13
11:30
(13) "888 x 710"
15 acsent
 
23.01.13
11:34
икс не тот конечно же
16 dave2000
 
23.01.13
11:35
(13) всё, кажется найдена причина... строку копировал с отладчика, вставилась нормально, а вот на форум отправилась со знаками "?". Потыкал строку в отладчике - действительно, есть какие-то невидимые символы с нулевой шириной. Щас буду обрабатывать строку.
17 1Сергей
 
23.01.13
11:37
ПозХ ?
18 kittystark
 
23.01.13
11:39
на самом деле строка "800 х 600" обрамлена слева и справа не просто пробелами, а еще какими-то хитрыми символами с кодами более 8000 (если память не изменяет)

попробуй СтрЗаменить(твояСтрока, Символы.НПП, " ");

еще замечено, что не всегда вызов GetDetailsOf(...,31) возвращает строку содержащую размеры, лучше вызывать GetDetailsOf(...,-1)

у себя по шаблону регулярного выражения
.*Dimensions:\s.(\d+\sx\s\d+).*
использую замену $1
и получаю "нормальную нужную строку"

или как вариант по шаблону
.*Dimensions:\s.(\d+)\sx\s(\d+).*
через $1 - вытаскивать первый размер
через $2 - второй
19 НаборДанных
 
23.01.13
12:33
(9)Что еще подробнее говорить, штатная библиотэка виндовс,
LoadFile(path), потом доступно height и width.
обработку сделал, кинул кнопку, прописал путь к файлу, у меня "РазрешениеСтр " далеко не строка, поэтому и валится абсолютно так же как и у вас.
20 dave2000
 
23.01.13
13:34
(19) Ух ты, а ведь внатуре работает! И кода меньше:

ФайлКартинки = Новый COMОбъект("WIA.ImageFile");
ФайлКартинки.LoadFile(Путь+ИмяФайла);
Ширина = ФайлКартинки.Width;
Высота = ФайлКартинки.Height;
21 НаборДанных
 
23.01.13
13:35
(20)Рад, что помог)
22 dave2000
 
23.01.13
13:38
Всем спасибо за помощь! :)