Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mi 27.01.21 14:30 
Hallo zusammen,
ich bin nicht wirklich fündig geworden oder habe an falscher Stelle gesucht.
Möchte ein Richedit drucken unter Ausnutzung der Printers-Komponente (Delphi 10.1): (Seite von bis, Anzahl, etc.), (evtl. Rand einstellen und max. Zeichen pro Zeile).
Wer hat ein ausprogrammiertes Beispiel (wär mir am liebsten) oder wesentliche fertige (erprobte) Bausteine?
Es muss nicht die komplexeste Variante sein. Drucke ausschließlich in fest vorgegebener proportionaler Schriftart (ohne Bold, ohne Underline).
Wäre schön, das Wagenrad nicht neu erfinden zu müssen.
MfG hRb
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 28.01.21 09:05 
Hilft dir das weiter?

Für diesen Beitrag haben gedankt: icho2099
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: So 31.01.21 22:26 
Hallo jasocul,
zunächst Danke für Deine Meldung (das Forum scheint durch Corona abgestorben zu sein).
Ähnliche Druck-Codefragmente habe ich früher schon gefunden, d.h. prinzipiell Drucken kann ich schon. Suche Routinen zum Prüfen u.a.
- wieviel Textzeilen passen ins Druckfeld
- überschreitet eine Richedit.Lines[i] (Textzeile) die Druckfeldbreite (Zeile zu lang? -> Umbruch),
alles unter Beachtung der Schriftgröße.
Weiterhin:
- muss man alle Seiten intern aufbereiten, wenn z.B. nur Seite 20 gedruckt werden soll?
- mit/ohne Textattribut drucken (color, bold, underline)

Vielleicht kommen ja noch einige Hinweise
hRb
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 01.02.21 09:02 
Moin hRb,

du willst also im Prinzip wysiwyg erreichen.
Ich habe mal vor einem ähnlichen Problem gestanden und Fastreport dafür missbraucht. Dort habe ich ein RichEdit für Fastreport genutzt. Dort die Breite angeglichen und dann den Text dorthin übertragen. Das war insgesamt noch etwas komplizierter, weil es um 8 RichEdits ging und noch einiges andere dort gemacht werden musste, aber eigentlich hat das ganz gut funktioniert. Das Einizge Problem war die saubere Anpassung der Breite, da in seltenen Fällen ein Pixel schon zu einem anderen Umruch führen konnte.

Bei deiner Variante habe ich da keine weiteren Tipps.

Das Forum ist nicht durch Corona ausgestorben. Es wird schon länger immer etwas weniger hier. Was ich allerdings sehr bedaure. Aber in der Regel bekommt man hier immer noch brauchbare Antworten.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Fr 12.02.21 18:11 
Hallo zusammen,
nachdem "fertige Lösungen" wohl nicht mehr zu erwarten waren, habe ich mich selbst bemüht und "das Rad neu erfunden". Nun, nicht ganz! Immerhin habe ich eine sehr brauchbare Routine zum Drucken gefunden [flocke.vssd.de/prog/tips/pascal/prtred/], sie angepasst und bin schon recht zufrieden. Bevor ich die Lösung der "Öffentlichkeit" vorstelle, gibt es noch kleine Wünsche, die sinnvoll wären mit einzuarbeiten.

Vielleicht sage ich zunächst, was schon alles funktioniert:
Unter Nutzung der Komponenten TPageSetuoDialog und TPrintdialog kann ich drucken unter Beachtung von:
- Papiergröße einstellen, Blattränder einstellen, Hoch-Querformat beachten
- Drucker auswählen, Druckbereich festlegen (Alles, Seite von..bis, oder nur markierten Text drucken)
Damit habe ich das "wichtige" Ziel erst einmal errreicht. So weit so gut. Nun soll es kleine Erweiterungen geben:

1. PageNumber am Blattende: Was einfach aussieht funktioniert im Hinblick auf die Positionierung des Textes bei mir nur bedingt. Die Seitennummer drucke ich mit
ausblenden Delphi-Quelltext
1:
 Printer.Canvas.TextOut(vSeiteXPos, vSeiteYPos, 'Seite '+ IntToStr(Printer.Pagenumber));					

Da die X,Y-Koordinaten sich in Abhängigkeit von Blattgröße und Hochkant/Querformat ändern, ermittle ich diese mit:
ausblenden Delphi-Quelltext
1:
2:
 vSeiteXPos := PageSetupDialog1.PageWidth  div 20) ;       // Blattnmitte (2100/2 =1050)
 vSeiteYPos := PageSetupDialog1.PageHeight div 10) -100 ;  // Blatthöhe - 1 cm (2970-100 =2870)

