ListIconGadget ausdrucken mit eigenem Printrequester
Verfasst: 10.01.2010 21:52
Gestern habe ich einen eigen simplen Printrequester vorgestellt.
Heute gibt es dazu eine etwas größere Anwendung. Für einige von uns mag es von Nachteil sein, das die PB 2D Drawing Befehle nicht mehr gehen, sondern nur noch Windows-Api Befehle. Seit 4.4 ist das aber nun mal so.
In dem Beispiel sind allerdings die wichtigsten Api-Befehle, die man für den Ausdruck von Texten benötigt, dabei.
Warum eigentlich einen eigenen Printrequester? Nun jedesmal sehe ich die Radiobuttons Alles, Markiert, Seiten und kann diese nicht benutzen
Das ganze sieht gewaltiger aus, als es ist, eigentlich recht simpel.
Das ganze besteht aus 3 Teilen.
1. der eigene PrintRequester mit Start + Stopdrawing, der Ermittlung von Bildschirm + Druckerwerten, sowie 2 Fontprozeduren.
2. dem Teil welches ein ListIconGadget ausdruckt. Unterstützt wird der Ausdruck von normalen Standard-ListIconGadgets, also keine Ownerdraw via Callback, mit zusätzlichen Icons etc.
Soll aber nicht heißen, das solche nicht gedruckt werden, das passiert schon, nur was dabei rauskommt ist so eine Sache. Probleme gibt es auf jeden Fall mit unterschiedlichen Zeilenhöhen.
3. Ein Demo Programmteil
Das ganze einfach untereinander setzen im PB Editor, oder als Includes abspeichern und mit entsprechenden Include Anweisungen
Auch wenn viele Drucken nicht brauchen, ich denke gerade Anfänger die ihre Listen zu Papier bringen wollen, können das eine oder andere davon gebrauchen.
Die Umrechnerei von Windows -> Printer ist manchmal etwas verwirrend, dafür können aber die Ränder in mm angegeben werden. Je nach Drucker gibt es allerdings kleinere Differenzen.
Außerdem kann der Ausdruck über eine Variable vergrößert / verkleinert werden.
Viel Spaß damit. Verbesserungen sind erwünscht.
1.
2.
Edit 11.01.2010: Prn_StopPrinting() erweitert
Heute gibt es dazu eine etwas größere Anwendung. Für einige von uns mag es von Nachteil sein, das die PB 2D Drawing Befehle nicht mehr gehen, sondern nur noch Windows-Api Befehle. Seit 4.4 ist das aber nun mal so.
In dem Beispiel sind allerdings die wichtigsten Api-Befehle, die man für den Ausdruck von Texten benötigt, dabei.
Warum eigentlich einen eigenen Printrequester? Nun jedesmal sehe ich die Radiobuttons Alles, Markiert, Seiten und kann diese nicht benutzen

Das ganze sieht gewaltiger aus, als es ist, eigentlich recht simpel.

