Имя: Пароль:
1C
1С v8
Как получить картинку из коллекции по индексу?
0 Mazaev
 
23.07.09
08:50
В Общих картинках лежит коллекция картинок. Хотелось бы поместить эти картинки в список значений, чтобы иметь возможность выбрать нужную. Наименования картинок неизвестны, поэтому выбирать картинки из коллекции нужно по их индексу - номеру в коллекции.
Гуру, подскажите, пожалуйста, как это сделать?
1 vde69
 
23.07.09
09:01
.[индекс]
2 Mazaev
 
23.07.09
10:51
1 Пробовал, ругается, что коллекция картинок индекса не имеет
3 lxs
 
23.07.09
10:54
спКарт = Метаданные.ОбщиеКартинки;
КартинкаОбъект = спКарт.Получить(2);
ЭлементыФормы.ПолеКартинки.Картинка = БиблиотекаКартинок[КартинкаОбъект.Имя];
4 Mazaev
 
23.07.09
11:11
3
КартинкаОбъект  - это коллекция картинок.
А из нее картинка получается по имени, а надо по номеру в коллекции (индексу).
5 НЕА123
 
23.07.09
11:34
(3)+1

(4)
в (3) получен по номеру коллекции = 2.
что не так?
6 Mazaev
 
23.07.09
11:47
(5) Коллекция получена по номеру.
А нужно картинку из коллекции взять по номеру
7 GenV
 
23.07.09
12:02
(6) ?! Так тебе это и написали ...
ЗЫ Вообще хранить номер картинки это маразм. Как пример - передвинут картинки в конфигураторе и привет. Для этого у картинок и сделали имена.
8 Mazaev
 
24.07.09
04:56
(7) А хранить имя картинки не маразм?
И вообще, кто говорил про хранение?

Ладно, упростим вопрос.
Как получить из языка имя картинки (или все имена) в коллекции картинок?
9 НЕА123
 
24.07.09
08:47
ветку в хумор.
10 Mazaev
 
24.07.09
10:22
(9) А вы только оценки даете, или по делу что-нибудь можете сообщить?
11 НЕА123
 
24.07.09
10:37
плагиат (3)

СЗИмен = Новый СписокЗначений;
СЗКартинок = Новый СписокЗначений;
Для каждого Эл Из Метаданные.ОбщиеКартинки Цикл
   СЗИмен.Добавить(Эл.Имя);
   СЗКартинок.Добавить(БиблиотекаКартинок[Эл.Имя])
КонецЦикла;
12 Mazaev
 
24.07.09
11:03
(11) Вы исходный вопрос читали? Там написано: В Общих картинках лежит коллекция картинок.
Разъясняю: имеется в виду Общая картинка, являющуяся коллекцией картинок,  расположеных горизонтально и имеющих размер 16 x 16 точек..

Ваш код помещает в  СЗИмен имя моей единственной общей картинки, а в СЗКартинок - эту Общую картинку, являющуюся коллекцией картинок.

Мне же нужно узнать номера или имена всех картинок в этой коллекции.
13 НЕА123
 
24.07.09
11:23
(12) Картинка - это не коллекция. смотрите ИндексКартинки у ОформленияЯчейки.
на (0) ответ в (3).
14 Mazaev
 
24.07.09
11:58
(13) Это все умозрительно. А практически я в этом направлении решения не нашел.
Процедура ДЗПриАктивизацииЯчейки(Элемент)
//ДЗ - дерево значений, картинки в нем есть, берутся из Общей картинки
   Яч = Элемент.ОформлениеСтроки(Элемент.ТекущаяСтрока).Ячейки.Икон;
   Яч.ИндексКартинки = Элемент.ТекущаяСтрока.Инд;
   ЭлементыФормы.Иконка.Картинка = Яч.Картинка;
КонецПроцедуры
У Яч.Картинка ВидКартинки Пустая (Использование:Только чтение), несмотря на то, что для колонки Икон указана Библиотека иконок, т.е должен быть ВидКартинки ИзБиблиотеки. Осталась пустой даже после того, как явно задал ВидКартинки
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
.........
Колонка = ЭлементыФормы.ДЗ.Колонки["Икон"];
КартинкаОбъект = Метаданные.ОбщиеКартинки.Получить(0);
Колонка.КартинкиСтрок = БиблиотекаКартинок[КартинкаОбъект.Имя]; //Нормально присвоилось
КонецПроцедуры
15 GenV
 
24.07.09
12:01
(14) в первом коде индекс картинки из назначенных для ячейки картинок, а не общей библиотеки картинок. Т.ч. в 1С все правильно ...
в во втором ты присваиваешь картинку и пофик из библиотеки она или программно создана ...
16 НЕА123
 
24.07.09
12:12
(14).1 ошибка.

почитайте СП
ОформлениеСтроки()

>У Яч.Картинка ВидКартинки Пустая (Использование:Только чтение),
тут не знаю.
17 Mazaev
 
