20.06.2007, 09:06 | #1 |
Участник
|
работа с ресурсом
Коллеги подскажите плиз элементарную вещь. Я создал resource из файла, картинку.
И хочу в зависимости от условий текущего record на форме выводить дисплей- метод, показывающий эту картинку в виде иконки. Как это делать в случае #resappl я знаю - надо создать display int метод и подключив макрос выводить номер ресурса соответственно, а как быть в моем случае чтобы добиться того же ??? |
|
20.06.2007, 09:55 | #2 |
Участник
|
Придется сохранять рисунок на диск.
X++: display str 255 GetImg() { ResourceNode resourceNode; BinData binData; container dataContainer; FileName imageName; str imagePath; ; resourceNode = infolog.getNode(UtilElementType::Resource, "Имя ресурса"); resourceNode.AOTload(); if (SysResource::getResourceNodeType(resourceNode) == SysResourceType::Image) { imagePath = SysResource::getTempPath(true); imagePath = imagePath + resourceNode.filename(); if (!winapi::fileExists(imagePath)) { dataContainer = SysResource::getResourceNodeData(resourceNode); binData = new BinData(); binData.setData(dataContainer); binData.saveFile (imagePath); } return imagePath; } return ""; } Можно, конечно, оптимизировать - сохранять в файл при старте формы, а из дисплей-метода возвращать только путь.
__________________
Axapta v.3.0 sp5 kr2 |
|
20.06.2007, 10:02 | #3 |
Участник
|
Вместо этого кода можно заюзать уже готовый
X++: display str 255 getImagePath(InventTable _inventTable) { ; if (_inventTable.ItemId == "1000") return SysResource::getImagePath("temp"); return SysResource::getImagePath("testResName"); } |
|
20.06.2007, 10:51 | #4 |
Участник
|
Угу. Именно с него и дернул
__________________
Axapta v.3.0 sp5 kr2 |
|
20.06.2007, 12:16 | #5 |
Участник
|
СПАСИБО
|
|
20.06.2007, 12:40 | #6 |
Moderator
|
Надеюсь, что правильно понял первоначальный вопрос.
У меня есть метод, создающий ImageList по контейнеру имен ресурсов, переданному как параметр: X++: // создает ImageList на основе контейнера, переданных ресурсов static ImageList createImageList(container _con) { ImageList imageList = new ImageList( ImageList::smallIconWidth(),ImageList::smalliconHeight()); Image image = new Image(); ResourceNode resourceNode; int i; ; for (i=1; i<=conlen(_con); i++) { resourceNode = SysResource::getResourceNode(conpeek(_con, i)); resourceNode.AOTload(); image.setData(SysResource::getResourceNodeData(resourceNode)); imageList.add(image); } return imageList; } X++: imageList = gm_txRegMainClass::createImageList(['lock', 'final']); LockWin.imageList(imageList); |
|
|
За это сообщение автора поблагодарили: leshy (1), kashperuk (5). |
20.06.2007, 13:28 | #7 |
Moderator
|
Кстати, я заметил неприятный эпизодический баг, что в 3-ке, что 4-ке, когда при экспорте/импорте ресурса Axapta дозаписывает несколько байт в мой ресурс после чего он перестает работать, как ожидалось. Происходит это 1 раз из 4-х и закономерности я не выявил.
Поэтому посылаю клиенту проект, я на всякий случай также посылаю набор ресурсов, не затянутых в Аксапту, и скрипт их туда затягивающий. |
|
13.07.2007, 11:34 | #8 |
Moderator
|
Недавно переносил один из проектов, использующих эту методику на новую версию 4-ки и ровно на 50% клиентов получил проблему именно в этом коде. На строке image.setData(...) клиент падает.
Закономерности (почему именно эти 50% машин) уловить не удалось, но причина проблемы понятна. Image, как наследник BinData, похоже живет только на клиенте и ресурс, загруженный на сервере не всегда удачно трансферится на клиент. Косвенным подтверждением этой теории является SysDeployer, который не передает BinData с сервера на клиент и обратно, а предварительно разворачивает данные контейнер (помоему, это самая устойчивая структура при передача с сервера на клиент). В общем, будьте осторожны с этим кодом. В моем проекте, слишком многое было уже завязано на эти рисунки и отказаться от них я уже не мог - привыкли пользователи, интерфейс им был очень понятен и удобен и т.д. Поэтому я сделал опцию, которая в случае, если пользователю не получается вставить image в imageList непосредственно из resource, выгружает картинку во временную директорию пользователя и работает уже с ней. |
|
|
За это сообщение автора поблагодарили: EVGL (4). |