Binde eben "Printers" ein, habs ja oben schon genannt, nur dann im letzten Post falsch geschrieben.
Druckbare Version
Schon besser, jetzt liegt der Fehler aber im geposteten Code bei Printer (unknown directive).
http://npshare.de/files/35/8589/Delp...%20Example.rar
So, hier mal ein Beispiel inc. source und binary.
Danke! Später kommen vielleicht nochmal Fragen auf, im Moment klappt es aber. Wo finde ich eigentlich PrinterDialog und FontDialog in Delphi?
Edit: Wie kann ich jetzt den Text einer weiteren Memo zum Druckvorgang hinzufügen? Benötigt man eine neue Variable?
So? Wofür wird denn eigentlich die Variable I eingesetzt?Code:begin
Printer.Canvas.TextOut(500, 1000 + I *
(Printer.Canvas.TextHeight('I') + 5), memText1.Lines[I], memText2-Lines[I]);
end;
I steht immer für die aktuelle Zeile (beginnend bei 0) in meinem Code. Um auszurechnen wohin de Text kommen muss ist die Formel I*(ZeilenHöhe + 5), damit sich der Text nicht überschneidet. Die +5 ist nur damit die Zeilen nicht so aneinander kleben.
Dein Code ist übrigens schwachsinn. Probiere es mal lieber so:
Code:procedure TfrmMain.btnPrintClick(Sender: TObject);
var
I, J: Integer;
begin
if PrintDialog.Execute then
begin
try
Printer.Copies := printDialog.Copies;
Printer.Title := 'Document';
Printer.BeginDoc;
// Setze Schriftart
Printer.Canvas.Font := FontDialog.Font;
// Zeilenweißes drucken
for I := 0 to memText.Lines.Count - 1 do
begin
Printer.Canvas.TextOut(500, 500 + I *
(Printer.Canvas.TextHeight('I') + 5), memText.Lines[I]);
end;
for J := 0 to memText2.Lines.Count - 1 do
begin
Printer.Canvas.TextOut(500, 500 + J * (Printer.Canvas.TextHeight('I') + 5) + I * (Printer.Canvas.TextHeight('I') + 5),
(Printer.Canvas.TextHeight('I') + 5), memText2.Lines[J]);
end;
// Und drucken:
Printer.EndDoc;
except
MessageDlg('Error while printing!', mtError, [mbOk], 0);
end;
end;
end;
Das verursacht einen Fehler:
Irgendein Problem zwischen String und Integer... Wieso tritt das bei I nicht auf?Code:(Printer.Canvas.TextHeight('I') + 5), memText2.Lines[J]);
Vielen Dank für das mit dem Drucken, habe weitere Fragen. Zuerst die totale Noobfrage: Wie kann ich den Text, der in einer Memo dem Name der Memo angepasst wird, löschen? Dann eine Frage zu den Dialogs: Es gibt ja auch einen Save Dialog. Wie baue ich den ein, um die gesamte Form und alle Informationen als Datei abzuspeichern, bzw. mit dem Open Dialog zu laden?
Wie du dem Code entnehmen kannst greift man ist der Inhalt repräsentiert durch das Objekt Lines (TStrings).
Beide, Open- und Savedialog, können mit einer If-Abfrage und ihrer Funktion Execute ausgeführt werden. Der Rückgabewert ist dann bei Beiden in der property "FileName" zu finden. Beispielsweiße:
Speichern einer kompletten Form kannst du natürlich als fertige Funktion vergessen, man kann nicht jedes Objekt einfach so in eine Datei speichern. Zu diesem Thema kannst du dir mal INI und XML ansehen. Auch typisierte Dateien ("records") lassen sich wunderbar speichern. Ist zwar ein wenig OldSchool und nur zu empfehlen wenn du sicher bist das nur (d)ein Delphi Programm die Daten jemals nutzen muss.Code:If SaveDialog.Execute then // Wenn User abgebrochen hat, dann nicht ausführen, sonst weiter
begin
SaveDialog.FileName := ChangeFileExt(SaveDialog.FileName, '.txt');
// Nur zur sicherheit ändern, sonst gibts manchmal Fehler
memText.Linex.SaveToFile(SaveDialog.FileName);
end;
An dieser Stelle moechte ich auch einfach mal auf die ausgezeichnete kontextsensitive Hilfe von Delphi verweisen. Meinerzeit habe ich ohne Handbuch, Tutorials oder Internet Delphi ausschliesslich ueber seine Hilfefunktion gelernt.
Strg + F1 auf einem bestimmten Wort im Quelltext, einer Property im Object Inspector oder einem Icon in einem der Reiter und man hat eine wunderbare Hilfe mit Erklaehrung der funktionalitaet, aller Eigenschaften und Methoden und teilweise sogar Beispielquelltexte.