(Ergebnisse bei DIN A4 Hochkant). Tatsächlich druckt der Canvas-Befehl die Seitennummer aber nicht Blatt-mittig und an der Y-Koordinate etwa 4 cm über Blattende, also mitten in den Text (siehe Anlage). Mein Druckauftrag sieht verkürzt wie folgt aus;
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
  with PrintDialog1 do begin
    h := RichEdit1.Handle;
    Printer.BeginDoc;
    case ...
      prAllPages:  // Alle Seiten (gesamtes Dokument) Drucken
        begin
         pp:=-1;      // StartPos
         vEndPos := length(Richedit1.Text) - (Richedit1.Lines.Count-1); // #0A#0D abziehen
         if length(Richedit1.Text)>0 then
           begin
             repeat  //Drucken Text + Seitennummer
               pp := PrintRichEditIntoRect(h, Rect(vRandLi, vRandOb, vRandRe, vRandUnt), false, -PageRect_MM, pp);
               Printer.Canvas.TextOut(vSeiteXPos, vSeiteYPos, 'Seite '+ IntToStr(Printer.Pagenumber));
               if pp<vEndpos then
                 Printer.NewPage;
             until (pp>=vEndpos);
           end;
        end
      end;  //Case-End
    Printer.EndDoc;
  end

Frage1: Warum ist Canvasfenster nicht an gewünschter Position?
Mir fällt auf, dass die Canvas-Schriftgröße von der Richedit-Schrift abweicht (ist nicht schlimm). Könnte dies etwas damit zu tun haben? (eigentlich nicht, denn das Fenster wird durch X,Y festgelegt). Was ist falsch?

2. Eine weitere Verbesserung hätte ich gerne beim Printdialog. Diesen kann man nur mit OK oder Abbruch bedienen. Bei Ok geht man davon aus, dass damit auch der Druckvorgang ausgelöst wird. Ich möchte jedoch, dass auch Druckerauswahl, Druckbereichsauswahl oder Seitenanzahl eingestellt werden können ohne sofort bei Ok zu drucken. Für den Druckauftarg soll es gezielt einen weiteren "Drucken-Butttom" geben (wie z.B. bei Word oder Excel).
Frage: Gibt es in Delphi einen neueren (verbesserten) Druckdialog den ich noch nicht kenne?

Hintergrund: Zum Testen benutze ich keinen Papierdrucker, sondern verwende einen Pdf-Drucker. Beim Start des Programms ist jedoch der Systemdrucker eingestellt. Ich kann also die Voreinstellungen (für den Schnelldruck) nicht einstellen, ohne vorab einen Druck ausgelöst zu haben (es sei denn, Ok löst den Druck nicht aus. Dann brauche ich jedoch einen weiteren Druckbutton an anderer Stelle.

Wer kann helfen?
hRb


Zuletzt bearbeitet von hRb am So 14.02.21 10:49, insgesamt 2-mal bearbeitet
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Sa 13.02.21 12:16 
Sorry, hatte Anhang vergessen (Output1.pdf)
#hRb
Einloggen, um Attachments anzusehen!
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 25.02.21 01:04 
Hallo Mastermanager: Was ist los? Wollte zip-datei mit 2,7 Mb anhängen. Es kommt dicke rote Meldung, dass Dateianhang zu groß sei und nur 5 MB möglich sind. Meine Freude etwas weiterzugeben ist getrübt. Erbitte Hilfe damit ich Anhang hochladen kann.

Guten Abend,
als Hobby-Programmierer war ich immer dankbar für lauffähigen Code, denn manche gut gemeinten Ratschläge überforderten mich. So möchte ich heute wieder mit gutem Beispiel vorangehen und füge im Anhang ein "fertiges" Programm bei, das Text aus Richedit druckt. Einstellbar sind:
- der Drucker
- das Seitenformat
- die Ränder
- der Druckbereich: alles, von bis, Markierter Bereich
- am Blattende wird die Seitennummer gedruckt (nicht optional)
Leider habe ich zu letztgenanntem Punkt, auf meine Frage, warum die Canvas-X-Y-Koordinaten-Berechnung nicht das korrekte Ergebnis liefert, keine Antwort erhalten. An dieser Stelle habe ich dann "getrickst und auf das Rechenergebnis je nach Hoch- oder Querformat ein Delta Y-Wert addiert. Vielleicht kommt ja auf Grund des Quellcodes noch eine Meldung.
Die Code-Quellen, die meine Basis für das Programm waren, sind ausgewiesen. Würde mich freuen, wenn das Programmbeispiel anderen Suchenden hilft.

Verbesserungsmöglichkeiten gibt es wie fast überall. Z.B. würde ich gerne den TPrintDialog von Delphi überarbeiten. Aus diesem Dialog kommt man nur mit OK oder ABBRUCH heraus. Bei Ok löst man im Allgemeinen den Druckvorgang aus. Hat man zuvor vergessen die Seitenränder einzustellen oder zu überprüfen, muss man Abbrechen ohne andere Parameter einstellen zu können. Das ist für die Quick-Druckfunktion ausgesprochen ärgerlich. Die Entwickler sollten sich ein Beispiel am Microsoft-Druckdialog nehmen. Dort lassen sich Drucker und andere Einstellungen vornehmen auch ohne den Druckvorgang zu starten.
So, nun happy day. Bleibt gesund! Oh: compiliert mit Delphi 10.3 Update 3
hRb
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 25.02.21 13:13 
Neuer Versuch mit Anhang. Habe das Programm mit Release compiliert. Vielleicht ist jetzt Datei kleiner.
hRb
Einloggen, um Attachments anzusehen!