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