Entwickler-Ecke

Datenbanken - Delphi 7 Datenbankfelder ausdrucken von Paradox 7


broch07 - Mi 09.01.13 13:14
Titel: Delphi 7 Datenbankfelder ausdrucken von Paradox 7
Ich habe folgendes Problem, wo ich jetzt schon seit 1 1/2 Wochen erfolglos programmiere.
Ich habe ein Adressprogramm mit der Datenbank Paradox 7 erstellt. Die Adresseneingabe, Adressenbearbeitung, Adressen suchen funktioniert bestens. Nun möchte ich über einen Button einen Druckbefehl senden, so das meine gespeicherten Datenbankfelder ausgedruckt werden. Als Druckkomponente habe Printdialog ins Formular eingefügt.
Angenommen ich möchte über eine For Schleife von meinen Datensätzen die Felder Vorname, Nachname und Ort Ausdrucken, ich finde in den entsprechenden Foren sehr wenig Infos über das Drucken von Datenbanken.

Den Text // Textausgabe als Testversuch!!!! // kann ich einwandfrei ausdrucken. Ich bekomme die Syntax für den Datenbankdruck nicht hin.
Die Datenbank heißt Adressen.db über TTable

Hier einmal der Teil Quelltext für den Druckbefehl.

Wenn sich jemand bereitfinden würde, mir da eine Hilfestellung zu geben dann sage ich im Vorfeld schon mal Dankeschön.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2, Printers, ComCtrls, DBCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    PrintDialog1: TPrintDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close;            { Programm beenden }
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Show;      { nächstes Formular aufrufen }
end;

procedure TForm1.Button3Click(Sender: TObject);     { Button für das Drucken }

begin

     Printer.Title := 'Adressen Druck ';         { Titel des Druckauftrages }
     Printer.BeginDoc;                           { Start des Druckauftrages }
    { Printer.NewPage;                           { Neue Seite Drucken }
     Printer.Canvas;                             { Ansteuerung von Canvas }
     Printer.Canvas.Font.Name:='Verdana';        { Einstellung der Schriftart }

     Printer.Canvas.TextOut(200,300,'Textausgabe als Testversuch!!!!');                     { Der Txtausdruck funktioniert }

     Printer.EndDoc;        { Druckauftrag beenden }
  

end;

end.


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


WasWeißDennIch - Mi 09.01.13 14:24

Drucken mit Delphi ist ein weites Feld. Ich würde Dir raten, eine der unzähligen Report-Engines zu verwenden, die sind auf so etwas spezialisiert und optimiert. Eigentlich müsste im Lieferumfang Deines Delphi eine solche vorhanden sein, sei es QuickReport oder Rave. Für relativ kleines Geld könntest Du Dir auch FastReport in der kleinsten Edition zulegen, nach oben gibt es preislich kaum Grenzen.


Martok - Do 10.01.13 14:48

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Sei es QuickReport oder Rave.
Bei D7 wäre das Rave, die will man aber nicht wirklich.
Dann lieber FreeReport (der offene FastReport-Ableger). Ist zwar etwas holprig am Anfang, kann aber (wenn man etwas Erfahrung hat) auch alles.

Der Ablauf ist dann nur noch: Abfrage/Dataset bauen, mit Reportgenerator verlinken, Report zusammenklicken, ausgeben lassen, fertig.


WasWeißDennIch - Do 10.01.13 20:07

Mit Rave habe ich nie gearbeitet, aber fast jede ReportEngine dürfte besser sein als Selbstversuchen, oder? ;)


Gerd Kayser - Do 10.01.13 21:03

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
fast jede ReportEngine dürfte besser sein als Selbstversuchen, oder? ;)

Nein. Ohne "Selbstversuchen" lernt man nichts. Und Drucken mit Delphi ist kein Hexenwerk. ;-)


Gerd Kayser - Fr 11.01.13 03:44

