Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Se puede copiar un grafico de delphi para powerpoint? (https://www.clubdelphi.com/foros/showthread.php?t=94676)

JoAnCa 19-05-2020 22:15:33

Se puede copiar un grafico de delphi para powerpoint?
 
Hola a todos
Pues eso, necesito saber, si se puede hacer, como copiar un grafico de mi aplicación Delphi para Powerpoint


El problema es que el usuario necesita insertar algunos gráficos que genera la aplicación, en una presentacion de powerpoint, y me pidio si era posible copiarlo directamente o de alguna otra forma

gatosoft 19-05-2020 23:49:05

¿Y quieres generar directamente el PowerPoint o solo generar los prints?

Si es lo segundo, tal vez este codigo te de una idea, para aplicarlo a lo que necesitas. el codigo guarda un canvas en un archivo PNG.

Pones un boton y un stringGrid (no es necesario llenar datos) y ejecutas el click. Miralo y si te sirve lo adaptas,


Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    SaveDialog1: TSaveDialog;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    procedure PrintCanvas(aCanvas: TCanvas; aRect: TRect);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
Uses Vcl.Imaging.pngimage;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var vRect: TRect;
    vAncho, vAlto: Integer;
begin
   vAncho:= (StringGrid1.ColCount+1) * StringGrid1.DefaultColWidth;
   if vAncho > StringGrid1.Width then
      vAncho:= StringGrid1.Width;
   vAlto:=  (StringGrid1.RowCount+1) * StringGrid1.DefaultRowHeight;
   if vAlto > StringGrid1.Height then
      vAlto:= StringGrid1.Height;
   vRect.Top:=0;
   vRect.Left:=0;
   vRect.Right:=vAncho;
   vRect.Bottom:=vAlto;
   PrintCanvas(StringGrid1.Canvas, vRect);

end;


procedure TForm1.PrintCanvas(aCanvas: TCanvas; aRect: TRect);
  var Bmp: TBitmap;
      Png: TPngImage;
begin
  if SaveDialog1.Execute then
  begin
    Bmp := TBitmap.Create;
    try
      //Bmp.SetSize(aCanvas.ClipRect.Right, aCanvas.ClipRect.Bottom);
      Bmp.SetSize(aRect.Right, aRect.Bottom);
      BitBlt(Bmp.Canvas.Handle, aRect.Top, aRect.Left, aRect.Right, aRect.Bottom, aCanvas.Handle, 0, 0, SRCCOPY);
      Png := TPngImage.Create;
      try
        Png.Assign(Bmp);
        Png.SaveToFile(SaveDialog1.FileName);
      finally
        Png.Free;
      end;
    finally
      Bmp.Free;
    end;
  end;
end;

end.

JoAnCa 20-05-2020 05:22:47

Muchas gracias gatosoft por tu respuesta, pero no me sirvio para el grafico (TDBChart), pues el procedimiento que me indicas usa la clase TCanvas y el TDBChart usa TCanvas3D, por lo que me da incompatibilidad de tipos.
Le hice algunos cambios para solucionar la incompatibilidad, pero solo me guarda un cuadro blanco.

Pero segui buscando y encontre la solución aquí

Es muy facil usando las mismas propiedades de TDBChart, explican 2 formas de hacerlo, pero me gusto mas la segunda que permite guardar en un fichero o copiarlo al portapapeles.

1
Código Delphi [-]
DBChart1.SaveToBitmapFile('c:\grafico.bmp');

2
Poner en el uses Teexport
Código Delphi [-]
procedure TformCuadroMando.bExportarClick(Sender: TObject); 
begin 
  with TTeeExportForm.Create(Self) do 
  try 
    ExportPanel := DBChart1; 
    ShowModal(); 
  finally 
    Free(); 
  end; 
end;

Tema solucionado :cool:

ElKurgan 20-05-2020 10:07:45

Gracias por compartir la solución

Un saludo


La franja horaria es GMT +2. Ahora son las 21:41:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi