创建txt文件并在vfp表单内的Internet浏览器中显示它

时间:2012-05-21 09:42:09

标签: ole visual-foxpro

在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,则浏览器无法导航到文本文件。我需要将其设置为模态,因为我必须延迟执行的其余部分,直到预览表单关闭。

我希望我能够清楚地描述这种情况。 谢谢你帮助我:)

1 个答案:

答案 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处理生成,字体等等。将古代代码保留为点阵,使用任何特定的字体渲染代码。我只是保持实际的报告版本关闭你的“?”版本