Deutsch
Forum

RTF und Ausdrucken

 
- 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?

2.867 kB
Hochgeladen:06.10.2010
Ladeanzahl89
Herunterladen
 
Gruß Thomas
Windows XP SP2, XProfan X2
06.10.2010  
 



« 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

6 kB
Version:2
Kurzbeschreibung: RTF drucken
Hochgeladen:26.10.2010
Ladeanzahl151
Herunterladen
 
26.10.2010  
 



 
- 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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
21.10.2010  
 




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
 
21.10.2010  
 



Thomas Freier
Ich würde es besser...


Keine Frage, sobald ich wieder an diesem PC ...
 
22.10.2010  
 




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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
24.10.2010  
 




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

6 kB
Version:2
Kurzbeschreibung: RTF drucken
Hochgeladen:26.10.2010
Ladeanzahl151
Herunterladen
 
26.10.2010  
 




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
startpaint DC&
DrawText 2250,6725,"Seite "+str$(x%)'..........bei A4 hoch
endpaint
inc x%
~StartPage(DC&)'------------Seite beginnen > Vorbereitung Drucken
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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
26.10.2010  
 




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
 
29.10.2010  
 




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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
30.10.2010  
 




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
 
30.10.2010  
 




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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
31.10.2010  
 




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
 
02.11.2010  
 




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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
02.11.2010  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

17.031 Betrachtungen

Unbenanntvor 0 min.
Uwe Lang18.02.2024
H.Brill18.09.2020
boh111.09.2020
Alibre25.12.2019
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie