在vfp中创建某种报告时我遇到了困难。我创建了一个文本文件,使用了?/ ??命令写入文件,然后使用Web浏览器(以vfp格式的OLE对象)打开它。
Set Printer To 'C:\temp\test.txt'
set printer on
set console off
?? 'test'
然后我打电话给我的prg:
PARAMETERS pUrl
lcURL = pUrl
PUBLIC oForm
oForm = CREATEOBJECT('IEForm')
oForm.SHOW()
oForm.oIE.Navigate2(m.lcURL)
READ events
DEFINE CLASS IEForm AS FORM
CAPTION = 'Report Preview'
HEIGHT = 512
WIDTH = 792
AUTOCENTER = .t.
ADD OBJECT oIE AS OLECONTROL WITH ;
HEIGHT=512,WIDTH=792,OLECLASS="Shell.Explorer",ANCHOR=195
PROCEDURE oIE.REFRESH
NODEFAULT
ENDPROC
ENDDEFINE
并使用C:\ temp \ test.txt作为网址。
这很好用。但是当我使用fcreate创建文本文件(不使用现有的文本文件)时会出现问题
lcfile ='C:\temp\'+SYS(2015)+'.txt'
lchandle=FCREATE(lcfile)
Set Printer To lcfile
使用时有时会出现问题吗? (导致空白文档),有时浏览器无法导航到该文件。
第二个问题是:如果我在IEform中将windowtype属性设置为modal,则浏览器无法导航到文本文件。我需要将其设置为模态,因为我必须延迟执行的其余部分,直到预览表单关闭。
我希望我能够清楚地描述这种情况。 谢谢你帮助我:)
答案 0 :(得分:1)
我会避免使用SET PRINTER TO,只使用fcreate(),fwrite()和fclose(),特别是在写入大量文本时。如果只写少量数据,我只需要将每个组件附加到前一个并添加cr / lf而不是“?”来构建一个长字符串。对于新行,然后通过StrToFile()将整个结果写入ONCE文件。这样,您不必担心事情是否实际关闭(如果您不清除设置的打印机,将打印机设置为,或fclose()。。作为一个不完整的文件,浏览器将无法导航,因为文件句柄可能被“锁定”以阅读任何内容。
选项1 - 构建字符串
lcCRLF = chr(13)+chr(10)
lcMyOutput = "Some Text to Start with" + lcCRLF ;
+ "Today is: " + dtoc( date() ) + lcCRLF
use SomeTable
scan
lcMyOutput = lcMyOutput + "Some Field: " + SomeCharField;
+ "A numeric field: " + transform( SomeNumberField, "999,999.99" ) + lcCRLF
endscan
lcMyOutput = lcMyOutput + "All Done"
lcOutputFile = "C:\Temp\" + sys(2015) + ".txt"
StrToFile( lcMyOutput, lcOutputFile )
选项2 - 使用fcreate(),fwrite(),fclose()
lnHandle = 0
do while .t.
lcOutputFile = "C:\Temp\" + sys(2015) + ".txt"
lnHandle = fcreate( lcOutputFile )
*/ Only get out if we have a proper handle and thus
*/ we are exclusive to it for duration of our process
if( lnHandle > 0 )
exit
endif
enddo
lcCRLF = chr(13)+chr(10)
fwrite( lnHandle, "Some Text to Start with" + lcCRLF ;
+ "Today is: " + dtoc( date() ) + lcCRLF )
use SomeTable
scan
fwrite( lnHandle, "Some Field: " + SomeCharField;
+ "A numeric field: " + transform( SomeNumberField, "999,999.99" ) + lcCRLF )
endscan
fwrite( lnHandle, "All Done" )
fclose( lnHandle )
要使用RUN命令运行“批处理”文件尝试,请将所需内容构建到字符串中,然后运行... ex:
lcCommandToRun = '"' + sys(5) + sys(2003) + '\Compress.tzs"'
run ( lcCommandToRun )
我不知道是否由于sys(2003)结果路径中的空格将RUN转换为多参数解释而失败,它将失败。通过将整个文本包装在双引号中,它将阻止这种“路径”问题。
其他反馈
尝试使用“?”模拟DOT矩阵打印机的预览到文本文件不是我会尝试的东西。我只是做一个标准的报告,并用“?”手动绘制你正在做的所有数据。如果用户想要预览报告,或者发送到激光打印机,请让正常的报告版本通过Windows处理生成,字体等等。将古代代码保留为点阵,使用任何特定的字体渲染代码。我只是保持实际的报告版本关闭你的“?”版本