0

在 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 作为 url。

这工作正常。但是当我使用 fcreate 创建文本文件时出现问题(不使用已经存在的文本文件)

 lcfile ='C:\temp\'+SYS(2015)+'.txt'
 lchandle=FCREATE(lcfile)
 Set Printer To lcfile

使用时有时会出现问题?(导致空白文档),有时浏览器无法导航到该文件。

第二个问题是:如果我在 IEform 中将 windowtype 属性设置为 modal,浏览器将无法导航到文本文件。我需要将其设置为模态,因为我必须延迟执行的其余部分,直到预览表单关闭。

我希望我描述的情况足够清楚。感谢你们对我的帮助 :)

4

1 回答 1

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 命令运行您的“批处理”文件尝试,请将您想要的内容构建为字符串,然后运行...例如:

lcCommandToRun = '"' + sys(5) + sys(2003) + '\Compress.tzs"'
run ( lcCommandToRun )

我不知道它是否由于 sys(2003) 结果路径中的空格将 RUN 转换为多参数解释而失败,它会失败。通过将整个文本包含在双引号中,可以防止此类“路径”问题。

额外的反馈

尝试使用“?”模拟点阵打印机的预览。到文本文件不是我会尝试的。我只会做一个标准报告,并用你用“?”手动做的所有数据来绘制它。如果用户想要预览报告,或者发送到激光打印机,让通过Windows处理的正常报告版本为您完成生成、字体等。使用您拥有的任何特定字体渲染代码将古老的代码留在点阵中。我只会将实际报告版本保持在您的“?”附近。版本。

于 2012-05-21T11:54:00.020 回答