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