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 public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Form1.Close; end;
procedure TForm1.Button2Click(Sender: TObject); begin Form2.Show; end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Printer.Title := 'Adressen Druck '; Printer.BeginDoc; Printer.Canvas; Printer.Canvas.Font.Name:='Verdana';
Printer.Canvas.TextOut(200,300,'Textausgabe als Testversuch!!!!');
Printer.EndDoc;
end;
end. |
Moderiert von
Martok: 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
WasWeißDennIch hat folgendes geschrieben : |
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
WasWeißDennIch hat folgendes geschrieben : |
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); 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; Printer.BeginDoc;
PosLinks := 250; PosOben := 250; UntererRand := 2400;
CanvasDC := Printer.Canvas.Handle;
SetMapMode(CanvasDC, mm_lometric); GetWindowExtEx(CanvasDC, WinSize); GetViewportExtEx(CanvasDC, VptSize);
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';
Printer.Canvas.TextOut(PosLinks, PosOben, 'Vorname:'); Printer.Canvas.TextOut(PosLinks + 600, PosOben, 'Nachname:');
Printer.Canvas.Font.Style := [];
PosOben := PosOben + 125; 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 begin PosOben := 250; Printer.NewPage; end; Next; end; Close; end;
Printer.EndDoc; end; end;
procedure TMainForm.Button2Click(Sender: TObject); 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; Printer.BeginDoc;
PosLinks := 250; PosOben := 250; UntererRand := 2400;
CanvasDC := Printer.Canvas.Handle;
SetMapMode(CanvasDC, mm_lometric); GetWindowExtEx(CanvasDC, WinSize); GetViewportExtEx(CanvasDC, VptSize);
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';
Printer.Canvas.TextOut(PosLinks, PosOben, 'Vorname:'); Printer.Canvas.TextOut(PosLinks + 600, PosOben, 'Nachname:');
Printer.Canvas.Font.Style := [];
PosOben := PosOben + 125; with DatenModul.IBTable do begin First; while not EOF do begin 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 begin PosOben := 250; Printer.NewPage; 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
WasWeißDennIch hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!