Forum | | | | - Seite 1 - |
| Thomas Freier | Gefunden hatte ich von Andreas: KompilierenMarkierenSeparieren $I Profalt.inc
'################################
'Drucken mit dem Richedit-Control
'################################
DEF StartDoc(2) ! "gdi32","StartDocA"
DEF StartPage(1) ! "gdi32","StartPage"
DEF EndPage(1) ! "gdi32","EndPage"
DEF EndDoc(1) ! "gdi32","EndDoc"
DEF CreateDC(4) ! "gdi32","CreateDCA"
DEF DeleteDC(1) ! "gdi32","DeleteDC"
DEF GetDeviceCaps(2) ! "gdi32","GetDeviceCaps"
DEF PrintDlg(1) ! "comdlg32","PrintDlgA"
Declare Richedit&,RichDLL&,Ende&,Print&,Exit&,FileName$,Driver$,Printer$
Declare Horzres&,Vertres&,PixelsX&,PixelsY&,iWidthTwips&,iHeightTwips&
Declare iTextOut&,iTextLength&,DocName$
Declare PrinterDC&
Declare FormatRange#,PrintDLG#,cRect#
Declare DocInfo#
Dim FormatRange#,48
Dim DocInfo#,12
Clear DocInfo#
Dim PrintDLG#,66
Clear PrintDLG#
Dim cRect#,16
SetTrueColor 1
Window 0,0-640,480
CLS RGB(196,196,196)
Print& = CreateButton(%hwnd,"Drucken",500,40,80,24)
Exit& = CreateButton(%hwnd,"Ende",500,70,80,24)
RichEdit& = Create("RichEdit",%hwnd,"",0,2,460,430)
FileName$ = LoadFile$("Als RTF öffnen","*.RTF")
If FileName$ <> ""
RTF("LoadRTF",Richedit&,Filename$)
EndIf
DocName$ = "Profan-RTFPrinter"
Whilenot Ende&
Waitinput
If GetFocus(Exit&)
Ende& = 1
ElseIf GetFocus(Print&)
Long PrintDLG#,0 = 66
Long PrintDLG#,4 = %hwnd
Long PrintDLG#,20 = $0140'PD_RETURNDC,PD_PRINTSETUP
PrintDlg(PrintDLG#)
PrinterDC& = Long(PrintDLG#,16)
If PrinterDC&
HorzRes& = GetDeviceCaps(PrinterDC&,8)
VertRes& = GetDeviceCaps(PrinterDC&,10)
PixelsX& = GetDeviceCaps(PrinterDC&,88)
PixelsY& = GetDeviceCaps(PrinterDC&,90)
iWidthTwips& = Int((HorzRes&/PixelsX&))*1440
iHeightTwips& = Int((VertRes&/PixelsY&))*1440
Long cRect#,0 = 0
Long cRect#,4 = 0
Long cRect#,8 = iWidthTwips&
Long cRect#,12 = iHeightTwips&
Long DocInfo#,0 = 12
Long DocInfo#,4 = ADDR(Docname$)
Long FormatRange#,0 = PrinterDC&'HDC
Long FormatRange#,4 = PrinterDC&'TargetHDC
Long FormatRange#,8 = 0'linker Rand in Twips
Long FormatRange#,12 = 0'oberer Rand in Twips
Long FormatRange#,16 = iWidthTwips&'rechter Rand in Twips
Long FormatRange#,20 = iHeightTwips&'unterer Rand in Twips
Long FormatRange#,24 = 0'linker Rand in Twips
Long FormatRange#,28 = 0'oberer Rand in Twips
Long FormatRange#,32 = iWidthTwips&'rechter Rand in Twips
Long FormatRange#,36 = iHeightTwips&'unterer Rand in Twips
Long FormatRange#,40 = 0'CharRange-MIN
Long FormatRange#,44 = -1'CharRange MAX ( -1 = alles )
iTextOut& = 0
iTextLength& = SendMessage(RichEdit&, 14, 0, 0)- SendMessage(RichEdit&,186,0,0)
StartDoc(PrinterDC&,DocInfo#)
Whilenot OR(iTextOut& >= iTextLength&,itextOut& = -1)
StartPage(PrinterDC&)
Long FormatRange#,44 = -1
iTextOut& = SendMessage(RichEdit&, 1081, 1, FormatRange#)
Long FormatRange#,40 = iTextOut&
SendMessage(RichEdit&,1075,0,cRect#)
EndPage(PrinterDC&)
Wend
EndDoc(PrinterDC&)
SendMessage(RichEdit&, 1081, 1, 0)
Endif
Endif
EndWhile
Dispose FormatRange#
Dispose DocInfo#
Dispose PrintDLG#
DeleteDC(PrinterDC&)
End
Leider endet der Druck nach 3 Seiten. WordPad druckt alles. Wie geht's mit XProfan? |
| | | | |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | - Seite 3 - |
| Uwe ''Pascal'' Niemeier | Hi Thomas!
Anscheinend wird aus der FORMATRANGE-Struktur nicht nur der zu bedruckende Bereich ausgelesen, sondern nach dem Drucken auch der tatsächlich genutzte Bereich hinterlegt (oder sowas in der Art). Darum muß der betroffene Abschnitt der Struktur bei jedem Schleifendurchlauf neu bestückt werden.
SeeYou Pascal |
| | | | | |
| | | | - Seite 3 - |
| | | | | - Seite 2 - |
| Thomas Freier | Ich würde es besser finden, wenn deine Scrips, die ja sehr gut sind, auch bekannt gewordene Fehler nicht mehr hätten. Ist doch auch möglich, dass Uwes Beispiel unter bestimmten Umständen in einer Endlosschleife endet. Zur Sicherheit hat er jetzt die max. zu druckenden Seiten vorgegeben. Da ist beim Einsatz natürlich das Problem, dass sich die Seitenanzahl des Dokumentes selten ermitteln läßt. |
| | | | |
| | Uwe ''Pascal'' Niemeier | Hi Leute!
Wenn man alle Funktionen, die den Drucker direkt ansprechen (StartDoc/EndDoc, StartPage/EndPage) auskommentiert, kann man die FormatRange-Routine auch "im Leerlauf" betreiben und so vorab ermitteln, wieviele Seiten gedruckt würden .
Mit etwas Geschick kann man so sogar vor dem Drucken am Seitenanfang und / oder Seitenende zusätzliche Texte einbauen, z.B. "Ende Seite 1" "Anfang Seite2" "Seite 1 von 3" usw.
Übrigens scheint es bei meiner letzten Demo im Thread nebenan bei Dokumenten mit Bildern Abweichungen bei den eingestellten Rändern zu geben; da erfolgen teilweise Seitenumbrüche, wo keine nötig wären. Mal sehen, ob sich da noch was machen läßt.
@ Thomas: Hoffe in Kürze eine Lösung zum Bearbeitern von RTF in RTF gefunden zu haben.
SeeYou Pascal |
| | | | |
| | | Thomas Freier
Ich würde es besser...
Keine Frage, sobald ich wieder an diesem PC ... |
| | | | |
| | Thomas Freier | He Pascal, konntest du an dieser Stelle noch eine Verbesserung finden?
Übrigens scheint es bei meiner letzten Demo im Thread nebenan bei Dokumenten mit Bildern Abweichungen bei den eingestellten Rändern zu geben; da erfolgen teilweise Seitenumbrüche, wo keine nötig wären. Mal sehen, ob sich da noch was machen läßt.
Ich habe hin und her probiert und folgendes festgestellt: Wenn ich an die, z.B. Hemmelsdorf, erstellte RTF einige große Bilder (P1010404.JPG= 640x480) als groß anhänge, so ist die 1. Seite OK. Auf den Folgenden ist jeweils nur ein Bild pro Seite. Wenn ich die Bilder auf der neu erstellten Seite lösche bis auf den Text und sechsmal das Bild (P1010404.JPG) als groß einfüge, werden pro Seite 2 Bilder gedruckt. |
| | | | |
| | Uwe ''Pascal'' Niemeier | Hi Thomas!
Anscheinend wird aus der FORMATRANGE-Struktur nicht nur der zu bedruckende Bereich ausgelesen, sondern nach dem Drucken auch der tatsächlich genutzte Bereich hinterlegt (oder sowas in der Art). Darum muß der betroffene Abschnitt der Struktur bei jedem Schleifendurchlauf neu bestückt werden.
SeeYou Pascal |
| | | | |
| | Thomas Freier | He Pascal, das sieht super aus. Danke!
Mit etwas Geschick kann man so sogar vor dem Drucken am Seitenanfang und / oder Seitenende zusätzliche Texte einbauen, z.B. "Ende Seite 1" "Anfang Seite2" "Seite 1 von 3" usw.
Hast du da noch eine tolle Idee? Bisher habe ich : KompilierenMarkierenSeparieren eingesetzt. Macht beim Font noch Probleme. Mal wird der Font der 1. Zeile auf zwei Seiten verwendet und dann folgt ein anderer. Ein anderes Mal wird er auf allen Seiten verwendet. |
| | | | |
| | Uwe ''Pascal'' Niemeier | Hi Thomas!
Voraussetzung für die von mir verwendete Technik ist, daß Dokument und gedruckte Seite gleich viele Zeilen enthalten, weil die entsprechende Routine vor dem Drucken direkt ins RTF-Edit schreibt. Es darf also keine unkontrollierten Zeilenumbrüche am Rand von Dokument und/oder Seite geben. Außerdem gibt's noch Probleme wegen der Bilder.
SeeYou Pascal |
| | | | |
| | Thomas Freier | He Pascal, wo bist du auf Probleme mit Bildern gestoßen? Ich habe so an die zwanzig Beispiele, große/kleine Bilder und Textzeilen einfügen/löschen, getestet und der Druck war immer OK. Für die Seitenzahl setze ich unteren Blattrand mit 12mm und drucke die Seitenzahl in diesen Rand ohne Prüfung auf bedruckbaren Bereich und Blattausrichtung wird zwangsweise auf A4-hoch gesetzt. |
| | | | |
| | Uwe ''Pascal'' Niemeier | Hi Thomas!
Wie gesagt, meine Methode ist, vor dem eigentlichen Drucken Kopf- und/oder Fußzeilen direkt ins RTF-Edit zu schreiben. Hat für meine Zwecke bisher gut funktioniert, hat aber eben auch Nachteile bzw. ist nicht für jeden Fall anwendbar. Mal sehen, ob sich das noch ändern läßt. Werde mir deine Technik aber auch nochmal anschauen.
BTW: Diese RTF-Version [...] kann auch in Word erstellte Tabellen mit mehreren Zeilen darstellen.
SeeYou Pascal |
| | | | |
| | Thomas Freier | He Pascal, meinst du : den Typ RichEdit50W (RichEdit 4.1) ? Aus einer alten Anwendung (hier reduziert) habe ich noch: KompilierenMarkierenSeparieren' ab XProfan 8.0
Def SetEditNumeric(1) SetWindowLong(@&(1),-16, (GetWindowLong(@&(1),-16) | $2002))
Def SetWindowLong(3) !"USER32", "SetWindowLongA"
Def GetWindowLong(2) !"USER32", "GetWindowLongA"
Def GetSysColor(1) !"USER32","GetSysColor"
Declare text$,text1$,x%,h$
Declare ed1&,ed2&
Declare sed1&,sed2&,sed3&,sed4&,sed5&
Declare hed1&
Declare but&,sich&
Declare font&
SetTrueColor 1
Window 10,10 - 900,600
cls GetSysColor(15)
font&=CreateFont("Arial",16,0,0,0,0)
SetDialogFont font&
ed1&=Create("RichEdit",%hwnd,"",11,10,700,500)
ed2&=Create("RichEdit",%hwnd,"",0,00,0,0)
CreateText(%hwnd,"Spaltenbreite",760,80,100,22)
sed1&=CreateEdit(%hwnd,"200",760,110,100,22)
sed2&=CreateEdit(%hwnd,"200",760,140,100,22)
sed3&=CreateEdit(%hwnd,"200",760,170,100,22)
sed4&=CreateEdit(%hwnd,"",760,200,100,22)
sed5&=CreateEdit(%hwnd,"",760,230,100,22)
SetEditNumeric(sed1&)
SetEditNumeric(sed2&)
SetEditNumeric(sed3&)
SetEditNumeric(sed4&)
SetEditNumeric(sed5&)
CreateText(%hwnd,"Zeilenhöhe",760,300,100,22)
hed1&=CreateEdit(%hwnd,"12",760,330,100,22)
SetEditNumeric(hed1&)
but&=CreateButton(%hwnd,"Einfügen",760,360,100,24)
sich&=CreateButton(%hwnd,"Speichern",760,460,100,24)
SetFocus(ed1&)
settext Ed1&,"Bitte eine Tabellenzeile einfügen\nund für weitere Zeilen"+ \
" den Curser ans Zeilenende setzen und die Taste ENTER drücken.\n"+ \
"Die Spaltenbreite ist nachträglich nicht mehr zu verändern."+Chr$(13)+Chr$(10)
SendMessage(Ed1&,$00B1,-1,-1)
While 1
WaitInput
case %key=2:BREAK
case GetFocus(But&) AND (val(GetText$(sed1&))>0) : RTF_Zeile
If GetFocus(sich&)
Text$ = @SaveFile$("Speichern","Neu.rtf")
case Len(trim$(Text$))>0 : call(&SaveRTF,Ed1&,addr(Text$))
EndIf
wend
DeleteObject font&
End
Proc RTF_Zeile
Assign #1,"Zeile.tmp"
Rewrite #1
Print #1,"{\"+chr$(114)+"tf1\"+chr$(097)+"nsi\"+chr$(097)+"nsicpg1252\deff0\deflang1049\deflangfe1049{\"+chr$(102)+"onttbl{\"+chr$(102)+"0\"+chr$(102)+"nil\"+chr$(102)+"charset0 Arial;}}"
Print #1,"\viewkind4\uc1"
text$="\"+chr$(116)+"rowd\"+chr$(116)+"rgaph30"
x%= int(val(GetText$(sed1&))*10)
text$=text$+"\cellx"+str$(x%)
text1$="\cell"
h$= str$(int(val(GetText$(hed1&))*2))
If val(GetText$(sed2&))>0
x%= x%+int(val(GetText$(sed2&))*10)
text$=text$+"\cellx"+str$(x%)
text1$=text1$+"\cell"
EndIf
If val(GetText$(sed3&))>0
x%= x%+int(val(GetText$(sed3&))*10)
text$=text$+"\cellx"+str$(x%)
text1$=text1$+"\cell"
EndIf
If val(GetText$(sed4&))>0
x%= x%+int(val(GetText$(sed4&))*10)
text$=text$+"\cellx"+str$(x%)
text1$=text1$+"\cell"
EndIf
If val(GetText$(sed5&))>0
x%= x%+int(val(GetText$(sed5&))*10)
text$=text$+"\cellx"+str$(x%)
text1$=text1$+"\cell"
EndIf
Print #1,text$+"\pard\intbl\lang1031\"+chr$(102)+"s"+h$+text1$+"\"+chr$(114)+"ow"
Print #1,"\par}"
Close #1
Rtf("LoadRTF",ed2&,"Zeile.tmp")
SetFocus(ed2&)
sendmessage(ed2&,$00B1,0,-1)
Sendmessage(ed2&,$301,0,0)
Sendmessage(ed1&,$302,0,0)
SetFocus(ed1&)
EndProc
Aber leider läßt sich das Raster nicht formatieren, d.h. wenigens deutlicher darstellen. |
| | | | |
| | Uwe ''Pascal'' Niemeier | Hi Thomas!
Zur Einblendung von Kopf/Fußzeilen: Anscheinend kommt bei der FormatRange-Message eine Funktion zum Einsatz, die ähnlich wie DrawText wirkt. Darum kann bei deiner eingeblendeten Zeile der Font wechseln. Umgekehrt kann man den Font nicht vorgeben, weil sich das auf das ganze Dokument auswirkt. Lösung: Den Text in der Profan-Speicherbitmap anlegen und dann in die Seiten einblenden: KompilierenMarkierenSeparieren...
~StartDoc(DC&,DocInfo#)'-------Druckauftrag beginnen
whileloop 1,Seiten%'-----------Anzahl ermittelte Seiten
mcls 500,100,255'--Farbe nur zu Testzwecken
startpaint -1'-----%HDC nach StartPaint -1: DC der Speicherbitmap
usefont "Balloon",50,0,0,0,0
drawtext 0,0,"Seite "+str$(&loop)+" von "+str$(Seiten%)
~BitBlt(DC&,10,10,500,100,%hdc,0,0,~SRCCOPY)'--Parameter 2+3: Position in der Seite
endpaint
~StartPage(DC&)'------------Seite beginnen > Vorbereitung Drucken
...
Schriftgröße und Position müssen an den jeweiligen Drucker angepaßt werden; vor Allem, wenn es eine Fußzeile werden soll. Kann man sicher über Seitegröße/Auflösung berechnen. Aber dieser Trick ist auf jeden Fall um Längen besser als meine Technik; Danke für den Tipp!
Zu Tabellen: Tatsächlich verhält sich dein Code mit einem 50W-Control anders. Aber dieses Verhalten ist nun mal undokumentiert und darum sollte man sich nicht unbedingt drauf verlassen. Tipp: wenn du die Tabelle mit Word erstellst und weiße Linien wählst, ist sie im 50W nicht als Tabelle zu erkennen.
SeeYou Pascal |
| | | | |
| | Thomas Freier | Deinen Script für die Fußzeile werde ich noch testen. Was die Tabelle angeht, so hatte ich sie, versehen mit Platzhaltern, 2005 für Listen (Auftragsbestätigung, Rechnung, usw.) verwendet und nur über XProfan gedruckt. Die Listen sahen mit dem schwach grauen Tabellenraster immer noch besser aus als ohne und die Seite konnte als RTF gespeichert werden. |
| | | | |
|
AntwortenThemenoptionen | 17.158 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |