Máte i vy problémy s tiskem sestav?
Snad se mnou budete souhlasit, že tisk sestav nepatří k nejoblíbenějším činnostem programátora ve Visual FoxPro. Popis jednotlivých problémů a jejich řešení by se asi ani do QUASu nevešel. Pokusme se tedy aspoň shrnout základní informace nutné k vytvoření univerzálního formuláře pro tisk sestav.
1. Nejprve si vytvořte základní (a jediný) formulář pro tisk všech sestav. Jméno požadované sestavy budeme předávat jako parametr metodě Init() a ta uloží tento parametr do nové vlastnosti (property) ThisForm.Frx:
LPARAMETERS pFrx
ThisForm.Frx = pFrx
2. Tento formulář bude schopen sám zjistit informace o tiskárnách na počítači uživatele. Vytvořte proto dvě nové vlastnosti formuláře: ThisForm.nPrinterCount (bude obsahovat počet nainstalovaných tiskáren) a ThisForm.aPrinterList[1,2] (pole nainstalovaných tiskáren). Naplníme je v metodě ThisForm.Load():
ThisForm.nPrinterCount = APRINTERS(ThisForm.aPrinterList)
3. Na formulář umístěte Combobox pro výběr tiskárny. Nastavme vlastnosti tak, aby obsahoval seznam všech nainstalovaných tiskáren:
RowSourceType = 5 - Array
RowSource = ThisForm.aPrinterList
Style = 2 - DropDown List
4. Teď je ještě třeba najít v tomto Comboboxu hodnotu odpovídající v současnosti nastavené výchozí tiskárně Windows. Její hodnotu nám vrátí funkce
SET("PRINTER", 3)
takže stačí v metodě Init() Comboboxu provést cyklus:
FOR i = 1 TO ThisForm.nPrinterCount
IF UPPER(ThisForm.aPrinterList[i,1])==UPPER(SET("printer",3))
This.Value = ThisForm.aPrinterList[i,1]
EXIT
ENDIF
ENDFOR
5. Na formulář ještě umístíme CommandButton pro vlastní tisk (v testovacím prostředí místo toho budeme mít možnost opravit sestavu)
Caption = "TISK"
Jeho metoda Click():
IF ... && zda program běží v testovacím prostředí nebo u uživatele<br>
MODIFY REPORT (ThisForm.Frx)
ELSE
SET PRINTER TO NAME (ThisForm.cmbPrn.Value)
REPORT FORM (ThisForm.Frx) TO PRINT NOCONSOLE ...
ENDIF
POZOR - v příkazu SET PRINTER je použita fráze NAME!
Formulář máme hotov, všechno funguje na našem PC tak, jak má. Ale generátor sestav má na nás připravenu ještě jednu zradu: při vytváření sestavy si VFP většinou uloží do údajů Tag (binárně), Tag2 (binárně) a Expr (textově) informace o v současnosti nastavené tiskárně a při tisku u uživatele bude vyžadovat tento driver tiskárny. Je tedy nezbytné tyto informace ze sestavy vymazat. K tomu lze použít následující příkazy (ve skutečnosti si asi každý vytvoří program, který před tvorbou APP/EXE projde celý adresář a vymaže tyto informace ve všech sestavách):
USE MYREPORT.FRX
LOCATE FOR ObjType = 1 AND ObjCode = 53 && je to první věta FRX<br>
REPLACE Tag WITH "", Tag2 WITH "", Expr WITH ""<br>
USE
A ještě poslední poznámku - údaj Expr obsahuje například tyto informace :
DRIVER=winspool
DEVICE=HP LaserJet 4
OUTPUT=FILE:
ORIENTATION=0
PAPERSIZE=9
ASCII=9
COPIES=1
DEFAULTSOURCE=15
PRINTQUALITY=600
COLOR=1
YRESOLUTION=600
TTOPTION=3
COLLATE=1
Pokud potřebujete za běhu programu změnit nastavení tiskárny, můžete naplnit údaj Expr požadovanými hodnotami - například pokud chcete tisknout na šířku, zapíšete do Expr:
ORIENTATION=1
Přeji vám hezké vánoce a přeji vám, aby rok 2000 nebyl pro vaše programy rokem 1900.
Milan Kosina, kosina@vol.cz