Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   imprimir dbgrid y/o pantalla (https://www.clubdelphi.com/foros/showthread.php?t=74810)

sabueso1010 12-07-2011 20:53:39

imprimir dbgrid y/o pantalla
 
hola foro, 2 temas similares poro eso lo pongo en el mismo hilo
1.- quiero imprimir el contenido de la pantalla lo hago asi
forma1.print;
y si la pero solo parcialmente le falta un pedazo a la derecha
hay alguna forma de imprimir el contenido de un form completo
o de exportarlo a un archivo grafico como Jpg o Bmp ?
2. quiero imprimir el contenido completo de un dbgrid o un jvdbgrid
aqui si no tengo ni idea de como hacerlo , se me ocurre como hacerlo
manualmente con un ciclo , campo por campo, pero pues estando en
pleno 2012 en la era de la programacion por objetos, jajjaja pues
quisiera saber si alguien sabe de algun componente que imprima
el contenido del dbgrid o algun metodo mas breve que un cliclo ?

saludos a todos. !!!!

x_aguilarf 12-07-2011 23:39:02

A la primera pregunta, un solución seria modificar la función PaintTo del TWinControl para que al dibujar no limite al tamaño del control y utilizar esta función para dibujar en un TBitmap y finalmente imprimirlo.

Esto seria un ejemplo:

Código Delphi [-]

...

implementation

uses
  Math;

type
  TWC = class(TWinControl) end;

function GetPaintAllBmp(AControl: TWinControl): TBitmap;

  procedure PaintAllTo(AControl: TWinControl; DC: HDC; X, Y: Integer);

    procedure DrawThemeEdge(DC: HDC; var DrawRect: TRect);
    var
      Details: TThemedElementDetails;
      Save: Integer;
    begin
      Save := SaveDC(DC);
      try
        with DrawRect do
          ExcludeClipRect(DC, Left + 2, Top + 2, Right - 2, Bottom - 2);
        Details := ThemeServices.GetElementDetails(teEditTextNormal);
        ThemeServices.DrawElement(DC, Details, DrawRect);
      finally
        RestoreDC(DC, Save);
      end;
      InflateRect(DrawRect, -2, -2);
    end;

  var
    w, h: Integer;
    I, EdgeFlags, BorderFlags, SaveIndex: Integer;
    R: TRect;
  begin

    w := AControl.ClientWidth;
    h := AControl.ClientHeight;

    for I := 0 to AControl.ControlCount - 1 do
    begin
      w := Max(w, AControl.Controls[i].Left + AControl.Controls[i].Width);
      h := Max(h, AControl.Controls[i].Top + AControl.Controls[i].Height);
    end;

    SaveIndex := SaveDC(DC);
    try
      MoveWindowOrg(DC, X, Y);
      IntersectClipRect(DC, 0, 0, w, h);
      BorderFlags := 0;
      EdgeFlags := 0;
      if GetWindowLong(AControl.Handle, GWL_EXSTYLE) and WS_EX_CLIENTEDGE <> 0 then
      begin
        EdgeFlags := EDGE_SUNKEN;
        BorderFlags := BF_RECT or BF_ADJUST
      end else
      if GetWindowLong(AControl.Handle, GWL_STYLE) and WS_BORDER <> 0 then
      begin
        EdgeFlags := BDR_OUTER;
        BorderFlags := BF_RECT or BF_ADJUST or BF_MONO;
      end;
      if (EdgeFlags = EDGE_SUNKEN) and ThemeServices.ThemesEnabled and
        not ((csDesigning in AControl.ComponentState) and UnthemedDesigner(AControl)) then
      begin
        SetRect(R, 0, 0, w, h);
        if csNeedsBorderPaint in AControl.ControlStyle then
          DrawThemeEdge(DC, R)
        else
        begin
          AControl.ControlStyle := AControl.ControlStyle + [csNeedsBorderPaint];
          AControl.ControlStyle := AControl.ControlStyle - [csNeedsBorderPaint];
        end;
        MoveWindowOrg(DC, R.Left, R.Top);
        IntersectClipRect(DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top);
      end
      else if BorderFlags <> 0 then
      begin
        SetRect(R, 0, 0, w, h);
        MoveWindowOrg(DC, R.Left, R.Top);
        IntersectClipRect(DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top);
      end;

      AControl.Perform(WM_PAINT, DC, 0);
      for I := 0 to AControl.ControlCount - 1 do
        if AControl.Controls[i] is TWinControl then
          with AControl.Controls[i] do
            if Visible then
              PaintAllTo(AControl.Controls[i] as TWinControl, DC, Left, Top);
    finally
      RestoreDC(DC, SaveIndex);
    end;

  end;
var
  I: Integer;
  w,h: Integer;
begin

  w := AControl.ClientWidth;
  h := AControl.ClientHeight;

  for I := 0 to AControl.ControlCount - 1 do
  begin
    w := Max(w, AControl.Controls[i].Left + AControl.Controls[i].Width);
    h := Max(h, AControl.Controls[i].Top + AControl.Controls[i].Height);
  end;

  Result := TBitmap.Create;
  Result.Canvas.Brush.Color := TWC(AControl).Color;
  Result.SetSize(w, h);
  Result.Canvas.Lock;
  try
    PaintAllTo(AControl, Result.Canvas.Handle, 0, 0);
  finally
    Result.Canvas.Unlock;
  end;

end;

...

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Ejemplo de utilización. (En este caso no hace falta destruir el resultado ya que la propiedad Picture de la imagen ya se ocupará de eso.)
  Image1.Picture.Assign(GetPaintAllBmp(Self));
end;

La función GetPaintAllBmp devuelve un Bitmap con todos los controles dibujados sin importar el tamaño del control principal.


A la segunda pregunta, dibujar el componente DBGrid entero es un problema diferente, ya que este componente no contiene subcomponentes sino que las filas son dibujadas, y solo unas filas son visibles dependiendo de la posición del scroll. A falta de otra solución, yo haría lo que tu mismo has comentado, de manera manual, campo a campo. :(

Saludos

sabueso1010 13-07-2011 01:36:44

gracias funciono bien
 
gracias por el apoyo, funciono de maravilla

creo que despues de todo, los ciclos y rutinas seguiran siendo parte
de mi vida, jajajaja, pero es bueno para no perder la costumbre pues
actualmente yo ya quiero un componente hecho para X funcion
y como que a los programadores nos facilita en tiempo pero nos atrofia el ingenio para desarollar, saludos.


La franja horaria es GMT +2. Ahora son las 23:10:07.

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