Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponente für PrintPreview, Printing und Export (https://www.delphipraxis.net/138890-komponente-fuer-printpreview-printing-und-export.html)

Alphacodex 19. Aug 2009 11:49


Komponente für PrintPreview, Printing und Export
 
Hallo,

ich hab mich jetzt schon 2 Stunden durchs Netz gegoogelt und bin leider etwas überfahren von den vielen hundert kostenlosen oder kostenpflichtigen Komponenten, die es auf dem Gebiet gibt...


Vielleicht kann mir jemand ein, zwei Tipps zu Komponenten geben, mit der er/sie gute Erfahrungen gemacht haben.


Folgendes brauche ich:
Im Grunde will ich verschiedene Reporting Aufgaben für meine Datenbankanwendung programmieren. Der User soll den Report dann schon vom Programm aus anschauen und ausdrucken können. Nativer PDF-Export wäre natürlich sehr fein, aber das würde ich notfalls auch irgendwie anders machen. Fertige Reporting Lösungen (wie Rave oder so) will ich eher nicht verwenden, da ich gerne alles voll unter Delphi-Steuerung hätte (ich muss ein paar komplizierte Überprüfungen und Verrechnungen in die Reports einbauen und würde das gerne in der Delphi-Programmiersprache lösen).

Ich habe an irgendein TCanvas-Derivat gedacht, auf das ich alles draufschreiben kann, dass der User dann anschauen und darauf herumzoomen kann und schließlich ausdrucken oder exportieren - und das mit möglichst wenig zusätzlichem Programmieraufwand. Gibts da was passendes? Freeware wäre bevorzugt, aber ich bin auch bereit ein paar Euro zu investieren, wenn der Mehrwert es gerechtfertig.


Vielen Dank
Codex




P.S. Ich benutzte Delphi 2009, manche Komponenten sollen da ja Probleme machen, oder?

mkinzler 19. Aug 2009 11:52

Re: Komponente für PrintPreview, Printing und Export
 
Ich würde zu FreeReport/FastReport raten. Da ist Scripting in PascalScript möglich

Alphacodex 19. Aug 2009 12:11

Re: Komponente für PrintPreview, Printing und Export
 
Scheint ne ganz gute und preiswerte Reporting-Lösung zu sein...

Aber genau das wollte ich ja nicht. Ich möchte die Daten selbst aus der Datenbank lesen, innerhalb von Delphi verarbeiten und erst dann an eine Komponente zur Ausgabe, Ausdrukc und Export übergeben.
Über den Datenverarbeitungsprozess möchte ich die volle Kontrolle behalten - ich hab nur keine Lust auch noch Preview, Zoom, Pan und Export Codex selbst zu schreiben, das soll ruhig ne geeignete Komponente übernehmen...


Gibts da sonst was?
Grüße
Codex

DeddyH 19. Aug 2009 12:14

Re: Komponente für PrintPreview, Printing und Export
 
Meinst Du sowas? http://www.delphiarea.com/products/d...nents/preview/

mkinzler 19. Aug 2009 12:20

Re: Komponente für PrintPreview, Printing und Export
 
Auch für das wäre FastReport geeignet, denn du kannst die Daten auch als virtuelles DataSet oder Wertemengen bereitstellen oder Virtual Print Engine Community Edition

Alphacodex 19. Aug 2009 13:06

Re: Komponente für PrintPreview, Printing und Export
 
Ah... Danke!!!

VPE ist genau was ich gesucht habe und es gibt sogar eine kostenlose Community-Edition, die kostenlos ist (wobei ich nicht verstanden habe, ob die irgendwelche Einschränkungen hat...)


PrintPreview wäre auch gegangen, aber die VPE ist von dem was ich gelesen habe noch besser geeignet!!


Vielen Dank, ich werd mir das mal installieren und genauer anschauen...
Codex

webcss 19. Aug 2009 13:11

Re: Komponente für PrintPreview, Printing und Export
 
Zitat:

Zitat von Alphacodex
...eine kostenlose Community-Edition, die kostenlos ist...

muss dann wohl so sein! 8)
Zitat:

Zitat von Alphacodex
(wobei ich nicht verstanden habe, ob die irgendwelche Einschränkungen hat...)

Wird halt eher schleppend gepflegt, d.h. sie hinkt der Kaufversion etwas hinterher..

mquadrat 19. Aug 2009 14:03

Re: Komponente für PrintPreview, Printing und Export
 
Interne Verarbeitung ließe sich auch mit Rave machen, da du dort ebenfalls ein DataSet direkt aus der Anwendung an Rave schicken kannst.

Sicher lässt sich das alles auch selbst programmieren. Aber inkl. eines bedienbaren Designers dürfte da einiges an Zeit drauf gehen.

Roter Kasten: Poste es trotzdem der Vollständigkeit halber

Mackhack 20. Aug 2009 07:04

Re: Komponente für PrintPreview, Printing und Export
 
Hier noch was Handgeschriebenes aus 10 Jahren,...

