Forum | | | | Thomas Freier | Wollte ein RTF mehrfach auf mehreren Seiten drucken. Ein von Pascal angepasstes Script geht. KompilierenMarkierenSeparierenDEMO DRAWRICHTEXT GRÖSSENABFRAGE
window 0,0-400,300
$H Windows.ph
$H Messages.ph
$H RichEdit.ph
proc DrawRichText2---------------------------------------------------------DrawRichText2
parameters RTF&,PosX%,PosY%,MaxX%,MaxY%--Position + Grösse in Pixeln!
declare PrinterDpiX%,PrinterDpiY%
declare WindowDpiX%,WindowDpiY%
declare fx!,fy!
if %printing--Bei Druck: %HDC2 = %HDC = &PDC
~SetMapMode(%hdc2,1)
~SetWindowExtEx(%hdc2,1,1,0)
~SetViewPortExtEx(%hdc2,1,1,0)
PosX%=PosX%+30--Korrektur ???
PosY%=PosY%+30--Korrektur ???
endif
PrinterDpiX%=~GetDeviceCaps(%hdc2,~LOGPIXELSX)--dpi X des Druckers
PrinterDpiY%=~GetDeviceCaps(%hdc2,~LOGPIXELSY)--dpi X des Druckers
WindowDpiX%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSX)--dpi X des Bildschirms (!)
WindowDpiY%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSY)--dpi Y des Bildschirms (!)
PosX%=int(PosX%/WindowDpiX%*1440)
PosY%=int(PosY%/WindowDpiX%*1440)
MaxX%=int(MaxX%/WindowDpiX%*1440)
MaxY%=int(MaxY%/WindowDpiX%*1440)
declare Range#
dim Range#,48
clear Range#
long Range#, 0=%hdc2,%hdc2
long Range#, 8=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
long Range#,24=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
long Range#,44=-1
sendmessage(RTF&,~EM_FORMATRANGE,1,Range#)
if %printing
fx!=~GetDeviceCaps(%hdc2,~LOGPIXELSX)/300
fy!=~GetDeviceCaps(%hdc2,~LOGPIXELSY)/300
~SetMapMode(%hdc2,~MM_ANISOTROPIC)
~SetWindowExtEx(%hdc2,6400,9600,0)
~SetViewPortExtEx(%hdc2,int(2200*fx!),int(3300*fy!),0)
endif
dispose Range#
casenot %printing:repaint
endproc---------------------------------------------------------------------------------
Print "Bitte warten, der Druck wird vorbereitet!"
var hFont% = @Create("Font","Arial",20,12,0,0,0)
declare RtfDll&,RichEdit&
RtfDll&=usedll("RichEd20.dll")
RichEdit&=control("RichEdit20A","Test",$500050c4,0,0,0,0,%hwnd,5000,0)
settext RichEdit&,"Diese RTF-Anwendung läßt mich nicht verzweifeln!"
SetFont RichEdit&,hFont%
declare Breite%,Höhe%
Breite%= 400
Höhe%= 200
var y1%=0
var x1%=0
startprint
var y%=0
While y% < 26 ....einfach einmal auf zwei Seiten drucken
DrawRichText2 RichEdit&,(y1%*4.40),(x1%*4.40),400,200
inc y%
y1%=y1% + 105
if y1%>105
y1%=0
x1%=x1%+43
IF x1%>290
x1%=0
NEXTPAGE
endif
endif
wend
endprint
destroywindow(RichEdit&)
waitkey
In meiner, hier stark gekürzten, Anwendung wird der Font auf der zweiten Seite geändert und ich finde den Fehler nicht. KompilierenMarkierenSeparierenLABEL-EDIT-DRUCK-E
$H Windows.ph
$H Messages.ph
$H RichEdit.ph
proc DrawRichText2---------------------------------------------------------DrawRichText2
parameters RTF&,PosX%,PosY%,MaxX%,MaxY%--Position + Grösse in Pixeln!
declare PrinterDpiX%,PrinterDpiY%
declare WindowDpiX%,WindowDpiY%
declare fx!,fy!
if %printing--Bei Druck: %HDC2 = %HDC = &PDC
~SetMapMode(%hdc2,1)
~SetWindowExtEx(%hdc2,1,1,0)
~SetViewPortExtEx(%hdc2,1,1,0)
PosX%=PosX%+3--Korrektur ???
PosY%=PosY%+3--Korrektur ???
endif
PrinterDpiX%=~GetDeviceCaps(%hdc2,~LOGPIXELSX)--dpi X des Druckers
PrinterDpiY%=~GetDeviceCaps(%hdc2,~LOGPIXELSY)--dpi X des Druckers
WindowDpiX%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSX)--dpi X des Bildschirms (!)
WindowDpiY%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSY)--dpi Y des Bildschirms (!)
PosX%=int(PosX%/WindowDpiX%*1440)
PosY%=int(PosY%/WindowDpiX%*1440)
MaxX%=int(MaxX%/WindowDpiX%*1440)
MaxY%=int(MaxY%/WindowDpiX%*1440)
declare Range#
dim Range#,48
clear Range#
long Range#, 0=%hdc2,%hdc2
long Range#, 8=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
long Range#,24=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
long Range#,44=-1
sendmessage(RTF&,~EM_FORMATRANGE,1,Range#)
if %printing
fx!=~GetDeviceCaps(%hdc2,~LOGPIXELSX)/300
fy!=~GetDeviceCaps(%hdc2,~LOGPIXELSY)/300
~SetMapMode(%hdc2,~MM_ANISOTROPIC)
~SetWindowExtEx(%hdc2,6400,9600,0)
~SetViewPortExtEx(%hdc2,int(2200*fx!),int(3300*fy!),0)
endif
dispose Range#
casenot %printing:repaint
endproc---------------------------------------------------------------------------------
#########################################################################################
Proc Label
declare x1%,y1%
Declare rtf#
Declare x&,x%,y%
declare Label_m&,RtfDll&,Label_dlg&
declare a#
declare LB_form&
declare RichEdit&
declare MaxB%,MaxH%
declare IstB%,IstH%
declare Pos#
declare WndProc&
dim Pos#,8
dim rtf#,512
RtfDll&=usedll("RichEd20.dll")
WINDOWSTYLE 16
Label_m&=create("Window",%hwnd,"Adresslabelformat: 105x43 ; auf dem Blatt: 7 Zeilen + 2 Reihen",100,50, 640,640)
usefont "MS Sans Serif",16,0,0,0,0
setdialogfont 1
var hFont% = @Create("Font","Arial",20,12,0,0,0)
var BP_but4& =@Create("Button",Label_m&,"Drucken",450,554,82,25)
var BP_but5& = @Create("Button",Label_m&,"Ende",540,554,82,25)
.....................................................................RTF-Edit erzeugen
Label_dlg&=@Control("STATIC","",$5400110E,0,32,624,340,Label_m&,$7918,%hinstance)
MaxB%=405
MaxH%=243
x%= (MaxB%/2) - 50
Lb_form&=@Control("STATIC","",$5400110E,x%,5,MaxB%/2,20,Label_dlg&,$7918,%hinstance)
RichEdit&=control("RichEdit20A","",$54005004,33,33,MaxB%,MaxH%,Label_dlg&,5000,0)
settext RichEdit&,"Diese RTF-Anwendung läßt mich verzweifeln!"
SetFont RichEdit&,hFont%
while 1
WaitInput
case GetFocus(BP_but5&): break
If GetFocus(BP_but4&) ----------------------------Drucken
y1%=0
x1%=0
startprint
y%=0
While y% < 26 ....einfach einmal auf zwei Seiten drucken
DrawRichText2 RichEdit&,(y1%*4.40),(x1%*4.40),400,200
inc y%
y1%=y1% + 105
if y1%>105
y1%=0
x1%=x1%+43
IF x1%>290
x1%=0
NEXTPAGE
endif
endif
wend
endprint
EndIf
endwhile
destroywindow(RichEdit&)
dispose rtf#
dispose a#
dispose pos#
destroywindow(Label_m&)
freedll RtfDll&
EndProc
#########################################################################################
WINDOWSTYLE 543512+8+2
Windowtitle "CSV Daten für Adresslabel"
window 0,0 - 900,600
Label Adresslabel
destroywindow(%hWnd)
end
Sieht ihn einer von euch oder hat einen Tip, woran es liegen könnte? |
| | | | |
| | Dieter Zornow | Ich denke mal nach jedem nextpage sollte oder muss der Font neu übergeben werden. Habs nicht getestet, da ich nichts zum ausdrucken habe. |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 20.08.2008 ▲ |
| |
| | Thomas Freier | @ Dieter , ich verwende beim Testen "FreePDF XP". Der eigentliche Vorgang: erster dbf Datensatz die blanko.rtf wird geladen die Platzhalter (dbf-Feldnamen) werden noch einmal überprüft dann die entsprechende RTF-Zeile mit den Daten aus der dbf ersetzt Ausdruck an der vorgesehenen Position. die RTF gelöscht nächster dbf Datensatz die blanko.rtf wird geladen usw. so müsste es eigentlich gehen. Leider nur auf der 1. Seite. |
| | | | |
| | Jörg Sellmeyer | | | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 20.08.2008 ▲ |
| |
| | Thomas Freier | @ Jörg, dass du das ausbuddeln würdest war mir klar. Aber, hier erweitert mit Daten, ergibt das Gewünschte mit "nextpage". KompilierenMarkierenSeparierenDEMO DRAWRICHTEXT GRÖSSENABFRAGE
$H Windows.ph
$H Messages.ph
$H RichEdit.ph
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$I Listview_Funktionen.inc
var lvdll&=usedll("Listview.dll")
Declare bereich#,bytes&,Label_view&,x&,y&,z&,x%
Declare listview&, text$
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Def GetSysColor(1) !"USER32","GetSysColor"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proc DrawRichText2---------------------------------------------------------DrawRichText2
parameters RTF&,PosX%,PosY%,MaxX%,MaxY%--Position + Grösse in Pixeln!
declare PrinterDpiX%,PrinterDpiY%
declare WindowDpiX%,WindowDpiY%
declare fx!,fy!
if %printing--Bei Druck: %HDC2 = %HDC = &PDC
~SetMapMode(%hdc2,1)
~SetWindowExtEx(%hdc2,1,1,0)
~SetViewPortExtEx(%hdc2,1,1,0)
PosX%=PosX%+30--Korrektur ???
PosY%=PosY%+30--Korrektur ???
endif
PrinterDpiX%=~GetDeviceCaps(%hdc2,~LOGPIXELSX)--dpi X des Druckers
PrinterDpiY%=~GetDeviceCaps(%hdc2,~LOGPIXELSY)--dpi X des Druckers
WindowDpiX%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSX)--dpi X des Bildschirms (!)
WindowDpiY%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSY)--dpi Y des Bildschirms (!)
PosX%=int(PosX%/WindowDpiX%*1440)
PosY%=int(PosY%/WindowDpiX%*1440)
MaxX%=int(MaxX%/WindowDpiX%*1440)
MaxY%=int(MaxY%/WindowDpiX%*1440)
declare Range#
dim Range#,48
clear Range#
long Range#, 0=%hdc2,%hdc2
long Range#, 8=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
long Range#,24=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
long Range#,44=-1
sendmessage(RTF&,~EM_FORMATRANGE,1,Range#)
if %printing
fx!=~GetDeviceCaps(%hdc2,~LOGPIXELSX)/300
fy!=~GetDeviceCaps(%hdc2,~LOGPIXELSY)/300
~SetMapMode(%hdc2,~MM_ANISOTROPIC)
~SetWindowExtEx(%hdc2,6400,9600,0)
~SetViewPortExtEx(%hdc2,int(2200*fx!),int(3300*fy!),0)
endif
dispose Range#
casenot %printing:repaint
endproc---------------------------------------------------------------------------------
Proc ErsetzeMultiLine
Parameters REdit&,Line&
Declare Index&,Index1&
Index& = ~sendMessage(REdit&,~EM_LINEINDEX,Line&-1,0)
Index1& = ~sendMessage(REdit&,~EM_LINEINDEX,Line&,0)
~sendmessage(REdit&,~EM_SETSEL,Index&,Index1&)
~sendmessage(REdit&,~EM_REPLACESEL,0,addr(c$)) Ersetzt den markierten Text
Endproc----------------------------------------------------------------------------------
WINDOWSTYLE 543512+8+2
Windowtitle "CSV Daten für Adresslabel"
window 0,0 - 900,600
AppendMenuBar 3," Adresslabel "
x&=MixRGBs(GetSysColor(15),$00ffffff)
listview&=CreateListView(%hwnd,%hinstance,0,x&,-1,$31)
text$="Pliete.csv"
bytes&=@FileSize(text$)
If bytes&>0
Dim bereich#,bytes&
ReadFileQuick(addr(text$),bereich#,0,bytes&)
x&=SetColumnsFromMem(listview&,bereich#,addr(y&))
CsvToListview(listview&,(bereich#+y&),(bytes&-y&),x&)
EndIf
AutoSortListview listview&,1,1,1,1,2,2
ShowListView(listview&,100,32,754,456)
Print "Bitte warten, der Druck wird vorbereitet!"
var hFont% = @Create("Font","Arial",20,12,0,0,0)
declare RtfDll&,REdit&
RtfDll&=usedll("RichEd20.dll")
REdit&=control("RichEdit20A","Test",$500050c4,0,0,0,0,%hwnd,5000,0)
RTF("LoadRTF",REdit&,"Aufkleber Brief.rtf")
x%=3
declare c$
declare Breite%,Höhe%
Breite%= 800
Höhe%= 400
var y1%=0
var x1%=0
startprint
y&=0
While y& < 226 ....einfach einmal auf zwei Seiten drucken
c$="Herrn"+"
"
ErsetzeMultiLine(REdit&,4)Zeile ersetzen
GetItemText(listview&,bereich#,1,y&)
c$=String$(bereich#,0)
GetItemText(listview&,bereich#,2,y&)
c$=c$ + " " + String$(bereich#,0) + "
"
ErsetzeMultiLine(REdit&,5)Zeile ersetzen
GetItemText(listview&,bereich#,11,y&)
c$=String$(bereich#,0) + "
"
ErsetzeMultiLine(REdit&,6)Zeile ersetzen
GetItemText(listview&,bereich#,9,y&)
c$=String$(bereich#,0)
GetItemText(listview&,bereich#,10,y&)
c$=c$ + " " + String$(bereich#,0) + "
"
ErsetzeMultiLine(REdit&,8)Zeile ersetzen
DrawRichText2 REdit&,(y1%*4.40),(x1%*4.40),400,200
inc y&
y1%=y1% + 105
if y1%>105
y1%=0
x1%=x1%+43
IF x1%>290
x1%=0
NEXTPAGE
endif
endif
wend
endprint
WaitInput
destroywindow(REdit&)
dispose bereich#
destroywindow(%hWnd)
freedll lvdll&
$I Listview_Dispose.inc
Habe aber noch einen code gefunden: KompilierenMarkierenSeparierenStartDoc(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&)
den ich ausprobieren werde. |
| | | | |
| | Thomas Freier | @Jörg, ich hoffe mein Kommentar war nicht zu hart. Aber UseFont darf eigentlich auf den Font in der RTF auch beim Drucken oder erzwungenem Seitenwechsel keinen Einfluß nehmen. Obwohl, bei XProfan ist das nicht gewiss. Eine A5 RTF wird beim Speichern zu einer A4 RTF. Warum??? Genaues wird wohl nur Roland wissen. Hat nicht einer einen Tip, wie ein Seitenwechsel erzwungen wird, außer Druckersteuerzeichen zu senden? |
| | | | |
|
AntwortenThemenoptionen | 1.440 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |