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