VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

可以依每台電腦的印表機環境來設定報表印成半張紙格式
前往頁面 1, 2  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 1 樓

發表發表於: 星期日 五月 04, 2003 3:20 pm    文章主題: 可以依每台電腦的印表機環境來設定報表印成半張紙格式 引言回覆

作者: 史嘉富
------------------------------------------------------------------------
在win98自定紙張格式是採用第256種報表格式, 但在windows 2000之下卻是從第129開始, 以前都不知道該如何將一個REPORT可以同時應用在 98及2000之下, 現在我想到了一個方式, 雖然不聰明, 但也解決了我的問題, 這個方法工作原理是, 請使用者自行在印表機裡去設定半張紙的格式, 再回到我的程式去 do form setprint 之後, 它會自動將所有須要設定半張紙格式的report檔( 請將這些檔案事先放在你的執行檔之下的 report這個目錄) , 自動改變REPORT檔的報表檔設定, 並且是放在 report\你電腦的名字之目錄 , 以後只要印這個REPORT之前先執行一個 chkreport( 你的報表檔名 ) , 如果有自定的REPORT檔的資料, 它會自動產生一個暫存的報表檔名, 只要你在列印後自動將它刪除即可.
完整的程式碼請下載去參考看看. 如果有任何意見,歡迎來討論.

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期日 五月 04, 2003 3:22 pm    文章主題: 引言回覆

太好,我本想要做的
你先做好嘞,那我不客氣試用

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 3 樓

發表發表於: 星期日 五月 04, 2003 3:26 pm    文章主題: 引言回覆

教學相長, 每人提供一點小小的技巧, 增進彼此的功力.
_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 4 樓

發表發表於: 星期日 五月 04, 2003 4:53 pm    文章主題: 引言回覆

抱歉,那方式,如果換嘞別台電腦,印表機又會有不同的
這樣需要重新設定報表存檔,可否在簡化點
至於win2000自訂報表是從129開始的嗎

報表工具還欠缺
1.如何自動產生中一刀格式win2000/win98
2.報表指定印表機,每一台電腦印表機會有所不同
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 5 樓

發表發表於: 星期日 五月 04, 2003 5:19 pm    文章主題: 引言回覆

自動產生中一刀格式的功能或許可以參考你貼的文章http://vfp.sunyear.com.tw/viewtopic.php?t=89
目前我還沒有研究出來, 所以才會有你所說的第二個問題, 只能在要使用本程式的每一台電腦上去設定一次SETPRINT才能解決這個問題.
WIN98須在每一個印表機皆要指定"自定紙張", WINDOWS 2000在伺服器內容上建立一次, 這台電腦的每個列印裝置都可以使用.

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 6 樓

發表發表於: 星期日 五月 04, 2003 6:02 pm    文章主題: 引言回覆

我建議設置一個報表定義檔,這樣比較有彈性
這可以當作預設值檔看待.

Win200_rpt.ini及Win98_rpt.ini內容如下
[test1] &&報表名稱
DRIVER=winspool && 驅動程式庫
DEVICE=\\BLUEMOON\Epson LQ-300 ESC/P 2 && 印表機名稱
OUTPUT=LPT1: && 輸出埠
ORIENTATION=0 && 0 豎向, 1 橫向
PAPERSIZE=147 && 紙張尺寸序號
ASCII=147 && 同 紙張尺寸序號
PAPERLENGTH=100 && 紙張高度
PAPERWIDTH=300 && 紙張寬度
COPIES=1 && 列印份數
DEFAULTSOURCE=15 && 默認資源
PRINTQUALITY=360 && 列印質量(解析度)
COLOR=1 && 彩色列印
YRESOLUTION=360 && 解決方案(列印質量)
TTOPTION=2 && 選項
COLLATE=0 && 校對
[test2]
DRIVER=winspool && 驅動程式庫
DEVICE=\\BLUEMOON\Epson LQ-300 ESC/P 2 && 印表機名稱
OUTPUT=LPT1: && 輸出埠
ORIENTATION=0 && 0 豎向, 1 橫向
PAPERSIZE=147 && 紙張尺寸序號
ASCII=147 && 同 紙張尺寸序號
PAPERLENGTH=100 && 紙張高度
PAPERWIDTH=300 && 紙張寬度
COPIES=1 && 列印份數
DEFAULTSOURCE=15 && 默認資源
PRINTQUALITY=360 && 列印質量(解析度)
COLOR=1 && 彩色列印
YRESOLUTION=360 && 解決方案(列印質量)
TTOPTION=2 && 選項
COLLATE=0 && 校對
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 7 樓

發表發表於: 星期日 五月 04, 2003 10:06 pm    文章主題: 引言回覆

在report檔的構造, expr就是你所說的INI檔, tag及tag2都是印表機的資訊, 有時候實在搞不清楚VFP是會印到預設印表機呢,還是印到 tag所指定的印表機.
report檔是否只改變 expr 就可以改變預設紙張了, 如果是的話到是可以利用以下資訊(我收集到的, 但都未把它整合在一起.), 尚未有自動建立自定格式的功能(或許參考ruey所貼的文章可以達成,http://vfp.sunyear.com.tw/viewtopic.php?t=89 ), 如果有的話那就太好了, 可以建立多個INI檔, 由使用者自己選擇它要用那種尺寸的紙張之INI檔,當然也是放在report\電腦名稱 之下, 只要選擇後直接變動.frx就可以了.
一.
#Define DC_FIELDS 1
#Define DC_PAPERS 2
#Define DC_PAPERSIZE 3
#Define DC_MINEXTENT 4
#Define DC_MAXEXTENT 5
#Define DC_BINS 6
#Define DC_DUPLEX 7
#Define DC_SIZE 8
#Define DC_EXTRA 9
#Define DC_VERSION 10
#Define DC_DRIVER 11
#Define DC_BINNAMES 12
#Define DC_ENUMRESOLUTIONS 13
#Define DC_FILEDEPENDENCIES 14
#Define DC_TRUETYPE 15
#Define DC_PAPERNAMES 16
#Define DC_ORIENTATION 17
#Define DC_COPIES 18
Declare LONG DeviceCapabilities IN "winspool.drv" ;
STRING lpDeviceName, ;
STRING lpPort, ;
LONG iIndex, ;
STRING@ lpOutput, ;
STRING@ lpDevMode
Declare Integer DocumentProperties in WinSpool.Drv ;
Integer hwnd,;
Integer hPrint, ;
String pDeviceName, ;
String pDevModeOutput, ;
String pDevModeInput, ;
Integer fMode
Declare Integer OpenPrinter in WinSpool.Drv;
String pPrinterName, ;
Integer @phPrinter, ;
String pDefault
Declare Integer ClosePrinter in WinSpool.Drv;
Integer hPrinter
Local 印表機,埠,印表機陣列(1),行號,紙張編號緩衝區,紙張名稱緩衝區,印表機資料,自定義長度,自定義寬度
Local ii,jj,ii1
印表機=getprint()
If empt(m.印表機)
Retu .f.
Endif
jj=aprint(印表機陣列)
If m.jj=0
Retu .f.
Endif
If _vfp.Version<"7.0" &&6.0以下用戶
For ii=1 to m.jj
If UPPE(印表機陣列(M.ii,1))==uppe(m.印表機)
Exit
Endif
Next
行號=iif(m.ii>m.jj,0,m.ii)
Else
行號=ascan(印表機陣列,m.印表機,1,0,0,9)
Endif
If m.行號=0
Messageb("不可識別!",16,"錯誤")
Retu .f.
Endif
印表機=印表機陣列(m.行號,1)
埠 =印表機陣列(m.行號,2)
jj = DeviceCapabilities(m.印表機, m.埠, DC_PAPERS, 0, 0)
If m.jj<0
Retu .f.
Endif
紙張編號緩衝區 = SPACE((m.jj*2))
紙張名稱緩衝區 = SPACE((m.jj*64))
= DeviceCapabilities(m.印表機, m.埠, DC_PAPERS, @m.紙張編號緩衝區, 0)
= DeviceCapabilities(m.印表機, m.埠, DC_PAPERNAMES, @m.紙張名稱緩衝區, 0)
Dime 紙張類型陣列[m.jj, 2]
For ii = 1 TO m.jj
紙張類型陣列[m.ii, 2] = (ASC(SUBSTR(m.紙張編號緩衝區, (m.ii*2), 1))*256) +(ASC(SUBSTR(m.紙張編號緩衝區, (m.ii*2) - 1, 1)))
紙張類型陣列[m.ii, 1] = SUBSTR(m.紙張名稱緩衝區, ((m.ii - 1)*64) + 1, 64)
If LEFT(紙張類型陣列[m.ii, 1], 1) = "\"
紙張類型陣列[m.ii, 1]="\" + 紙張類型陣列[m.ii, 1]
Endif
If LEFT(紙張類型陣列[m.ii, 1],6)=="使用者" &&-定義大小 "
#Define DM_IN_BUFFER 8
#Define DM_OUT_BUFFER 2
Local hPrint,nSize,aDevMode
hPrinter = 0
nSize = 0
aDevMode = replicate(chr(0),122)
If OpenPrinter(m.印表機, @hPrinter, 0)>0
nSize = DocumentProperties(0, hPrinter, m.印表機, 0, 0, 0)
If nSize>0
aDevMode = replicate(chr(0),nSize)
nSize = DocumentProperties(0, hPrinter, m.印表機, @aDevMode, 0, DM_OUT_BUFFER)
Endif
Endif
印表機資料=subs(aDevMode,49,4)
自定義寬度=ASC(SUBS(M.印表機資料,3,1))+ASC(SUBS(M.印表機資料,4,1))*256
自定義長度=ASC(SUBS(M.印表機資料,1,1))+ASC(SUBS(M.印表機資料,2,1))*256
紙張類型陣列[m.ii, 1]="使用者定義大小 ("+STRT(LTRI(STR(m.自定義寬度/10,10,1)),".0")+" x "+STRT(LTRI(STR(m.自定義長度/10,10,1)),".0")+" mm)"
Endif
Next
Crea curs 印表機資訊 (紙張名稱 c(64),紙張編號 n(3))
Appe from arra 紙張類型陣列
Go top
Local 最大紙張,最小紙張,最大長度毫米,最大寬度毫米,最小長度毫米,最小寬度毫米
最小紙張=DeviceCapabilities(m.印表機, m.埠, DC_MINEXTENT, 0, 0)
最大紙張=DeviceCapabilities(m.印表機, m.埠, DC_MAXEXTENT, 0, 0)
最大長度毫米=INT(M.最大紙張/65536)
最大寬度毫米=INT(MOD(M.最大紙張,65536))
最小長度毫米=INT(M.最小紙張/65536)
最小寬度毫米=INT(MOD(M.最小紙張,65536))
Brow titl "印表機: "+m.印表機+" 的資料, 紙張長度(mm):"+ltri(str(m.最小長度毫米))+"..."+ltri(str(m.最大長度毫米))+" 紙張寬度(mm):"+ltri(str(m.最小寬度毫米))+"..."+ltri(str(m.最大寬度毫米))
Retu
**************************
二.抓出預設的印表機.
利用Win32 API您可以存取.INI檔中的資訊,以下範例中,筆者將利用3個Win32 API來取得可用印表機、系統預設的印表機及變更預設印表機:
Declare GetProfileString in win32api string,string,string,string @,integer
Declare WriteProfileString in win32api string,string,string
Declare GetProfileSection in win32api string,string @,integer


xBuffer=space(1000)
=GetProfileSection("PrinterPorts",@xBuffer,1000)
&& 第一個參數為 Section 名稱,第二個參數為 BUFFER ,第三個參數為 BUFFER 長度

註:關於 INI 結構請自行參考 WINDOWS SDK

xDefaultPrinter=space(50)
=GetProfileString("windows","device","stam",@xDefaultPrinter,50)
&&由 INI 檔取得預設印表機名稱,第一個參數為 Section 名稱,第二個參數為 ITEM 名稱,
第三個參數為 stam 預設值,取得該 section 是否存在,第四個參數為 BUFFER,第五個參數為 BUFFER 長度

printer1=atc(",",xBuffer,3)-1
printer2=arc(char(0),xBuffer)-1

NewPrinter=left(xBuffer,iif(lnTemp2>printer1,printer1,printer2)

=WriteProfileString("windows","device",NewPrinter)

*********************************
三.expr構造及對映的函數
******EXPR 內容
* for win98
DRIVER=winspool
DEVICE=Epson LQ-1170C
OUTPUT=\\ntsrv\lq1170c
ORIENTATION=0 ==> prtinfo(1)
PAPERSIZE=256 ==> prtinfo(2)
PAPERLENGTH=1397 ==> prtinfo(3)
PAPERWIDTH=2159 ==> prtinfo(4)
DEFAULTSOURCE=8 ==> prtinfo(7)
PRINTQUALITY=180 ==> prtinfo(Cool
YRESOLUTION=180 ==> prtinfo(11)
TTOPTION=1 ==> prtinfo(12)
*********for win2k
DRIVER=winspool
DEVICE=Epson LQ-1170C
OUTPUT=USB004
ORIENTATION=0
PAPERSIZE=130
ASCII=130 ==>???prtinfo(5 ? )=printed output is scaled
COPIES=1 ==> prtinfo(6)
DEFAULTSOURCE=15
PRINTQUALITY=180
COLOR=1 ==> prtinfo(9)
YRESOLUTION=180
TTOPTION=2
COLLATE=1 ==> ???

**************************************

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
ICTANG



註冊時間: 2003-03-18
文章: 11
來自: Taipei

第 8 樓

發表發表於: 星期一 五月 05, 2003 2:51 pm    文章主題: 引言回覆

看了大家的方法,感覺似乎都不是很好,我有一個想了2天的方案:
1.原因:WIN 95/98下自訂紙張:PAPERSIZE=256,WINXP/2000下,可自訂多種紙張格式.所以PAPERSIZE變成不固定(每台PRINTER均由1開始向後排,排到USER DEFINED已排到100多號.
2.結果:相同PRINTER,相同USER DEFINED在不同PC,PAPERSIZE不見的相同.
3.解決:
A.REPORT FORM 放在網路上,製作時當然是以自己的PC設定一個PRINTER NAME(如'訂單印表機',其預設紙張大小為850*600)設為本REPORT之輸出印表機
B.每台PC也同樣依照相同方法設定相同PRINTER NAME及相同預設紙張大小
C.程式:
.將REPORT FORM COPY至PC
.依PC狀況改PAPERSIZE
.列印
D.結果:果然OK
E.參考程式:
M.REPFORM=USERPRINT('F:\PROG\REPORT\AAA.FRX')
REPORT FORM (M.REPFORM) NOCONSOLE TO PRINT PROMPT

FUNCTION USERPRINT
PARAMETERS M.REPORTFILE
LOCAL M.ALNAME,M.TMPBUFDIR,M.TMPLEN,M.REPORTFIL2,M.REPFILE,M.REPFIL2,M.PRNNAME,;
M.DEVICEPOS,M.SPNAME,M.II,M.PAPERCODE,M.NEWSIZE,M.PSIZEPOS,M.OLDSIZE
M.ALNAME=ALIAS()

**1.COPY REPORT FORM 到 TMP路徑
DECLARE LONG GetTempPath IN kernel32 LONG, STRING @lcTmpDir
M.TMPBUFDIR=SPACE(255)
M.TMPLEN=GetTempPath(255,@TMPBUFDIR)

IF AT(".FRX",M.REPORTFILE)=0
M.REPORTFILE=M.REPORTFILE+".FRX"
ENDIF
M.REPORTFIL2=LEFT(M.REPORTFILE,RAT('.',M.REPORTFILE)-1)+".FRT"
M.REPFILE=LEFT(TMPBUFDIR,M.TMPLEN)+SUBSTR(M.REPORTFILE,RAT('\',M.REPORTFILE)+1)
M.REPFIL2=LEFT(TMPBUFDIR,M.TMPLEN)+SUBSTR(M.REPORTFIL2,RAT('\',M.REPORTFIL2)+1)
SETSAFETY=SET("SAFETY")
SET SAFETY OFF
COPY FILE (M.REPORTFILE) TO (M.REPFILE)
COPY FILE (M.REPORTFIL2) TO (M.REPFIL2)
IF M.SETSAFETY="ON"
SET SAFETY ON
ENDIF

**2.以USE方式打開報表文件,找到保存印表設定的參數記錄
SELECT 0
USE (M.REPFILE)
LOCATE FOR Objtype = 1 AND Objcode = 53

**3.尋找印表機名稱(M.PRNNAME)
M.PRNNAME=''
M.DEVICEPOS=AT("DEVICE",EXPR)+6
IF M.DEVICEPOS=6
USE
IF !EMPTY(M.ALNAME)
SELECT (M.ALNAME)
ENDIF
RETURN M.REPFILE
ENDIF
FOR II=1 TO 100
M.SPNAME=SUBSTR(EXPR,M.DEVICEPOS+II,1)
IF M.SPNAME=CHR(13) OR M.SPNAME=CHR(13)
EXIT
ELSE
M.PRNNAME=M.PRNNAME+M.SPNAME
ENDIF
NEXT II

**4.定義此印表機預設值
M.PAPERCODE=PRTINFO(2,M.PRNNAME)
IF M.PAPERCODE<0 &&無此印表機
USE
IF !EMPTY(M.ALNAME)
SELECT (M.ALNAME)
ENDIF
RETURN M.REPFILE
ENDIF
M.NEWSIZE="PAPERSIZE="+ALLTRIM(STR(M.PAPERCODE,10))
M.PSIZEPOS=AT("PAPERSIZE",EXPR)+9
IF M.PSIZEPOS=9
USE
IF !EMPTY(M.ALNAME)
SELECT (M.ALNAME)
ENDIF
RETURN M.REPFILE
ENDIF
M.OLDSIZE="PAPERSIZE="
FOR II=1 TO 10
M.SPNAME=SUBSTR(EXPR,M.PSIZEPOS+II,1)
IF M.SPNAME=CHR(13) OR M.SPNAME=CHR(13)
EXIT
ELSE
M.OLDSIZE=M.OLDSIZE+M.SPNAME
ENDIF
NEXT II
REPL EXPR WITH STRTRAN(EXPR,M.OLDSIZE,M.NEWSIZE)
USE
IF !EMPTY(M.ALNAME)
SELECT (M.ALNAME)
ENDIF

RETURN M.REPFILE

F:希望大家多多提供看法
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 9 樓

發表發表於: 星期三 五月 07, 2003 11:58 pm    文章主題: 引言回覆

方法不錯, 可由程式自動設定REPORT的印表資料, 但對於由程式自動設定印表機的PAPERSIZE的方面似乎還沒有解決方式, 不知道是否有API可以使用呢?
_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
ICTANG



註冊時間: 2003-03-18
文章: 11
來自: Taipei

第 10 樓

發表發表於: 星期四 五月 08, 2003 8:53 am    文章主題: 引言回覆

由印表機及紙張定義名稱來判斷papersize請參考http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q304639
稍加修改,run起來速度很慢,不如直接在user端定義一台印表機及設定紙張預設格式為想輸出的紙張格式.如此報表設計就不需考慮user狀況.papersize由PRTINFO(2,M.PRNNAME)即可解決.
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 11 樓

發表發表於: 星期三 五月 28, 2003 7:24 pm    文章主題: 引言回覆

*************轉貼自 http://www.myf1.net/bbs/dispbbs.asp?boardID=1&ID=207762

VfpPrinter——快樂列印(完全版)
*********************************VFP中用程式對於列印實現完全控制*******************
*程式設計、開發人:sulsul
*本控制項免費提供給各位個人使用,如果用於商業用途請聯繫我:E_mail:sulsul@eyou.com
*本控制項還存在一些BUG,不完善的地方希望各位能夠指出
*使用本控制項最好在VFP7以上版本使用,那樣可以得到更多提示
*本控制項默認長度單位爲:微米 (即列印長度爲1000的線條,實際上列印長度爲1毫米)
**************************************************************************

*先將本控制項下載後、放入表單該名爲printer
With Thisform.Printer
*1、列印長度單位設置(默認:微米)
.print_ModeType= 0 && micron
*********具體設置
* .print_ModeType= 0 && micron ——微米
* .print_ModeType= 1 && Twip ——緹
* .print_ModeType= 2 && Point ——磅
* .print_ModeType= 3 && Inch ——英寸
* .print_ModeType= 4 && Millimeter ——毫米
* .print_ModeType= 5 && Centimeter ——釐米

*2、列印縮放比例(默認100)
* .vfp_Zoom=100
*3、選擇打印紙張、如果沒有自動添加(實用於WINDOW95、98、NT、2000)
*現在在NT、2000下添加紙張就太方便了
?.SelectPaper(Thisform.HWnd,"VfpPrinter",210000,300000)
&&如果已經存在同樣大小紙張返回——1(選擇該種紙張)、添加成功返回——2、錯誤返回——0

*4、列印文字
.Text("歡迎你使用VFPPrinter控制項")
*5、列印格式
Printer_FormatText=.vfp_Format(1000000,"###,####,###") &&列印結果:1,000,000
?Printer_FormatText
.Text(Printer_FormatText)
*或者採用
.ftext(1000000,"###,####,###") &&列印結果:1,000,000
*****此函數結合了.text與.Vfp_Format的功能
*********************格式明細:
*///數值型支援
?.vfp_Format(1000000,"###,####,###") &&1,000,000
?.vfp_Format(1000000,"###,####,##") &&1,000,000
?.vfp_Format(88.1868,"0000000.00%") &&8818.68%
?.vfp_Format(88.1868,"0000000.0000%%") &&881868.0000%%
*///字元型支援大小寫
?.vfp_Format("Welcome to Vfp",">") &&轉化爲大寫
?.vfp_Format("Welcome to Vfp","<") &&轉化爲小寫
*///日期型支援格式
*////時間型
?.vfp_Format(Time(),"hh:mm:ss") &&22:01:01
?.vfp_Format(Time(),"hh:mm:ss AMPM") &&10:01:01 PM
*////日期型
?.vfp_Format(Date(),"D MM YYYY") &&16 05 2003
?.vfp_Format(Date(),"DD MM YYYY") &&16 05 2003
?.vfp_Format(Date(),"DDD MM YYYY") &&Fri 05 2003
?.vfp_Format(Date(),"DDDD MM YYYY") &&Friday 05 2003
?.vfp_Format(Date(),"DDDDD MM YYYY") &&2003-05-16 05 2003
?.vfp_Format(Date(),"DDDDDD MM YYYY") &&2003年5月16日 05 2003
?.vfp_Format(Date(),"D M YYYY") &&16 5 2003
?.vfp_Format(Date(),"D MM YYYY") &&16 05 2003
?.vfp_Format(Date(),"D MMM YYYY") &&16 May 2003
?.vfp_Format(Date(),"D MMMM YYYY") &&16 May 2003
?.vfp_Format(Date(),"D M YY") &&16 05 03
?.vfp_Format(Date(),"D M YYYY") &&16 05 2003
?.vfp_Format(Date(),"YYYY年MM月DD日") &&2003年5月16日
*////日期時間型
?.vfp_Format(Datetime(),"hh:mm:ss YYYY年MM月DD日") &&22:01:01 2003年5月16日
**********************************************************
*6、得到需要列印的文字的寬度、長度
Printer_TextWidth=.TextWidth("歡迎你使用VFPPrinter控制項")
Printer_TextHeight=.TextHeight("歡迎你使用VFPPrinter控制項")
Printer_TextHeight=.TextHeight(.vfp_Format(Date(),"YYYY年MM月DD日"))
*7、設置列印文字的格式
.Font.Size=12 &&列印文字的大小
.Font.Bold =.T. &&粗體
.Font.Italic =.T. &&斜體
.Font.Underline =.T. &&下劃線
.Font.Name ="abc" &&

*8、列印線條
.pline(10000,20000,10000,0)
&&列印對應的分別時X(橫軸)-開始位置、Y(縱軸)-開始位置、X-的增加長度、Y-增加長度
****列印長度爲10毫米的橫向
*9、列印圓
.pcircle(10000,100000,2000) &&列印對應的分別時X(橫軸)-開始位置、Y(縱軸)-開始位置、圓的半徑
*10、列印點
.PDot (10000,10000) &&列印點
*11、列印圖片文件
*.ppicture("c:\foxpro\fox.bmp",1000,1000) &&列印圖片
*12、設置文字的列印位置
.atX=1000
.aty=1000
.Text("歡迎你使用VFPPrinter控制項")
*13、列印位置遞增
.Skip(1500) &&向下移動1500微米
.Text("歡迎你使用VFPPrinter控制項")
*14、取得當前設置的印表機名稱
Printer_Name=.DeviceName
*15、設置列印線條的寬度
.DrawWidth =3 &&列印線條的寬度
*16、翻紙
.pNewpage &&過頁、翻紙
*17、返回當前頁號
?.PpageNo &&返回當前頁號
*18、打印紙張高度
?.printHeight &&紙張列印高度
?.printWidth &&紙張列印寬度
*19、列印質量
.Printquality= -4 && Vfp_high
?.Printquality &&設置紙張列印質量
*20、選擇印表機(名稱一定要全)
*?.selectPrinter("Epson 2000K")
*21、設置頁邊距
**********************
.pScaleHeight=1000
.pscaleLeft =500
.pscaleTop =150000
.pScaleWidth =100000
?.pScaleHeight
?.pscaleLeft
?.pscaleTop
?.pScaleWidth
*22、結束列印、將列印命令發給印表機
.Endprint &&結束列印、將列印命令發給印表機
*23、取消列印
*.killPrint &&取消列印
*24、列印矩形(按長度)
*列印矩形(按長度) 從(AtX,AtY)位置開始列印長爲LongX,寬爲LongY的矩形
.PBoxLong(10000,10000,20000,10000)
*列印(按點) 從(X1,Y1)-(X2,Y2)
.PBoxPoint(10000,10000,30000,20000)
Endwith

*希望各位FOXER迅速VFP擺脫列印的痛苦
*如何問題請聯繫我 E_mail: sulsul@eyou.com

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 12 樓

發表發表於: 星期五 三月 19, 2004 9:34 am    文章主題: 引言回覆

引言回覆:

三.expr構造及對映的函數
******EXPR 內容
* for win98
DRIVER=winspool
DEVICE=Epson LQ-1170C
OUTPUT=\\ntsrv\lq1170c
ORIENTATION=0 ==> prtinfo(1)
PAPERSIZE=256 ==> prtinfo(2)
PAPERLENGTH=1397 ==> prtinfo(3)
PAPERWIDTH=2159 ==> prtinfo(4)
DEFAULTSOURCE=8 ==> prtinfo(7)
PRINTQUALITY=180 ==> prtinfo(
YRESOLUTION=180 ==> prtinfo(11)
TTOPTION=1 ==> prtinfo(12)
*********for win2k
DRIVER=winspool
DEVICE=Epson LQ-1170C
OUTPUT=USB004
ORIENTATION=0
PAPERSIZE=130
ASCII=130 ==>???prtinfo(5 ? )=printed output is scaled
COPIES=1 ==> prtinfo(6)
DEFAULTSOURCE=15
PRINTQUALITY=180
COLOR=1 ==> prtinfo(9)
YRESOLUTION=180
TTOPTION=2
COLLATE=1 ==> ???


小補充,
VFP 6.0(SP5) ,VFP 7.0(SP1),VFP 8.0 (SP1)
似乎於WIN 2000 以上OS執行PRTINFO(3) ,PRTINFO(4) 均會傳回 -1
所以上面 兩種設定不太一樣,

由 Vfp8報表新功能(轉貼)
http://vfp.sunyear.com.tw/viewtopic.php?t=891&highlight=VFP8
印表機資訊寫在 EXPR,TAG,TAG2 中,
故於 WIN 2K / XP 執行重寫 EXPR 時,也須清除 TAG,TAG2中的印表機資訊,
否則即便重寫印表機設定,一樣印不出自訂格式.

PRTINFO(2) 所取得的格式在 WIN 2K/XP 中 印表機內容中[列印喜好設定]中所指定的格式,非列印預設值或裝置設定值,這點也請注意.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 13 樓

發表發表於: 星期五 三月 19, 2004 9:57 am    文章主題: 引言回覆

再補充
如果你選擇的是內含報表的形式編譯執行檔,
則在你編修好自訂格式存檔後,
作以下動作:
use xxxx.frx
go top
replace tag with ''
replace tag2 with ""

這樣作的話,
目前機器的紙張格式雖當然會與報表中所設定的格式不同,
不過仍會設定成印表機內容中[列印喜好設定]中所指定的格式,
是A4預覽或印表就是A4,是中一刀就是中一刀,
expr 也不需要每次重寫.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
wancheng



註冊時間: 2004-04-01
文章: 24


第 14 樓

發表發表於: 星期五 五月 28, 2004 7:47 pm    文章主題: 引言回覆

看來大家在使用 VFP 印報表都有很多見解經驗了,
不過似乎仍未有人有完整的解決程式,
小弟再補充一個自己的經驗:

如同大家所說的:
我有一個資料表存放定義報表:

1.報表要輸出使用的印表機名稱,
2.所使用的紙張定義編號,
3.紙張大小(配合 98使用的, XP,2000 則不需要,但需自行先定義自訂紙張大小)

然後在程式列印報表時, 將原報表檔複製到另一暫存報表,
再修改暫存報表檔中的 EXPR, 並將 TAG 和 TAG2 清除,
我試過這樣的作法大致可行,
惟獨在 XP 中, 如果要輸出到另一部不是預設的印表機的話,
似乎沒辦法, 它仍然會輸出到預設的印表機, 而不是我指定
的印表機, 不知有沒有人有其他解決的辦法呢?
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 15 樓

發表發表於: 星期一 五月 31, 2004 8:14 am    文章主題: 引言回覆

有,很簡單,
公司的系統就是這樣,
曾經不小心在"紅狐"漏出來一點,
但是這部分就靠您自己想了,

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2  下一頁
1頁(共2頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作