Autor |
Beitrag |
broch07
Hält's aus hier
Beiträge: 1
|
Verfasst: 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.
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
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "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
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Do 10.01.13 21:03
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Fr 11.01.13 03:44
Paradox habe ich noch nie genutzt. Aber mit Interbase geht es so:
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; |
Für diesen Beitrag haben gedankt: broch07
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: broch07
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
|
|
|