Das ganze besteht aus 3 Teilen.
1. der eigene PrintRequester mit Start + Stopdrawing, der Ermittlung von Bildschirm + Druckerwerten, sowie 2 Fontprozeduren.
2. dem Teil welches ein ListIconGadget ausdruckt. Unterstützt wird der Ausdruck von normalen Standard-ListIconGadgets, also keine Ownerdraw via Callback, mit zusätzlichen Icons etc.
Soll aber nicht heißen, das solche nicht gedruckt werden, das passiert schon, nur was dabei rauskommt ist so eine Sache. Probleme gibt es auf jeden Fall mit unterschiedlichen Zeilenhöhen.
3. Ein Demo Programmteil
Das ganze einfach untereinander setzen im PB Editor, oder als Includes abspeichern und mit entsprechenden Include Anweisungen
Auch wenn viele Drucken nicht brauchen, ich denke gerade Anfänger die ihre Listen zu Papier bringen wollen, können das eine oder andere davon gebrauchen.
Die Umrechnerei von Windows -> Printer ist manchmal etwas verwirrend, dafür können aber die Ränder in mm angegeben werden. Je nach Drucker gibt es allerdings kleinere Differenzen.
Außerdem kann der Ausdruck über eine Variable vergrößert / verkleinert werden.
Viel Spaß damit. Verbesserungen sind erwünscht.
1.
Code: Alles auswählen
;ersetzt PrintRequester, 09.01.2010
Procedure.i Prn_PrintRequester(*pd.PRINTDLG)
Protected ok = 0
*pd\lStructSize = SizeOf(PRINTDLG)
*pd\hwndOwner = WindowID(GetActiveWindow()) ;oder null
*pd\hDevMode = 0
*pd\hDevNames = 0
*pd\nMinPage = 1 ;wenn definiert = Startseite,
;kann auch Vorgabe sein
;wenn aber nMaxPage fehlt, kein PrintDlg
*pd\nMaxPage = -1 ;nicht definiert = keine Seitenangabe
;*pd\nFromPage = 3 ;wenn definiert, erscheinen diese
;*pd\nToPage = 5 ;Werte in der Editbox
;kann auch Vorgabe sein
*pd\Flags | #PD_RETURNDC ;muß sein !!!!!
;*pd\Flags | #PD_PRINTSETUP
;folgendes kann auch Vorgaben sein
;*pd\Flags | #PD_HIDEPRINTTOFILE ;Checkbox in Datei drucken ist weg
;*pd\flags | #PD_NOPAGENUMS ;RadioButton Seiten ist weg
;*pd\flags | #PD_NOSELECTION ;RadioButton Markierung ist weg
;den RadioButton Aktuelle Seite gibt es nur mit PrinDlgEx
;PrinDlgEx macht allerdings viel mehr Arbeit
ok = PrintDlg_(*pd)
If ok: ok = *pd\hDC: EndIf
ProcedureReturn ok
EndProcedure
Procedure.i Prn_StartPrinting(*pd.PRINTDLG, jobname$)
Protected ok = 0
Protected szOutput = 0
;in eine Datei drucken ist praktisch, wenn man
;den Windows Standard Generic / Text only Treiber
;installiert hat. Dann kann man sich das Ergebnis
;sehr schön mit Wordpad ansehen.
If *pd\flags & #PD_PRINTTOFILE ;kann auch weggelassen werden
szOutput = @"Test.txt" ;dann kommt ein Fenster
EndIf ;um den Dateinamen einzugeben
;SetAbortProc_( *pd\hDC, @AbortProc()) ;???
DocInfo.DOCINFO
DocInfo\cbSize = SizeOf(DOCINFO)
DocInfo\lpszDocName = @jobname$
DocInfo\lpszOutput = szOutput
ok = StartDoc_(*pd\hDC, @DocInfo)
If ok < 1: ok = 0: EndIf
ProcedureReturn ok
EndProcedure
Procedure.i Prn_StopPrinting(*pd.PRINTDLG)
EndDoc_(*pd\hDC)
DeleteObject_(*pd\hDC)
DeleteDC_(*pd\hDC)
GlobalFree_(*pd\hDevMode)
GlobalFree_(*pd\hDevNames)
EndProcedure
Structure GetDeviceCaps
prnhorzres.i
prnhorzsize.i
prnhorzdotmm.f
prnhorzoffmm.f
prnvertres.i
prnvertsize.i
prnvertdotmm.f
prnvertoffmm.f
wndhorzres.i
wndhorzsize.i
wndhorzdotmm.f
wndvertres.i
wndvertsize.i
wndvertdotmm.f
faktorH.f
faktorV.f
EndStructure
Procedure.i Prn_GetDeviceCaps(dc, *gdc.GetDeviceCaps)
;Bereich in mm
*gdc\prnhorzsize = GetDeviceCaps_(dc, #HORZSIZE)
*gdc\prnvertsize = GetDeviceCaps_(dc, #VERTSIZE)
;Anzahl Dots, #PHYSICALWIDTH wäre eventuell genauer, aber vergrößert alles
*gdc\prnhorzres = GetDeviceCaps_(dc, #HORZRES)
*gdc\prnvertres = GetDeviceCaps_(dc, #VERTRES)
;*gdc\prnhorzres = GetDeviceCaps_(dc, #PHYSICALWIDTH)
;*gdc\prnvertres = GetDeviceCaps_(dc, #PHYSICALHEIGHT)
;dot pro mm
*gdc\prnhorzdotmm = *gdc\prnhorzres / *gdc\prnhorzsize
*gdc\prnvertdotmm = *gdc\prnvertres / *gdc\prnvertsize
;nicht druckbarer Rand in mm, etwas zu klein wegen #HORZRES #VERTRES
*gdc\prnhorzoffmm = GetDeviceCaps_(dc, #PHYSICALOFFSETX) / *gdc\prnhorzdotmm
*gdc\prnvertoffmm = GetDeviceCaps_(dc, #PHYSICALOFFSETY) / *gdc\prnvertdotmm
dc = GetWindowDC_(0)
;Bereich in mm
*gdc\wndhorzsize = GetDeviceCaps_(dc, #HORZSIZE)
*gdc\wndvertsize = GetDeviceCaps_(dc, #VERTSIZE)
;Anzahl Dots
*gdc\wndhorzres = GetDeviceCaps_(dc, #HORZRES)
*gdc\wndvertres = GetDeviceCaps_(dc, #VERTRES)
;dot pro mm
*gdc\wndhorzdotmm = *gdc\wndhorzres / *gdc\wndhorzsize
*gdc\wndvertdotmm = *gdc\wndvertres / *gdc\wndvertsize
;dies ist der Umrechnungswert Window to Printer Auflösung
*gdc\faktorH = *gdc\prnhorzdotmm / *gdc\wndhorzdotmm
*gdc\faktorV = *gdc\prnvertdotmm / *gdc\wndvertdotmm
ReleaseDC_(0, dc)
EndProcedure
Procedure.i Prn_GetFontHoehe(fontid)
Protected lg.LOGFONT
Protected pixely = GetDeviceCaps_(GetDC_(0), #LOGPIXELSY)
Protected retvalue = GetObject_(fontid, SizeOf(LOGFONT), lg)
Protected fonthoehe = -MulDiv_(lg\lfHeight, 72, pixely)
ProcedureReturn fonthoehe
EndProcedure
Procedure.s Prn_GetFontName(fontid)
Protected lg.LOGFONT
GetObject_(fontid, SizeOf(LOGFONT), lg)
ProcedureReturn PeekS(@lg\lfFaceName)
EndProcedure
Code: Alles auswählen
;XIncludeFile "\Bremer\PureBasicPbi\Prn_PrintRequester.pbi"
;1.05
;EnableExplicit
Structure lvprndata
colvon.i ;ab Spalte 0
colbis.i ;bis Spalte oder -1 für die Letzte
faktor.i ;vergrößern/verkleinern z.B. 10 oder -10
randoben.i ;in mm, wird intern auf min 11 gesetzt
randlinks.i ;in mm, wird intern auf min 10 gesetzt
randunten.i ;in mm, wird intern auf min 5 gesetzt
proseite.i ;wenn null, wird errechnet
caps.GetDeviceCaps ;Structur siehe Prn_PrintRequester.pbi
seitennr.i ;mit Seitennr. 1|0
seitennrbox.i ;mit Rahmen für Seitennr. 1|0
message.i ;bei jeder Seite fragen 1|0
seitenanzahl.i ;für Message
aktuelleSeite.i ;für Message
EndStructure
Procedure.i LvPrnGetCols(pbnr)
Protected head = SendMessage_(GadgetID(pbnr), #LVM_GETHEADER, 0, 0)
Protected cols = SendMessage_(head, #HDM_GETITEMCOUNT, 0, 0)
ProcedureReturn cols
EndProcedure
Procedure.s LvPrnGetItem(pbnr, nextitem)
Protected item$, j, k
Protected cols = LvPrnGetCols(pbnr)
Protected Dim OrderArray(cols)
If SendMessage_(GadgetID(pbnr), #LVM_GETCOLUMNORDERARRAY, cols, @OrderArray(0))
For j = 0 To cols - 1
k = orderarray(j)
item$ + GetGadgetItemText(pbnr, nextitem, k) + #LF$
Next
EndIf
ProcedureReturn item$
EndProcedure
Procedure.i LvPrnGetHeadbreite(pbid, subitem)
Protected rect.rect, br
SendMessage_(pbid, #HDM_GETITEMRECT, subitem, rect)
br = rect\right - rect\left
ProcedureReturn br
EndProcedure
Procedure.i LvPrnGetItemhoehe(pbid, item)
Protected subitem, rect.rect, hh
If item = -1
subitem = 0 ;Zero-based index of the header
SendMessage_(pbid, #HDM_GETITEMRECT, subitem, rect)
Else
subitem = 1 ;The one-based index of the subitem
rect\top = subitem
rect\left = #LVIR_LABEL
SendMessage_(pbid, #LVM_GETSUBITEMRECT, item, rect)
EndIf
hh = rect\bottom - rect\top
ProcedureReturn hh
EndProcedure
Procedure.i LvPrnMessage(msgnr, *lvprn.lvprndata)
Protected info$, ok
Protected flags = #MB_OKCANCEL|#MB_ICONQUESTION
Select msgnr
Case 1: info$ = "Liste ist leer" + #LF$
info$ + " oder" + #LF$
info$ + "RadioButton Markierung gewählt, aber nichts markiert" + #LF$
Case 2: info$ = "Druckbereich ist: " + Str(*lvprn\caps\prnvertsize)
info$ + " anstatt 287/297 mm für A4" + #LF$ + #LF$
info$ + "Drucker ev. auf falsches Papier eingestellt" + #LF$
Case 3: info$ = "Druckbereich in mm: "
info$ + Str(*lvprn\caps\prnvertsize) + " x "
info$ + Str(*lvprn\caps\prnhorzsize) + #LF$ + #LF$ + #LF$
info$ + Str(*lvprn\aktuelleseite)+ ". Seite von "
info$ + Str(*lvprn\seitenanzahl) + #LF$ + #LF$
info$ + "Papier eingelegt ? oder Druck abbrechen"
EndSelect
ok = MessageRequester("Information", info$, flags)
ProcedureReturn ok
EndProcedure
Procedure LvPrn(pbnr, *lvprn.lvprndata = 0)
Protected lvprn.lvprndata
If Not *lvprn: *lvprn = @lvprn.lvprndata: EndIf
With *lvprn
;ACHTUNG: setzt voraus alle Zeilen gleich hoch, egal wie hoch
Protected printdlg.printdlg
Protected rect.rect, imgsize.size
Protected pbid = GadgetID(pbnr)
Protected hdid = SendMessage_(pbid, #LVM_GETHEADER, 0, 0)
Protected imglist = SendMessage_(pbid, #LVM_GETIMAGELIST, #LVSIL_STATE, 0)
ImageList_GetIconSize_(imglist, @imgsize\cx, @imgsize\cy)
Protected hv.f ;Hilfsvariable
Protected drkvertsize.f, drkvertres.f
Protected drkze.f, drksp.f, drkitemhoehe.f, drkItemabstand.f
Protected drkrandoben.f, drkrandunten.f, drkrandlinks.f
Protected subitembreite.f, subitemhoehe.f, subitemabstand.f
Protected ihh, ibr, isp, ize, inr
Protected drkanzgesamt, drkanzproseite
Protected seitevon, seitebis
Protected lfdnr, nextitem, istart
Protected fontid, fonthh, fontn$, fontnr
Protected col, nr, dc, subitem$, item$
Protected maxcols = LvPrnGetCols(pbnr) - 1
If \colvon > maxcols: \colvon = maxcols: EndIf
If \colbis > maxcols: \colbis = maxcols: EndIf
If \colbis = 0: \colbis = maxcols: EndIf
If \colbis < 0: \colbis = maxcols: EndIf
; -------------------------------------------
;Druckerwahl
dc = Prn_PrintRequester(printdlg.printdlg)
If Not dc: ProcedureReturn: EndIf
;Gesamtanzahl
drkanzgesamt = CountGadgetItems(pbnr)
;RadioButton Markierung gedrückt ?
If printdlg\flags & #PD_SELECTION
drkanzgesamt = SendMessage_(GadgetID(pbnr), #LVM_GETSELECTEDCOUNT, 0, 0)
istart = -1 ;Startwert für #LVM_GETNEXTITEM
EndIf
If Not drkanzgesamt
LvPrnMessage(1, *lvprn)
ProcedureReturn
EndIf
;Phys.DrkWerte holen
Prn_GetDeviceCaps(dc, \caps)
;wenn Drucker auf Legal steht, ist \prnvertsize größer 287/297 mm
;dies wäre der Druckbereich für Canon BJC 240 + Kodak ESP 5 AiO
If \caps\prnvertsize > 297
If LvPrnMessage(2, *lvprn) = 2: ProcedureReturn: EndIf
EndIf
;\faktor für verkleinern | vergrößern z.B -10% oder +10% (Parameter -10 | 10)
;\faktorV ist der Umrechnungswert Window to Printer Auflösung
\caps\faktorV + ((\caps\faktorV / 100) * \faktor)
\caps\faktorH + ((\caps\faktorH / 100) * \faktor)
fontid = GetGadgetFont(pbnr)
fonthh = Prn_GetFontHoehe(fontid) ;:Debug fonthh
fontn$ = Prn_GetFontName(fontid) ;:Debug fontn$
fontnr = LoadFont(#PB_Any, fontn$, fonthh * \caps\faktorV)
fontid = FontID(fontnr)
;Abstand
drkItemabstand = 0.5 ;mm zusätzlicher Zeilenabstand
subItemabstand = 0.7 ;mm zusätzlicher Spaltenabstand
;Ränder in mm
drkrandoben = \randoben ;intern zuweisen,
drkrandunten = \randunten ;damit Original unverändert ist
drkrandlinks = \randlinks
If drkrandoben < 11: drkrandoben = 11: EndIf
If drkrandunten < 5: drkrandunten = 5: EndIf
If drkrandlinks < 10: drkrandlinks = 10: EndIf
drkrandoben - \caps\prnvertoffmm ; - 1 ;nicht druckbaren Bereich
drkrandlinks - \caps\prnhorzoffmm ; ;abziehen
;oberer und unterer Rand abziehen in mm
drkvertsize = \caps\prnvertsize - drkrandoben - drkrandunten
;es bleiben dots übrig
drkvertres = drkvertsize * \caps\prnvertdotmm
;Header abziehen, Windots in Prndots umrechnen
hv = (LvPrnGetItemhoehe(hdid, -1) * \caps\faktorV)
drkvertres - hv
;Höhe einer Zeile/Items zur Berechnung von drkanzproseite
hv = (LvPrnGetItemhoehe(pbid, 0) + drkItemabstand) * \caps\faktorV
drkitemhoehe = hv
;Anzahl pro Seite
If \proseite
drkanzproseite = \proseite
Else
drkanzproseite = drkvertres / drkitemhoehe
EndIf
;Anzahl Seiten für Message und Ausdruck
\seitenanzahl = drkanzgesamt / drkanzproseite
If drkanzgesamt % drkanzproseite: \seitenanzahl + 1: EndIf
;RadioButton Seiten gedrückt ?
If printdlg\flags & #PD_PAGENUMS
seitevon = printdlg\nFromPage
seitebis = printdlg\nToPage
EndIf
;Seitenangabe Check
If seitevon < 1: seitevon = 1: EndIf
If seitevon > \seitenanzahl: seitevon = \seitenanzahl: EndIf
If seitebis < seitevon: seitebis = \seitenanzahl: EndIf
If seitebis > \seitenanzahl: seitebis = \seitenanzahl: EndIf
If seitebis = -1: seitebis = \seitenanzahl: EndIf
lfdnr = (seitevon - 1) * drkanzproseite
;oberer und linker Rand von mm in Window Dots umrechnen
drkrandoben * \caps\wndvertdotmm
drkrandlinks * \caps\wndhorzdotmm
;es geht los
If Prn_StartPrinting(printdlg, "LV-Job")
StartPage_(dc)
SelectObject_(dc, FontID)
SetBkMode_(dc, #TRANSPARENT)
SetTextAlign_(dc, #TA_TOP)
For seite = seitevon To seitebis
\aktuelleSeite = seite
If \message
If LvPrnMessage(3, *lvprn) = 2: Break: EndIf
EndIf
;drkze ist Startpunkt einer Zeile auf der Seite
drkze = drkrandoben
;Anzahl zu druckender Zeilen pro Seite + 1 für Überschrift
For nr = 1 To drkanzproseite + 1
drksp = drkrandlinks
If lfdnr < drkanzgesamt ;wenn wahr nächster Datensatz
;Itemnr holen
If nr = 1
nextitem = -1 ;Überschrift
Else
If printdlg\flags & #PD_SELECTION ;nur markierte Zeilen drucken
nextitem = SendMessage_(pbid, #LVM_GETNEXTITEM, istart, #LVNI_SELECTED)
istart = nextitem ;für nächstes Item
Else ;alles drucken
nextitem = lfdnr
EndIf
lfdnr + 1 ;für nächstes Item
EndIf
item$ = LvPrnGetItem(pbnr, nextitem)
;Spalten
For col = \colvon To \colbis
subitem$ = StringField(item$, col + 1, #LF$)
;Breite holen vom Header
subitembreite = LvPrnGetHeadbreite(hdid, col)
;Höhe holen Header
If nr = 1
subitemhoehe = LvPrnGetItemhoehe(hdid, -1)
;SeitenNr.schreiben
If \seitennr
rect\top = 0
rect\left = 0
rect\right = \caps\prnhorzres - (20 * \caps\faktorH)
rect\bottom = (subitemhoehe - 2) * \caps\faktorV
If \seitennrbox: DrawEdge_(dc, rect, 0, #BF_MIDDLE): EndIf
DrawText_(dc, "Seite " + Str(\aktuelleSeite), -1, rect, #DT_VCENTER|#DT_SINGLELINE|#DT_CENTER)
EndIf
;Höhe holen Item
Else
subitemhoehe = LvPrnGetItemhoehe(pbid, nextitem)
EndIf
;SubItem Rahmen malen
rect\top = \caps\faktorV * drkze
rect\left = \caps\faktorH * drksp
rect\right = \caps\faktorH * (drksp + subitembreite)
rect\bottom = \caps\faktorV * (drkze + subitemhoehe)
DrawFocusRect_(dc, rect)
;Header mit Hintergrund füllen
If nr = 1
InflateRect_(rect, -2, -2)
DrawEdge_(dc, rect, 0, #BF_MIDDLE)
InflateRect_(rect, 2, 2)
EndIf
;Start für Text oder icon in Spalte
rect\left + (3 * \caps\faktorH)
;Imagekasten malen
If imglist
If col = 0 And nr > 1
ihh = (imgsize\cx - 2) * \caps\faktorV
ibr = (imgsize\cy - 2) * \caps\faktorH
isp = rect\left + 1
ize = rect\top + ((rect\bottom - rect\top - ihh) / 2)
inr = 0
If GetGadgetItemState(pbnr,nextitem) & #PB_ListIcon_Checked: inr = 1: EndIf
ImageList_DrawEx_(imglist, inr, dc, isp, ize, ibr, ihh, #White, 0, #ILD_NORMAL)
rect\left + (3 * \caps\faktorH) + ibr
EndIf
EndIf
;Text in Spalte
DrawText_(dc, subitem$, -1, rect, #DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
;Start für nächste Spalte
drksp + subitembreite
drksp + subitemabstand ;zusätzlicher Spaltenabstand
Next
;Startpunkt für nächste Zeile
drkze + drkItemabstand + subitemhoehe
EndIf
Next nr ;Zeile
EndPage_(dc)
Next seite
Prn_StopPrinting(printdlg)
EndIf
If IsFont(fontnr): FreeFont(fontnr): EndIf
EndWith
EndProcedure
[code]
3.
[code]
;XIncludeFile "\Bremer\PureBasicPbi\lvPrint2010b1.pbi"
Enumeration
#but0
#but1
#but2
#but3
#lvg1
#lvg2
#lvg3
#win1
#font
#font1
EndEnumeration
LoadFont(#font, "Arial", 11)
LoadFont(#font1, "Arial", 9)
OpenWindow(#win1,0,0,900,480,"ListIcon Gadget",#PB_Window_SystemMenu|1)
;RemoveKeyboardShortcut(#win1, #PB_Shortcut_Tab)
ButtonGadget(#but0, 10,420, 180,25,"lv 1 mit Parameter")
ButtonGadget(#but1, 10,450, 180,25,"lv 1 ohne Parameter")
ButtonGadget(#but2,310,450, 180,25,"lv 2 ohne Parameter")
ButtonGadget(#but3,550,450, 180,25,"lv 3 ohne Parameter")
lvflags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect
;lvflags | #PB_ListIcon_CheckBoxes
lvflags | #PB_ListIcon_MultiSelect
lvflags | #PB_ListIcon_HeaderDragDrop
lvflags | #PB_ListIcon_AlwaysShowSelection
ListIconGadget(#lvg1,10,10,280,400,"Spalte 0",140,lvflags)
AddGadgetColumn(#lvg1,1,"Spalte 1",55)
AddGadgetColumn(#lvg1,2,"Sp 2",85)
SetGadgetFont(#lvg1,FontID(#font))
SetGadgetColor(#lvg1, #PB_Gadget_BackColor, #Yellow)
lvflags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect
lvflags | #PB_ListIcon_CheckBoxes
lvflags | #PB_ListIcon_MultiSelect
lvflags | #PB_ListIcon_AlwaysShowSelection
ListIconGadget(#lvg2,300,10,220,400,"Spalte 0",180,lvflags)
AddGadgetColumn(#lvg2,1,"Spalte 1",-1)
AddGadgetColumn(#lvg2,2,"Sp 2",85)
SetGadgetFont(#lvg2,FontID(#font1))
ListIconGadget(#lvg3,530,10,220,400,"",0,lvflags|#LVS_NOCOLUMNHEADER)
AddGadgetColumn(#lvg3,1,"Spalte 1",55)
For i = 0 To 99
nr$ = LSet(Str(i),3," ")
txt$ = "Text in Zeile "+nr$+" in Spalte 0" + #LF$ + Str(Random(111)) + #LF$ + "Hallo"
AddGadgetItem(#lvg1, -1, txt$)
AddGadgetItem(#lvg2, -1, txt$)
AddGadgetItem(#lvg3, -1, txt$)
Next
;Zeilen höher machen - ( aus RSBASIC Win Api Libary )
SendMessage_(GadgetID(#lvg1),#LVM_SETIMAGELIST,#LVSIL_SMALL,ImageList_Create_(1,25,#ILC_COLORDDB,0,0))
;=====================================================
Repeat: event = WaitWindowEvent(1)
If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu
welcherButton = EventGadget() ;:Debug welcherButton
Select welcherButton
Case #but0: lvprndata.lvprndata
lvprndata\colvon = 0 ;ab Spalte 0
lvprndata\colbis = 1 ;bis Spalte oder -1 für die Letzte
lvprndata\randoben = 0 ;in mm, wird intern auf min 11 gesetzt
lvprndata\randlinks = 0 ;in mm, wird intern auf min 10 gesetzt
lvprndata\randunten = 0 ;in mm, wird intern auf min 5 gesetzt
lvprndata\proseite = 10 ;wenn null, wird errechnet
lvprndata\faktor = 5 ;größer/kleiner z.B. 10 oder -10
lvprndata\message = 1 ;bei jeder Seite fragen 1|0
lvprndata\seitennr = 1 ;mit Seitennr. 1|0
lvprndata\seitennrbox = 1 ;mit Rahmen für Seitennr. 1|0
LvPrn(#lvg1, lvprndata)
Case #but1: LvPrn(#lvg1)
Case #but2: LvPrn(#lvg2)
Case #but3: LvPrn(#lvg3)
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
End