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

? を使用すると問題が発生することがあります。(空白のドキュメントになります)、ブラウザがファイルに移動できない場合があります。

2 つ目の問題は、IEform で windowtype プロパティをモーダルに設定すると、ブラウザがテキスト ファイルに移動できないことです。プレビューフォームが閉じられるまで残りの実行を遅らせる必要があるため、モーダルに設定する必要があります。

状況を十分に明確に説明したことを願っています。助けてくれてありがとう :)

4

1 に答える 1

1

特に大量のテキストを書き込む場合は、SET PRINTER TOの使用を避け、fcreate()、fwrite()、およびfclose()を使用します。少量のデータのみを書き込む場合は、各コンポーネントを前に追加するだけで1つの長い文字列を作成し、「?」の代わりにcr/lfを追加します。新しい行の場合は、StrToFile()を介して結果全体を1回ファイルに書き込みます。このように、物事が実際に閉じられているかどうかを心配する必要はありません(set printer off、set printer to、または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がマルチパラメータ解釈に変わったために失敗したかどうかはわかりませんが、失敗します。テキスト全体を二重引用符で囲むことにより、このような「パス」の問題を防ぎます。

追加のフィードバック

「?」を使用してDOTマトリックスプリンターのプレビューをシミュレートしようとしています テキストファイルに変換することは、私が試みることではありません。標準のレポートを作成し、「?」を使用して手動で実行しているすべてのデータを使用してレポートを作成します。ユーザーがレポートをプレビューしたり、レーザープリンターに送信したりする場合は、生成やフォントなどのためにWindowsで処理される通常のレポートバージョンを使用してください。古代のコードは、特定のフォントレンダリングコードを使用してドットマトリックスに移動したままにします。実際のレポートバージョンをあなたの「?」の近くに置いておきます バージョン。

于 2012-05-21T11:54:00.020 に答える