Paradox habe ich noch nie genutzt. Aber mit Interbase geht es so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
procedure TMainForm.Button1Click(Sender: TObject);    // Drucken mit IBQuery
var
  CanvasDC        : HDC;
  WinSize         : TSize;
  VptSize         : TSize;
  DatensatzAnzahl : integer;
  Vorname         : string;
  Nachname        : string;
  PosLinks        : integer;
  PosOben         : integer;
  UntererRand     : integer;
begin
  with Datenmodul.IBQuery do
    begin
      SQL.Clear;
      SQL.Add('select count(*) from TabAdressen;    ');
      Open;
        DatensatzAnzahl := Fields[0].AsInteger;
      Close;
    end;

  if DatensatzAnzahl > 0 then
    begin
      Printer.Title := 'Adressendruck';
      Printer.Orientation := poPortrait;         // Hochformat

      Printer.BeginDoc;

        PosLinks := 250;                         // linker Rand = 2,5 cm
        PosOben  := 250;                         // Abstand zum oberen Rand
        UntererRand := 2400;

        CanvasDC := Printer.Canvas.Handle;

        SetMapMode(CanvasDC, mm_lometric);       // Auflösung 0,1 mm
        GetWindowExtEx(CanvasDC, WinSize);       // Auflösung ermitteln
        GetViewportExtEx(CanvasDC, VptSize);

        // unten links liegenden Nullpunkt nach oben links verschieben

        SetMapMode(CanvasDC, mm_anisotropic);
        SetWindowExtEx(CanvasDC, WinSize.CX, WinSize.CY, nil);
        SetViewportExtEx(CanvasDC, VptSize.CX, - VptSize.CY, nil);

        SetBkMode(CanvasDC, transparent);

        Printer.Canvas.Font.Color := clBlack;
        Printer.Canvas.Font.Size := 10;
        Printer.Canvas.Font.Style := [fsUnderline];
        Printer.Canvas.Font.Name := 'Courier Mew';

        // Überschriften

        Printer.Canvas.TextOut(PosLinks, PosOben, 'Vorname:');
        Printer.Canvas.TextOut(PosLinks + 600, PosOben, 'Nachname:');

        Printer.Canvas.Font.Style := [];

        PosOben := PosOben + 125;        // Zeilenvorschub

        with Datenmodul.IBQuery do
          begin
            SQL.Clear;
            SQL.Add('select Vorname, Nachname from TabAdressen;    ');
            Open;
              while not EOF do
                begin
                  Vorname := Fields[0].AsString;
                  Nachname := Fields[1].AsString;
                  Printer.Canvas.TextOut(PosLinks, PosOben, Vorname);
                  Printer.Canvas.TextOut(PosLinks + 600, PosOben, Nachname);
                  PosOben := PosOben + 50;
                  if PosOben > UntererRand then    // Seitenwechsel
                    begin
                      PosOben := 250;
                      // hier ggf. eine Seitenzahl ausdrucken
                      Printer.NewPage;
                      // hier ggf. neuen Seitenkopf erstellen
                    end;
                  Next;
                end;
            Close;
          end;

      Printer.EndDoc;
    end;
end;

procedure TMainForm.Button2Click(Sender: TObject);   // Drucken mit IBTable
var
  CanvasDC        : HDC;
  WinSize         : TSize;
  VptSize         : TSize;
  DatensatzAnzahl : integer;
  Vorname         : string;
  Nachname        : string;
  PosLinks        : integer;
  PosOben         : integer;
  UntererRand     : integer;