24.07.09
12:17
(15) Да не хочу я использовать общую библиотеку картинок, в ней нет нужных мне картинок. Поэтому в конфигураторе внес в Общие картинки найденную где-то подходящую картинку-коллекцию и пытаюсь с ней работать. В дерево значений картинки из нее нормально помещаются, а вот взять картинку из текущей строки ДЗ не могу.
18 НЕА123
 
24.07.09
12:22
и еще.
все-таки КартинкиСтрок или Картинку ЭУ?
19 GenV
 
24.07.09
12:23
(17) Из картинки содержацей коллекцию ты конкретную картинку не получишь по индексу - это делает сама система. Выход - использовать отдельные картинки (можно не в метаданные, а на форму невидимыми помещать или в макеты) и присваивать их каждой строке в ПриПолученииДанных/ПриВыводеСтроки.
20 lxs
 
24.07.09
12:24
off. по-моему в базе куда важнее корректность алгоритмов работы, а не красота.
21 Mazaev
 
24.07.09
12:30
(16) Про ошибку поясните плз.
СП - это что. (Извиняйте, я только начал изучать 8-ку)
(18) Конечно же КартинкиСтрок
(19) Да уж почти получил в (14), но она почему-то пустая :(
22 GenV
 
24.07.09
12:37
(21) Вообщем есть два варианта отображения картинок:
1) Назначить коллекцию для свойства "Картинки строк" и указывать индекс картинки в коллекции в переменной, назначенной для свойства ячейки "Данные картинки" (при выводе или в ТЗ).
2) При выводе для ячейки:
.ОтображатьКартинку = Истина;
.Картинка = КартинкаСтроки;
23 lxs
 
24.07.09
12:43
(21) СП синтакс-помощник
24 Mazaev
 
24.07.09
12:49
(24)
У меня так:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
......
Колонка = ЭлементыФормы.ДЗ.Колонки["Икон"];
КартинкаОбъект = Метаданные.ОбщиеКартинки.Получить(0);
Колонка.КартинкиСтрок = БиблиотекаКартинок[КартинкаОбъект.Имя];
.....
КонецПроцедуры

Процедура ДЗПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
......
ОформлениеСтроки.Ячейки.Икон.ИндексКартинки = ДанныеСтроки.Инд;
ОформлениеСтроки.Ячейки.Икон.ОтображатьКартинку = истина;
.......
КонецПроцедуры
25 Rebelx
 
26.07.09
22:39
Решение не мое (с)Шеметов Дмитрий:


Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Выбор = ЭлементыФормы.ПолеВыбора1.Значение;
   Если Не ЗначениеЗаполнено(Выбор) Тогда
       Возврат;
   КонецЕсли;        
   
   ЭлементСписка = ЭлементыФормы.ПолеВыбора1.СписокВыбора.НайтиПоЗначению(Выбор);
   Если ЭлементСписка <> Неопределено Тогда
       Картинка = ЭлементСписка.Картинка;
       
       Если Картинка <> Неопределено Тогда
           
           ИмяФайла = ПолучитьИмяВременногоФайла(".bmp");
           Картинка.ПолучитьДвоичныеДанные().Записать(ИмяФайла);
           Данные = ФайлВМассив(ИмяФайла);
           КолвоКартинок = ПолучитьКоличествоКартинок(Данные);
           
           Для й = 0 По КолвоКартинок - 1 Цикл
               Картинка = ПолучитьКартинкуИзДанных(Данные, й);
               ПолеСписка1.Добавить(й+1, й+1, ложь, Картинка);
           КонецЦикла;
           //Пример(ИмяФайла, Индекс);                        
           УдалитьФайлы(ИмяФайла);
           
       КонецЕсли;
       
   КонецЕсли;
           
КонецПроцедуры

Функция ПолучитьКоличествоКартинок(пДанные)
   
   ImageWidth    = пДанные[18] + пДанные[19]*256 + пДанные[20]*65536 + пДанные[21]*16777216;
   ImageHeight    = пДанные[22] + пДанные[23]*256 + пДанные[24]*65536 + пДанные[25]*16777216;
   
   КолвоКартинок = Цел(ImageWidth / ImageHeight);
   
   Возврат КолвоКартинок;
   
КонецФункции

Функция ФайлВМассив(пИмяФайла)
   
   // Перечисления из библиотеки ADO
   StreamTypeEnum = Новый Структура("adTypeBinary, adTypeText", 1, 2);
   ConnectModeEnum = Новый Структура(
       "adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
       |adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
       |adModeUnknown, adModeWrite", 1, 3, 4194304, 16, 4, 8, 12, 0, 2);
   
   StreamIn = Новый COMОбъект("ADODB.Stream"); //Для создания этого объекта требуется MDAC 2.5 и выше
   StreamIn.Type = StreamTypeEnum.adTypeBinary;
   
   StreamIn.Open(); //По умолчанию открывается на чтение
   StreamIn.LoadFromFile(пИмяФайла); //Очевидно, что для больших файлов так поступать нехорошо.
   Data = StreamIn.Read(); //у переменной Data тип COMSafeArray, это массив байтов
   StreamIn.Close(); //Больше нам этот поток не нужен - закрываем.
   
   //Конечно, манипуляция в памяти приемлима только для небольших файлов!
   Возврат Data.Выгрузить();    
   
КонецФункции

Процедура СохранитьМассивВФайл(пМассив, пИмяФайла)
   
   // Перечисления из библиотеки ADO
   StreamTypeEnum = Новый Структура("adTypeBinary, adTypeText", 1, 2);
   SaveOptionsEnum = Новый Структура("adSaveCreateNotExist, adSaveCreateOverWrite", 1, 2);
   ConnectModeEnum = Новый Структура(
       "adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
       |adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
       |adModeUnknown, adModeWrite", 1, 3, 4194304, 16, 4, 8, 12, 0, 2);
   
   //Запихиваем массив 1С в COMSafeArray. VT_UI1 - обозначение однобайтного беззнакового целого.
   Data = Новый COMSafeArray(пМассив, "VT_UI1", пМассив.Количество());
   
   StreamOut = Новый COMОбъект("ADODB.Stream");
   StreamOut.Type = StreamTypeEnum.adTypeBinary;
   StreamOut.Mode = ConnectModeEnum.adModeReadWrite; //Нужны и чтение и запись.
   
   StreamOut.Open(); //Открыли на чтение и запись
   StreamOut.Write(Data);    
   StreamOut.SaveToFile(пИмяФайла, SaveOptionsEnum.adSaveCreateOverWrite);
   StreamOut.Close();

   
КонецПроцедуры

Функция ПолучитьКартинкуИзДанных(пДанные, пИндекс)

   ImageOffset = пДанные[10] + пДанные[11]*256 + пДанные[12]*65536 + пДанные[13]*16777216;
   ImageWidth    = пДанные[18] + пДанные[19]*256 + пДанные[20]*65536 + пДанные[21]*16777216;
   ImageHeight    = пДанные[22] + пДанные[23]*256 + пДанные[24]*65536 + пДанные[25]*16777216;
   
   Если пДанные[28] = 8 Тогда
       BytesPerPixel = 1;
   ИначеЕсли пДанные[28] = 24 Тогда
       BytesPerPixel = 3;
   Иначе
       Сообщить("Формат не поддерживается");
       Возврат Неопределено;
   КонецЕсли;
   
   КолвоКартинок = Цел(ImageWidth / ImageHeight);
   
   Если КолвоКартинок <= 1 Тогда
       НовМассив = пДанные;
   Иначе
       
       НовМассив = Новый Массив;
   
       Для й = 0 По ImageOffset -1 Цикл        
           НовМассив.Добавить(пДанные[й]);        
       КонецЦикла;
   
       НовМассив[18] = ImageHeight;
       НовМассив[19] = 0;
       НовМассив[20] = 0;
       НовМассив[21] = 0;
               
       к = 0;
       Для й = ImageOffset По пДанные.ВГраница() Цикл
           Если Цел((й - ImageOffset) / (ImageHeight * BytesPerPixel)) % КолвоКартинок = пИндекс Тогда
               НовМассив.Добавить(пДанные[й]);        
               к = к + 1;
           КонецЕсли;
       КонецЦикла;
       
   КонецЕсли;
   
   ИмяФайла = ПолучитьИмяВременногоФайла(".bmp");
   СохранитьМассивВФайл(НовМассив, ИмяФайла);
       
   Картинка = Новый Картинка(ИмяФайла);
   
   УдалитьФайлы(ИмяФайла);
   
   Возврат Картинка;
   
КонецФункции
26 Mazaev
 
27.07.09
04:43
(25) Очень интересно. Буду пробовать. Спасибо.
27 Mazaev
 
27.07.09
06:23
(25) Попробовал. Решение интересное, и, по идее, то, что надо - преобразует коллекцию картинок в список картинок (в списке значений).
НО:
-Работает очень медленно
-Количество картинок определяет неверно. В моей коллекции их 34, а насчитано 37
-Картинки в списке картинок плохие. Заполнены непонятно чем 7 картинок их 37, а осталные - крестики.
Может, я делал что-нибудь не так. Прошу поправить.
Я положил на форму ПолеВыбора1 и ПолеСписка1 (поставил флажки ОтображатьКартинку и ОтображатьПометку) и добавил процедуру
Процедура ПриОткрытии()
СЗ = Новый СписокЗначений;
КартинкаОбъект = Метаданные.ОбщиеКартинки.Получить(0);
СЗ.Добавить(1, "Один", Истина, БиблиотекаКартинок[КартинкаОбъект.Имя]);
СЗ.Добавить(2, "Два", Ложь, БиблиотекаКартинок[КартинкаОбъект.Имя]);
ЭлементыФормы.ПолеВыбора1.СписокВыбора = СЗ;
КонецПроцедуры
28 Rebelx
 
27.07.09
10:34
тут оригинал: http://slil.ru/27861666
29 Mazaev
 
27.07.09
10:50
(28) Спасибо
30 Mazaev
 
27.07.09
10:53
(28) Та же история.
Возможно, размеры картинок у меня другие