2.3.1. Работа с коллекциями пиктограмм¶
Работа обеспечивается посредством класса TbtkImageList имеющего порт в скриптер. Подробное описание его свойств и методов можно посмотреть в BDN
2.3.1.1. Сфера применения¶
2.3.1.1.1. Экспорт пиктограмм, используется Global3¶
Необходимость обусловлена невозможностью использовать внутренний формат хранения Global1.
<SQL>
<SetClobDataXML>
begin BTK_COMPONENTapi.SETCLOBDATAXML(:ID, :XMLDATA); end;
</SetClobDataXML>
</SQL>
<PASCAL>
{$if DesktopVer >= 4.31.}
a := TbtkImageList.CReateFromBlob(GetVar('blobDataVCL'));
xml := null;
if Assigned(a) then
try
listH := VarToStr(a.Height);
listW := VarToStr(a.Width);
xml := '<?xml version="1.0" encoding="UTF-8" ?>'#13;
xml := xml + '
<imageCollection iconWidth="' + listH + '" iconHeight="' + listW + '">'
for i := 0 to a.Count - 1 do
xml := xml + '
<img index="' + VarToStr(i) + '" src="data:image/png;base64,
' + BlobToBase64(a.GetImageBlob(i, 'png')) + '"/>
';
xml := xml + '</imageCollection>';
if VarExists('XMLDATA') then
SetVar('XMLDATA', xml)
else
AddVar('XMLDATA', xml, ftOraClob);
ExecSQL('SetClobDataXML');
finally
a.Free;
end;
{$else}
ShowMessage('XML(Global3) версия набора не была сгенерирована'#13+
'Рекомендуется вовспользоваться более поздней версией, от 4.31.x');
{$endif}
</PASCAL>
2.3.1.1.2. Починить прозрачность “старой коллекци蔶
Некоторое время тому назад была реализована возможность использовать в наших коллекциях пиктограмм полупрозрачность(alpha-слой); старые же коллекции не содержат валидных данных в новообразовавшемся alpha-слое. Наиболее верным решением проблемы со старой коллекцией будет - залить коллекцию заново, правильными, полноценными пиктограммами в формате PNG. Одна же, как выясняется, на различных проектах содержатся уникальные коллекции изображений и их, по идее, тоже нужно перезаполнять.
Если открыть старую коллекцию на редактирование в клиенте, в соответствующем фрейме,- там она будет отображаться не так, скорее всего с чёрным фоном. Если сохранить редактирование такой коллекции - в последствии и везде в клиенте она будет отображаться чёрной, либо не будет отображаться(т.к. альфаслой возможно заместится полной прозрачностью).
Решение проблемы - пересоздать коллекцию с альфа-слоем построенном на основании “цвета прозрачности”, технологии более ранней чем полупрозрачность, и использовавшейся, соответственно, в старых коллекциях. Это действие реализуется выгрузкой изображений из коллекци в формат ‘png.realpha’, формат представляет собой самый обычный NPG, но при его формировании альфа-слой заполняется валидными значениями прозрачности в соответствии с цветом прозрачности(цвет верхнего-левого пикселя изображения).
<PASCAL>
Selection.Edit;
old := TbtkImageList.CReateFromBlob(GetVar('blobDataVCL'));
try
new := TbtkImageList.Create(old.Width, old.Height);
try
for i := 0 to a.Count - 1 do
new.AddImage(old.GetImageBlob(i, 'png.realpha'));
SetVar('blobDataVCL', new.SerializeToBlob);
finally
new.Free;
end;
finally
old.Free;
end;
</PASCAL>
В фрейме “Коллекции изображений” на ПКМ есть операция “Пересоздать слой прозрачности”. Эту операцию можно вызывать для коллекции у которой нет слоя прозрачности. После этого ее можно редактировать в 5.х клиенте, почернения изображений не будет.