Delphi-Quellcode:
unit Unit1;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs,printers, ExtCtrls, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    PrinterSetupDialog1: TPrinterSetupDialog;
    SpeedButton2: TSpeedButton;
    Shape1: TShape;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormPaint(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  blatt : TCanvas;
  dc : HDC;
  druckbreite,druckhoehe: integer;
  panelx : TWinControl;
  MMproPixelY,
  MMproPixelX          : single;

implementation

{$R *.DFM}

procedure DC_TextOut(c:TCanvas;x,y,winkel,groesse:integer;txt:PChar);
var
  hfont, fontold : integer;
  dc            : hdc;
  fontname      : string;
begin
  dc := c.handle;
  fontname := c.font.name + #0;
  hfont  := CreateFont(groesse,0,winkel*10,0,fw_normal,0,0,0,1,out_tt_precis,$10,2,4,@fontname[1]);
  fontold := SelectObject(dc,hfont);
  c.TextOut(x,y,txt);
  SelectObject(dc, fontold);
  DeleteObject(hfont);
end;

procedure blattanpassen;
var
  prnxy, formxy        : single;
  dx,dy,x,y            : integer;
  blattbreite,
  blatthoehe           : integer;
  scale                : single;
  xofs,yofs            : single;
begin
  MMproPixelX := 25.4 / GetdeviceCaps(printer.handle,LOGPIXELSX) ;
  MMproPixelY := 25.4 / GetdeviceCaps(printer.handle,LOGPIXELSY) ;

  blattbreite := Round(GetdeviceCaps(printer.handle,PHYSICALWIDTH) * MMproPixelX);
  blatthoehe := Round(GetdeviceCaps(printer.handle,PHYSICALHEIGHT) * MMproPixelY);

  xofs := Round(GetdeviceCaps(printer.handle,PHYSICALOFFSETX)*MMproPixelX);
  yofs := Round(GetdeviceCaps(printer.handle,PHYSICALOFFSETY)*MMproPixelY);

  druckbreite := GetDeviceCaps(printer.handle, horzsize);
  druckhoehe := GetDeviceCaps(printer.handle, vertsize);
  y := 35;
  x := 10;
  formxy := (form1.clientWidth - x) / (Form1.clientheight - y);

  prnxy := blattbreite / blatthoehe;
  If formxy < prnxy Then
  begin //Breite dominiert
    dx := form1.clientWidth - 20;
    dy := round(dx / prnxy);
    y := round((Form1.ClientHeight / 2 + 8) - (dy / 2));
  end
  else
  begin                  //Höhe dominiert
    dy := form1.clientHeight - y-10;
    dx := round(dy * prnxy);
    x := round((form1.clientWidth / 2) - (dx / 2));
  End;
  form1.shape1.setbounds(x,y,dx,dy);
  scale := dy /blatthoehe;
  panelx.setbounds(x+Round(xofs*scale),y+Round(yofs*scale),Round(druckbreite*scale),Round(druckhoehe*scale));
  SetMapMode(blatt.handle,mm_anisotropic);
  SetViewportExtEX(blatt.handle,dx,dy,nil);         // Scalierung
  SetWindowExtEX(blatt.handle,druckbreite*10,-druckhoehe*10,nil);
  Setbkmode(blatt.handle,TRANSPARENT);
  blatt.Brush.Style := bssolid;
  blatt.Brush.Color := clwhite;
  blatt.Pen.Color := clblack;
  blatt.fillrect(bounds(0,0,druckbreite*10,-druckhoehe*10));
end;

procedure ausgabe(ziel : TCanvas);
var
  i,l,n,x,y,breite,hoehe : integer;
  s : string;

begin
  with ziel do
  begin
    font.Height:=50;
    font.Name := 'Arial';
    SetTextAlign(handle,TA_CENTER+TA_TOP);
    breite := druckbreite*10;
    hoehe := druckhoehe*10;
    moveto(0,1);LineTo(breite,1);
    i := 1;
    while i <= breite do
    begin
      MoveTo(i,-1);
      if (i-1) mod 100 = 0 then
      begin
        LineTo(i,-50);
        TextOut(i,-50,intToStr(i div 100));
      end
      else LineTo(i,-30);
        inc(i,10);
    end;
    SetTextAlign(handle,TA_LEFT+TA_TOP);
    n := 200;
    i := 0;
    x := druckbreite * 5;
    y := druckhoehe * 5;
    while i < 500 do
    begin
      Dec(n,5);
      DC_textout(ziel,x, -y, i, n, '               rotierender Text');
      Inc(i,15);
    end;
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  printer.begindoc;
  SetMapMode(printer.canvas.handle,MM_LOMETRIC);
  ausgabe(printer.canvas);
  printer.enddoc
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  printersetupdialog1.execute;
  blattanpassen;
  ausgabe(blatt);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  blattanpassen;
  ausgabe(blatt);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  panelx := TWincontrol.create(self);
  panelx.parent := Form1;
  blatt := TCanvas.Create;
  blatt.handle := GetDC(panelx.handle);
  setmapmode(blatt.handle,mm_anisotropic);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  releaseDC(handle, blatt.handle);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  blattanpassen;
  ausgabe(blatt);
end;

end.

Satty67 20. Aug 2009 07:17

Re: Komponente für PrintPreview, Printing und Export
 
Witzig.. Deine "manuelle" Varianten sieht aus, wie ich es früher auch gelöst habe... incl. berechnen, wieviel Pixel pro MM und restliche Druckereigenschaften am Anfang ;)

Verwende aber für manuelle Ausgaben schon seit Jahren die TPreview Komponente, die DeddyH verlinkt hat, selbst wenn kein Preview nötig ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz