>>>>*Courtesy of Simon Clark, Universal Thread, July 2003 >>>>*put a DEFAULTSOURCE=<bin number> in the EXPR column >>>>*of the FRX row with OBJTYPE=53 after selection >>>> >>>>oform=CREATEOBJECT('papertrayform') >>>>oform.show() >>>>READ EVENTS >>>>RETURN >>>> >>>>DEFINE CLASS papertrayform AS form >>>> >>>> >>>> Top = 0 >>>> Left = 1 >>>> Height = 365 >>>> Width = 631 >>>> DoCreate = .T. >>>> Caption = "Paper Tray Selection Form" >>>> Name = "PAPERTRAYS" >>>> DIMENSION paperbins[1,4] >>>> >>>> >>>> ADD OBJECT list1 AS listbox WITH ; >>>> FontName = "Courier New", ; >>>> FontSize = 9, ; >>>> BoundColumn = 1, ; >>>> RowSourceType = 6, ; >>>> RowSource = 'LEFT(trays.pname,45)+" "+left(trays.pbin,20)+" "+LEFT(trays.pbinno,20)+" "+LEFT(trays.pport,10)', ; >>>> ControlSource = "m.selection", ; >>>> Height = 300, ; >>>> ColumnLines = .T., ; >>>> Left = 8, ; >>>> MultiSelect = .F., ; >>>> TabIndex = 10, ; >>>> Top = 39, ; >>>> Width = 612, ; >>>> Name = "List1" >>>> >>>> >>>> ADD OBJECT label1 AS label WITH ; >>>> Caption = "Press <ENTER> to select a paper tray or Double-Click on any item to select it", ; >>>> Height = 17, ; >>>> Left = 8, ; >>>> Top = 11, ; >>>> Width = 580, ; >>>> Name = "Label1" >>>> >>>> >>>> PROCEDURE buf2word >>>> *PROCEDURE SYLSTLEN_buf2word && Convert BUF to WORD >>>> PARAMETERS QQbuffer >>>> * ---INTERFACE--- >>>> PRIVATE ALL LIKE QQ* >>>> * IMPORTS: >>>> * A buffer/pointer >>>> * >>>> * EXPORTS: >>>> * The passed in buffer converted to a word format >>>> * >>>> >>>> * ---INITIALISE--- >>>> QQudfRet = ASC(SUBSTR(QQbuffer, 1,1)) + ASC(SUBSTR(QQbuffer, 2,1)) * 256 >>>> >>>> RETURN QQudfRet >>>> ENDPROC >>>> >>>> >>>> PROCEDURE Init >>>> IF USED('trays') >>>> USE IN trays >>>> ENDIF >>>> IF FILE('trays.dbf') >>>> DELETE FILE trays.dbf >>>> ENDIF >>>> CLEAR >>>> DODEFAULT() >>>> SET SAFETY OFF >>>> *For the FRX's it easy, you just put a DEFAULTSOURCE=<bin number> in the EXPR column >>>> *of the FRX row with OBJTYPE=53 (same for DUPLEX= by the way...). >>>> >>>> #DEFINE GMEM_FIXED 0 >>>> #DEFINE DC_PAPERS 2 >>>> #DEFINE DC_BINS 6 >>>> #DEFINE DC_SIZE 8 >>>> #DEFINE DC_VERSION 10 >>>> #DEFINE DC_BINNAMES 12 >>>> #DEFINE DC_PAPERNAMES 16 >>>> #DEFINE DEFAULT_VALUES 0 >>>> >>>> * Needed to interrogate the printer driver for paper bins/trays >>>> DECLARE INTEGER DeviceCapabilities IN winspool.drv; >>>> STRING pDevice, STRING pPort, INTEGER fwCapability,; >>>> STRING @pOutput, INTEGER pDevMode >>>> >>>> =APRINTERS(pPrinters) >>>> FOR ip = 1 TO ALEN(pPrinters,1) >>>> *QQprintername=SET("PRINTER",2) && windows own default printer >>>> QQprintername=pPrinters(ip,1) >>>> pPort=ALLTRIM(pPrinters(ip,2)) >>>> * Windows API declarations >>>> * Hook in here to determine the paper trays and their bin numbers >>>> * Update the GVoPrintJob object with the results >>>> QQbinBfr = REPLICATE(CHR(0), 16384) >>>> QQbinBf2 = REPLICATE(CHR(0), 1024) >>>> * provide valid printer and port names >>>> * pPort="HPJD1" >>>> QQnCount = DeviceCapabilities(QQprintername, pPort, DC_BINNAMES, @QQbinBfr, 0) >>>> QQnCnt2 = DeviceCapabilities(QQprintername, pPort, DC_BINS, @QQbinBf2, 0) >>>> * QQnCount = DeviceCapabilities(QQprintername, "LPT1", DC_BINNAMES, @QQbinBfr, 0) >>>> * QQnCnt2 = DeviceCapabilities(QQprintername, "LPT1", DC_BINS, @QQbinBf2, 0) >>>> * Set the number of bins available on this printer property >>>> p_bin_count=IIF(QQnCount<0, 0, QQnCount) >>>> *GVoPrintJob.p_bin_count = iif(QQnCount<0, 0, QQnCount) >>>> * if GVoPrintJob.p_Bin_Count > 0 >>>> IF p_bin_count>0 >>>> * each string buffer is 24 characters long, terminated with a NULL / chr(0) >>>> * and contains the name of a paper bin >>>> *dimension GVoPrintJob.p_bin_names[QQnCount], GVoPrintJob.p_bin_labels[QQnCount] >>>> DIMENSION p_bin_names[QQnCount], p_bin_labels[QQnCount] >>>> FOR QQindex=1 TO QQnCount >>>> QQbinName = SUBSTR(QQbinBfr, (QQindex-1)*24+1, 24) + CHR(0) >>>> QQbinName = SUBSTR(QQbinName, 1, AT(CHR(0), QQbinName)-1) >>>> *GVoPrintJob. >>>> p_bin_names[QQindex] = QQbinName >>>> ENDFOR >>>> QQptr = 1 >>>> FOR QQindex=1 TO QQnCnt2*2 STEP 2 >>>> QQbinNum = THISFORM.buf2word(SUBSTR(QQbinBf2, QQindex, 2)) >>>> >>>> * GVoPrintJob.p_bin_labels[QQptr] = QQbinNum >>>> p_bin_labels[QQptr] = QQbinNum >>>> QQptr = QQptr + 1 >>>> ENDFOR >>>> ENDIF >>>> IF ALEN(p_bin_names,1)=ALEN(p_bin_labels,1) >>>> FOR i = 1 TO ALEN(p_bin_names,1) >>>> IF TYPE('thisform.paperbins')="U" >>>> DIMENSION THISFORM.paperbins(i,4) >>>> ELSE >>>> DIMENSION THISFORM.paperbins(ALEN(THISFORM.paperbins,1)+1,4) >>>> ENDIF >>>> THISFORM.paperbins(ALEN(THISFORM.paperbins,1),1)=QQprintername >>>> THISFORM.paperbins(ALEN(THISFORM.paperbins,1),2)=p_bin_names(i) >>>> THISFORM.paperbins(ALEN(THISFORM.paperbins,1),3)=p_bin_labels(i) >>>> THISFORM.paperbins(ALEN(THISFORM.paperbins,1),4)=pPort >>>> ENDFOR >>>> ENDIF >>>> ENDFOR >>>> *SET STEP ON >>>> * LIST MEMORY LIKE p_bin_names >>>> * LIST MEMORY LIKE p_bin_labels >>>> * LIST MEMORY LIKE thisform.paperbins >>>> nlen1=0 >>>> nlen2=0 >>>> nlen3=4 >>>> nlen4=0 >>>> =ACOPY(THISFORM.paperbins,paperbins) >>>> FOR i = 1 TO ALEN(paperbins,1) >>>> IF TYPE('paperbins(i,1)')<>"L" >>>> IF LEN(ALLTRIM(paperbins(i,1)))>nlen1 >>>> nlen1=LEN(ALLTRIM(paperbins(i,1))) >>>> ENDIF >>>> ENDIF >>>> IF TYPE('paperbins(i,2)')<>"L" >>>> IF LEN(ALLTRIM(paperbins(i,2)))>nlen2 >>>> nlen2=LEN(ALLTRIM(paperbins(i,2))) >>>> ENDIF >>>> ENDIF >>>> *!* IF TYPE('paperbins(i,3)')<>"L" >>>> *!* IF LEN(ALLTRIM(paperbins(i,3)))>nlen3 >>>> *!* nlen3=LEN(ALLTRIM(paperbins(i,3))) >>>> *!* ENDIF >>>> *!* ENDIF >>>> IF TYPE('paperbins(i,4)')<>"L" >>>> IF LEN(ALLTRIM(paperbins(i,4)))>nlen4 >>>> nlen4=LEN(ALLTRIM(paperbins(i,4))) >>>> ENDIF >>>> ENDIF >>>> ENDFOR >>>> IF nlen1=0 >>>> nlen1=1 >>>> ENDIF >>>> IF nlen2=0 >>>> nlen2=1 >>>> ENDIF >>>> IF nlen4=0 >>>> nlen4=1 >>>> ENDIF >>>> CREATE CURSOR trays (pname c(nlen1), pbin c(nlen2), pbinno c(nlen3), pPort c(nlen4)) >>>> SELE trays >>>> FOR i = 1 TO ALEN(paperbins,1) >>>> IF TYPE('paperbins(i,1)')<>"L" >>>> SELE trays >>>> APPEND BLANK >>>> *!* IF i > 1 >>>> *!* ta=i-1 >>>> *!* IF TYPE('paperbins(i,1)')=TYPE('paperbins(ta,1)') .and. paperbins(i,1) <> paperbins(ta,1) >>>> *!* REPLACE trays.pname WITH ALLTRIM(paperbins(i,1)) >>>> *!* ELSE >>>> *!* IF TYPE('paperbins(i,1)')!=TYPE('paperbins(ta,1)') >>>> *!* REPLACE trays.pname WITH ALLTRIM(paperbins(i,1)) >>>> *!* ENDIF >>>> *!* ENDIF >>>> *!* ENDIF >>>> REPLACE trays.pname WITH ALLTRIM(paperbins(i,1)) >>>> IF TYPE('paperbins(i,2)')<>"L" >>>> REPLACE trays.pbin WITH ALLTRIM(paperbins(i,2)) >>>> ENDIF >>>> IF TYPE('paperbins(i,3)')<>"L" >>>> REPLACE trays.pbinno WITH ALLTRIM(STR(paperbins(i,3))) >>>> ENDIF >>>> IF TYPE('paperbins(i,4)')<>"L" >>>> REPLACE trays.pPort WITH ALLTRIM(paperbins(i,4)) >>>> ENDIF >>>> ENDIF >>>> ENDFOR >>>> GO TOP >>>> THISFORM.List1.REFRESH >>>> ENDPROC >>>> >>>> PROCEDURE UNLOAD >>>> CLEAR EVENTS >>>> ENDPROC >>>> >>>> PROCEDURE list1.DblClick >>>> IF USED('TRAYS') .AND. RECCOUNT('TRAYS')>0 .AND. !EOF('TRAYS') >>>> mchoice=trays.pbinno >>>> ENDIF >>>> MESSAGEBOX('You chose: '+CHR(13)+CHR(13); >>>> +"Printer: "+ALLTRIM(trays.pname)+ CHR(13); >>>> +"Tray: "+trays.pbin+CHR(13); >>>> +"Bin No: "+trays.pbinno+CHR(13),0,'Paper Tray Selectioin') >>>> NODEFAULT >>>> THISFORM.RELEASE() >>>> ENDPROC >>>> >>>> >>>> PROCEDURE list1.KeyPress >>>> LPARAMETERS nKeyCode, nShiftAltCtrl >>>> >>>> IF LASTKEY() = 13 .or. LASTKEY() = -9 >>>> nKeyCode = 13 >>>> nShiftAltCtrl = 0 >>>> ENDIF >>>> >>>> mchoice="" >>>> DO CASE >>>> >>>> CASE nKeyCode = 13 .or. nkeyCode = -9 >>>> >>>> IF USED('TRAYS') .AND. RECCOUNT('TRAYS')>0 .AND. !EOF('TRAYS') >>>> mchoice=trays.pbinno >>>> ENDIF >>>> MESSAGEBOX('You chose: '+CHR(13)+CHR(13); >>>> +"Printer: "+ALLTRIM(trays.pname)+ CHR(13); >>>> +"Tray: "+trays.pbin+CHR(13); >>>> +"Bin No: "+trays.pbinno+CHR(13),0,'Paper Tray Selectioin') >>>> NODEFAULT >>>> THISFORM.RELEASE() >>>> >>>> OTHERWISE >>>> >>>> mchoice="" >>>> DODEFAULT() >>>> >>>> ENDCASE >>>> ENDPROC >>>> >>>> >>>> PROCEDURE list1.Refresh >>>> IF !USED('trays') .OR. RECCOUNT('trays')=0 >>>> THIS.ENABLED=.F. >>>> ELSE >>>> THIS.ENABLED=.T. >>>> ENDIF >>>> DODEFAULT() >>>> ENDPROC >>>> >>>> >>>>ENDDEFINE >>>>