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.х клиенте, почернения изображений не будет.