Zeichenbreite beim Textdruck unter Delphi

Guten Tag, liebe Programmierfreunde,

von Verzweiflung getrieben erbitte ich Hilfe zu folgendem, das Textdrucken unter Delphi betreffende Problem:

Die Aufgabe besteht darin, auf einem A4-Blatt wahlweise 80, 120 oder 160 Zeichen in einer Zeile unter zu bringen – natürlich in gleicher Zeichenhöhe. Wie, also bitte, erzeugt man schmalere Zeichen? (Veränderung der Zeichenbreite)

In anderen Programmiersprachen ging das, aber diese Erkenntnisse kann ich leider nicht auf Delphi übertragen.

Für die sehnsüchtig erwartete Hilfe darf ich mich schon jetzt herzlich bedanken.

Mit freundlichen Grüßen Hampini

Guten Tag, liebe Programmierfreunde,

Die Aufgabe besteht darin, auf einem A4-Blatt wahlweise 80,
120 oder 160 Zeichen in einer Zeile unter zu bringen –
natürlich in gleicher Zeichenhöhe. Wie, also bitte, erzeugt
man schmalere Zeichen? (Veränderung der Zeichenbreite)
Mit freundlichen Grüßen Hampini

Hallo Hampini,
alle Wunder dieser Welt kann Delphi auch nicht !.
Das Problem ist in Delphi nur lösbar, wenn du deinem Textobjekt über den Objektinspektor unter Fonds und Style verschieden breite Schriftarten zu ordnest.
Ich kenne keine Programmiersprache, wo man die Zeichenbreite bei gleichbleibender Zeichenhöhe selbst bestimmen kann.
Aber die verschiedenen Schriftarten beinhalten gerade eine unterschiedliche Zeichenbreite. So ist Courier breiter als Arial, weil Courier alle Zeichen (Buchstaben) in einem festen Format abbildet, während Arial das nicht macht.
Welche Schriftart so schmal ist, dass man auch 160 Zeichen in eine A4 - Zeile bekommt, weiß ich nicht (halte es für unwahrscheinlich !!!), aber da muss man den Delphi-Fonds eben ausreizen.
Viel Erfolg!

Hallo, mikehatt,

für die prompte Reaktion auf meine Frage herzlichen Dank.
In bin insofern beruhigt, dass ich ja dann auch im Netz nichts Passendes finden konnte und damit relativiert sich der Gedanke, dass ich wieder mal der Einzige bin, der was nicht weiß.
Unter der Programmiersprache „GFA“ (Windows 16 Bit) habe ich das einstellen können, aber nun will ich die ganze Chose (ein umfangreiches Datenverwaltungsprogramm) natürlich auf Delphi transferieren – sitze schon einen Monat daran.

Könnte man das Problem nicht auf nachfolgendem Wege lösen, der als angenehmes Zubrot gleichzeitig eine Druckvorschau auf dem Bildschirm liefert.(Zeichenbreite ist verstellbar!!)

Ich habe im Netz einige Zeilen gefunden, die ich für meine Belange leicht modifiziert habe; die sich für mich ergebende Frage steht im Quelltext.

procedure TForm1.Button1Click(Sender: TObject);
var
Meta: TMetafile;MetaCanvas: TMetafileCanvas;
begin
Meta := TMetafile.Create;
Meta.Width := 850; // Zeichenbreite wählbar!!!
Meta.Height:= 800;
MetaCanvas := TMetafileCanvas.Create(Meta, 0);
MetaCanvas.Font.Name := ‚Courier New‘;
MetaCanvas.Font.Size := 7;
MetaCanvas.TextOut(1, 1, ‚1234567890123456789012345678901234567890‘+
‚123456789012345678901234567890123456789E‘);
MetaCanvas.Free;

PlayEnhMetaFile(Self.Canvas.Handle,Meta.Handle,Rect(0,0,
Self.Width + Meta.Width,Self.Height+ Meta.Height));
// wie, nun, bekommt man diese, auf dem Bildschirm
// ausgegebene Zeile, AUCH auf den Drucker?
end;

Mit Dank und freundlichen Grüßen Hampini

Hallo Hampini,

Um welche Schriftart hadelt es sich denn?
Bei Proportionalschirft (zB Arial) sieht es ja anders aus als bei fester Schriftart(zB Courier).
Wie sieht die Lösung denn in anderen Programmiersprachen aus??

Hallo Hampini, es gibt zu viel Wege die nach Rom führen!
Delphi stellt für die Druckausgabe ein T-Printer-Objekttyp zur Verfügung.
Für das Ausdrucken muss im Projekt eine unit printers angelegt werden.
Diese ist in die uses-Liste der Form-Unit aufzunehmen.
Das Objekt hat viele Eigenschaften, u.a.
· Canvas mit den bekannten untergeordneten Eigenschaften wie Brush, Pen und Font
· Orientation (vertikale oder horizontale Seite)
· PrinterIndex = -1 für Standarddrucker
Ich kann hier nicht alle aufführen!

Die unit sieht dann grob so aus:
uses printers;

printer.BeginDoc; //neue Seite
printer.Canvas.TextOut (X;Y, ‘string’) //analog zur Bildschirmausgabe
// ggf. weitere solche Befehle mit anderen X,Y – Koordinaten für die Zeilen

printer.EndDoc; //Schließen der Ausgabe , unbedingt erforderlich, sonst wird der
// Druckauftrag nicht an den Druckertreiber übergeben, der die
//eigentliche Arbeit macht !

Ich bevorzuge die Ausgabe in eine log-Datei
procedure logschreiben;
var
i : Integer ;
f: textfile;
s: string;
begin
assignfile(f,‚C:/logdatei.log‘); // Die Datei wird selbständig angelegt, Name und
// Laufwerk natürlich nach eigenem Ermessen
rewrite(f);

writeln(f,‚s‘);
end;

Mehr Informationen sind wegen des Platzmangels nicht unterzubringen