begin
  DatensatzAnzahl := DatenModul.IBTable.RecordCount;

  if DatensatzAnzahl > 0 then
    begin
      Printer.Title := 'Adressendruck';
      Printer.Orientation := poPortrait;         // Hochformat

      Printer.BeginDoc;

        PosLinks := 250;                         // linker Rand = 2,5 cm
        PosOben  := 250;                         // Abstand zum oberen Rand
        UntererRand := 2400;

        CanvasDC := Printer.Canvas.Handle;

        SetMapMode(CanvasDC, mm_lometric);       // Auflösung 0,1 mm
        GetWindowExtEx(CanvasDC, WinSize);       // Auflösung ermitteln
        GetViewportExtEx(CanvasDC, VptSize);

        // unten links liegenden Nullpunkt nach oben links verschieben

        SetMapMode(CanvasDC, mm_anisotropic);
        SetWindowExtEx(CanvasDC, WinSize.CX, WinSize.CY, nil);
        SetViewportExtEx(CanvasDC, VptSize.CX, - VptSize.CY, nil);

        SetBkMode(CanvasDC, transparent);

        Printer.Canvas.Font.Color := clBlack;
        Printer.Canvas.Font.Size := 10;
        Printer.Canvas.Font.Style := [fsUnderline];
        Printer.Canvas.Font.Name := 'Courier Mew';

        // Überschriften

        Printer.Canvas.TextOut(PosLinks, PosOben, 'Vorname:');
        Printer.Canvas.TextOut(PosLinks + 600, PosOben, 'Nachname:');

        Printer.Canvas.Font.Style := [];

        PosOben := PosOben + 125;        // Zeilenvorschub

        with DatenModul.IBTable do
          begin                          // 1. Datensatz
            First;
            while not EOF do
              begin                      // Fields[0] enthält hier IndexNr.
                Vorname := Fields[1].AsString;
                Nachname := Fields[2].AsString;
                Printer.Canvas.TextOut(PosLinks, PosOben, Vorname);
                Printer.Canvas.TextOut(PosLinks + 600, PosOben, Nachname);
                PosOben := PosOben + 50;
                if PosOben > UntererRand then    // Seitenwechsel
                  begin
                    PosOben := 250;
                    // hier ggf. eine Seitenzahl ausdrucken
                    Printer.NewPage;
                    // hier ggf. neuen Seitenkopf erstellen
                  end;
                Next;
              end;
          end;

      Printer.EndDoc;
    end;
end;


WasWeißDennIch - Fr 11.01.13 10:02

Wie man in Millimetern drucken kann, wusste ich bereits. Aber mit einer ReportEngine ist Dein Code ja wohl nicht zu messen, da fehlt so einiges, was die Dinger eben so komfortabel und flexibel macht (unterschiedliche Papiergrößen, Positionierung zur Designtime, Drucken bestimmter Dinge nur auf der ersten Seite, etc. pp.).


Gerd Kayser - Fr 11.01.13 17:11

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Aber mit einer ReportEngine ist Dein Code ja wohl nicht zu messen, da fehlt so einiges, was die Dinger eben so komfortabel und flexibel macht (unterschiedliche Papiergrößen, Positionierung zur Designtime, Drucken bestimmter Dinge nur auf der ersten Seite, etc. pp.).

Der Code beantwortet aber die Frage des Fragestellers, wie man die Datenbankdaten auf Papier bekommt. Dazu braucht man keinen Reportgenerator. Dieses Grundgerüst kann er ja weiter ausbauen. Unterschiedliche Papiergrößen, Ausrichtung, Drucken bestimmter Dinge nur auf der ersten Seite, Bildchen malen (z. B. Weihnachtsmann in der Adventszeit oder einen Osterhasen im Frühjahr), Zwischensummen, Seitenzahlen usw. ist doch relativ leicht einzubauen. Mit dem Code hat der Fragesteller jedenfalls erst einmal einen Anfang. Und er lernt auch dabei.


WasWeißDennIch - Fr 11.01.13 19:58

Wenn ich so etwas schreiben wollte, das dann am Ende auch meinen eigenen bescheidenen Ansprüchen genügt, würden locker ein paar Manntage dahingehen. Prima, ich hab was gelernt, aber dabei dann jede Menge Zeit verpulvert für etwas, das andere viel besser können und bereits umgesetzt haben. Ob sich das lohnt, muss jeder für sich selbst entscheiden.