Autor Beitrag
broch07
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 09.01.13 13:14 
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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: broch07
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: broch07
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 11.01.13 03:44 
Paradox habe ich noch nie genutzt. Aber mit Interbase geht es so:

ausblenden volle Höhe 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;

Für diesen Beitrag haben gedankt: broch07
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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.).

Für diesen Beitrag haben gedankt: broch07
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: broch07
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: broch07, Martok