*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