fpSpreadSheet: вставка картинки TChart [РЕШЕНО]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

fpSpreadSheet: вставка картинки TChart [РЕШЕНО]

Сообщение Владимир »

Всем доброго! Озаботился вставкой графики в лист.
Прямой путь

Код: Выделить всё

Chart.SaveToBitmapFile('FieName');
Sheet.WriteImage(1,1,'FileName',0.0,0.0,0.01,0.01);
не устраивает, хотелось бы обойтись без записи на диск.
fpSpreadSheet представляет еще ф-цию вставки рисунка

Код: Выделить всё

Sheet.WriteImage(1,1,TStream,0.0,0.0,0.01,0.01);


Вопрос: как поместить Chart в Stream?

Добавлено спустя 14 часов 56 минут:
Вот решение

Код: Выделить всё

uses ....clipbrd
var
myBmp:TBitmap;
ms:TMemoryStream;
begin
     Chart.CopyToClipboardBitmap; //копируем в буфер
     myBmp:=TBitMap.Create;
     myBmp.LoadFromClipboardFormat(CF_BitMap); //читаем из буфера в bmp
     ms:=TMemoryStream.Create;
     myBmp.SaveToStream(ms);  //грузим в Stream
     ms.Seek(0, soFromBeginning);
     wSheet.WriteImage(1,1,ms,0.0,0.0,0.01,0.01); //вставляем картинку
    //1,1 - строка,колонка ячейки; 0.0,0.0 - смещение картинки отн. лев.верхн. угла ячейки;0.01,0.01 - масштаб (здесь уменьшен в 100 раз)
     ms.Free;
     myBmp.Free;                     
end;
Аватара пользователя
jonyrh
незнакомец
Сообщения: 6
Зарегистрирован: 10.09.2020 11:29:24

Сообщение jonyrh »

Может, конечно уже поздно, но я поделюсь своим способом, без использования буфера, у меня используется в потоках))

Код: Выделить всё

uses
  fpstypes, fpspreadsheet, fpsallformats, fpscell, fpsPageLayout,
  TAGraph, TASources, TASeries, TAStyles,  TALegend, TAChartUtils,
  TADrawUtils, TADrawerCanvas, FPVectorial, TADrawerFPVectorial;

...

var
 ChartSVGDocument: TvVectorialDocument;
  ChartImageStream: TMemoryStream;
  ChartImageDrawer: IChartDrawer;

begin
...
ChartImageStream:= TMemoryStream.Create;
   ChartImageStream.Position:=0;
   ChartSVGDocument:= TvVectorialDocument.Create;
   ChartSVGDocument.Width := Chart.Width;
   ChartSVGDocument.Height := Chart.Height;
   ChartSVGDocument.AddPage;
   ChartImageDrawer:= TFPVectorialDrawer.Create(ChartSVGDocument.GetCurrentPageAsVectorial);
   Chart.Draw(ChartImageDrawer, Rect(0, 0, Chart.Width, Chart.Height));
   ChartSVGDocument.WriteToStream(ChartImageStream, vfWindowsMetafileWMF);
   ChartImageStream.Position:=0;

   sheetDays.WriteImage(0, 0, ChartImageStream, 0, 0, 0.35, 0.258);

   ChartSVGDocument.Free;
...
end;

Ответить