Visual FoxPro 9.0 — Referenční příručka
Komplexní průvodce jazykem a prostředím | Verze 9.0 SP2 | Český jazyk
Visual FoxPro 9.0 je objektově orientovaný procedurální jazyk s integrovaným databázovým enginem. Tato příručka pokrývá celý jazyk od základní syntaxe po pokročilé techniky včetně OOP, SQL, COM a tvorby formulářů.
1. Úvod a historie
Visual FoxPro (VFP) je integrované vývojové prostředí a programovací jazyk pro tvorbu databázových aplikací pro Windows. Vychází z dBASE/FoxBASE rodiny xBase jazyků.
Historický přehled
| Verze | Rok | Klíčové novinky |
| FoxBASE+ | 1986 | dBASE klon firmy Fox Software |
| FoxPro 1.0–2.6 | 1989–1993 | Rushmore optimalizace, GUI nástroje |
| Visual FoxPro 3.0 | 1995 | OOP, DBC databázový kontejner |
| VFP 5.0–6.0 | 1997–1998 | COM Automation, ActiveX |
| VFP 7.0–8.0 | 2001–2003 | Intellisense, TRY/CATCH, XMLAdapter |
| VFP 9.0 | 2004 | Vylepšený Report Designer, CursorAdapter, lepší SQL |
| VFP 9.0 SP2 | 2007 | Poslední oficiální verze, ukončení vývoje |
Životní cyklusMicrosoft ukončil podporu produktu v roce 2015. Existuje však aktivní komunita (VFPX na GitHubu) udržující rozšíření a opravy. VFP 9 SP2 stále funguje na všech moderních verzích Windows včetně Windows 11.
Klíčové vlastnosti
- Integrovaný databázový engine s formátem
.dbf (max. 2 GB na tabulku)
- Lokální i SQL Server přístup k datům
- Plnohodnotné OOP — dědičnost, polymorfismus, vizuální dědičnost tříd
- SQL syntaxe pro práci s lokálními i vzdálenými daty
- Rushmore optimalizace dotazů přes indexy
- Vestavěný Form Designer, Report Designer, Class Designer
- COM/COM+ servery, ActiveX hosting
- Práce s XML přes
XMLAdapter a CursorAdapter
2. IDE a prostředí
Hlavní okna
- Command Window — interaktivní okno pro psaní příkazů, otevírá se přes Ctrl+F2
- Project Manager — správa projektu a všech jeho souborů (
.pjx)
- Form Designer — vizuální návrh formulářů
- Report Designer — návrh reportů (přepracovaný ve VFP 9)
- Class Designer — vizuální tvorba a editace tříd
- Database Designer — návrh struktury DBC s relacemi
Typy souborů
| Přípona | Obsah |
.prg | Program (zdrojový kód) |
.fxp | Zkompilovaný program |
.dbf | Tabulka (volná, nebo součást DBC) |
.fpt | Memo soubor k tabulce |
.cdx | Strukturální složený index k tabulce |
.idx | Samostatný (single) index |
.dbc | Databázový kontejner |
.scx / .sct | Formulář |
.vcx / .vct | Knihovna vizuálních tříd |
.frx / .frt | Report |
.mnx / .mnt | Menu |
.pjx / .pjt | Projekt |
.app / .exe | Zkompilovaná aplikace |
Spouštění a kompilace z příkazového okna
DO mojeProgram && spuštění .prg souboru
COMPILE mojeProgram && kompilace na .fxp
MODIFY COMMAND mojeProgram && otevření v editoru
BUILD APP mujProjekt FROM mujProjekt.pjx
BUILD EXE mujProjekt FROM mujProjekt.pjx
3. Základní syntaxe
Obecná pravidla
- Jazyk je case-insensitive —
SELECT, Select a select jsou totéž.
- Identifikátory mohou mít až 254 znaků, začínají písmenem nebo podtržítkem.
- Příkaz se ukončuje koncem řádku. Pro pokračování na další řádek se používá středník
;.
- Klíčová slova lze zkracovat na první 4 znaky:
REPLACE = REPL, MODIFY = MODI.
Komentáře
* Komentář na celém řádku (musí být první znak)
&& Komentář na konci řádku
NOTE Toto je také komentář
? "Hello" && vypíše Hello
Pokračování řádku
SELECT jmeno, prijmeni, ;
narozeni, mesto ;
FROM klienti ;
WHERE aktivni = .T.
Logické konstanty
Pravdivostní hodnoty se zapisují jako .T. (true) a .F. (false). Lze také .Y./.N. pro yes/no a .NULL. pro nedefinovanou hodnotu.
Literály
cText = "Petr" && řetězec (uvozovky nebo apostrofy)
cText2 = 'Klient: "Novák"'
nCislo = 3.14 && číslo
nHex = 0x1A && hexadecimálně (= 26)
dDatum = {^2026-05-05} && ISO formát data — vždy bezpečné
tDatCas = {^2026-05-05 14:30:00}
lLog = .T.
xNic = .NULL.
Pozor na formát dataZápis {05/05/2026} závisí na SET DATE a může se chovat různě. Vždy používejte ISO formát {^YYYY-MM-DD}, který je nezávislý na nastavení.
4. Datové typy
Datové typy proměnných
| Typ | Symbol | Rozsah / popis |
| Character | C | Řetězec, max. 16 777 184 znaků |
| Numeric | N | Číslo s plovoucí čárkou, ±0.99999×10⁻¹⁹ až 0.99999×10²⁰ |
| Currency | Y | Měna, 4 desetinná místa, ±922 337 203 685 477.5807 |
| Date | D | Datum, 01/01/0001 až 12/31/9999 |
| DateTime | T | Datum a čas |
| Logical | L | .T. / .F. |
| Integer | I | Celé číslo, –2 147 483 647 až 2 147 483 647 |
| Double | B | 64-bit floating point |
| Memo | M | Dlouhý text uložený v .fpt |
| General | G | OLE objekt |
| Object | O | Reference na objekt |
| Variant | V | Variant, generic field |
| Blob | W | Binární data (od VFP 9)VFP 9 |
| Varchar | V | Řetězec proměnné délky VFP 9 |
| Varbinary | Q | Binární data proměnné délky VFP 9 |
Datové typy v tabulkách (DBF)
Při definici sloupce v CREATE TABLE nebo Table Designeru se uvádí typ a délka:
CREATE TABLE klienti ( ;
id I, ; && integer
jmeno C(30), ; && character, 30 znaků
prijmeni C(50), ;
narozeni D, ; && date
plat Y, ; && currency
poznamka M, ; && memo
aktivni L, ; && logical
vytvoreno T, ; && datetime
foto W, ; && blob (VFP 9)
email V(100) ; && varchar (VFP 9)
)
Konverzní funkce
| Funkce | Konverze |
VAL(c) | Řetězec → číslo |
STR(n, len, dec) | Číslo → řetězec |
TRANSFORM(x, [pic]) | Cokoli → formátovaný řetězec |
CTOD(c) | Řetězec → datum (závisí na SET DATE) |
DTOC(d) | Datum → řetězec |
DTOS(d) | Datum → řetězec ve formátu YYYYMMDD |
CTOT(c) | Řetězec → datetime |
TTOC(t) | Datetime → řetězec |
CHR(n) / ASC(c) | Číslo ↔ ASCII znak |
BINTOC(n, [size]) | Číslo → binární řetězec |
CTOBIN(c) | Binární řetězec → číslo |
CAST(expr AS type) | SQL-style přetypování |
? VAL("123.45") && 123.45
? STR(3.14159, 8, 3) && " 3.142"
? TRANSFORM(12345.6, "@$ 999,999.99") && "$ 12,345.60"
? DTOS(DATE()) && "20260505"
5. Proměnné a paměť
Deklarace proměnných
VFP nevyžaduje explicitní deklaraci typu — typ je odvozen z přiřazené hodnoty. Doporučuje se ale deklarovat scope.
LOCAL nCislo, cText, dDatum
PRIVATE nGlob
PUBLIC goApp && viditelné kdekoli
nCislo = 42
cText = "Ahoj"
dDatum = DATE()
Scope (rozsah platnosti)
| Klíčové slovo | Význam |
LOCAL | Pouze v aktuální proceduře/funkci. Doporučeno pro většinu proměnných. |
PRIVATE | Aktuální procedura + všechny volané (dynamický scope). |
PUBLIC | Globální, přístupná odkudkoli, žije do RELEASE. |
LOCAL ARRAY | Lokální pole. |
Maďarská notace ve VFP
Tradičně se používají prefixy podle typu:
| Prefix | Typ | Příklad |
n | Numeric/Integer | nPocet |
c | Character | cJmeno |
d | Date | dNarozeni |
t | DateTime | tVytvoreno |
l | Logical | lAktivni |
o | Object | oForm |
a | Array | aSeznam |
g | Global (kombinuje se) | goApp, gnUserID |
Práce s pamětí
RELEASE nCislo && uvolní jednu proměnnou
RELEASE ALL && uvolní všechny privátní
RELEASE ALL LIKE n* && vše začínající "n"
CLEAR MEMORY
? TYPE("nCislo") && "U" pokud neexistuje
? VARTYPE(nCislo) && "N", "C", "D" atd.
? USED("klienti") && .T. pokud je tabulka otevřena
6. Operátory
Aritmetické
| Operátor | Popis | Příklad |
+ | Sčítání / spojování řetězců | 3+4, "a"+"b" |
- | Odečítání / spojení s odstraněním koncových mezer | "abc "-"d" = "abcd " |
* | Násobení | 3*4 |
/ | Dělení | 10/3 |
% | Modulo | 10%3 = 1 |
^ nebo ** | Mocnina | 2^10 = 1024 |
Porovnávací
| Operátor | Popis |
= | Rovno (chování závisí na SET EXACT) |
== | Striktně rovno (řetězce přesně) |
!=, #, <> | Nerovno |
<, >, <=, >= | Menší / větší |
$ | Substring — "oh" $ "Ahoj" = .T. |
Logické
.AND. && logické AND
.OR. && logické OR
.NOT. && negace, lze i ! (vykřičník)
? (5 > 3) .AND. (2 < 4) && .T.
? .NOT. .T. && .F.
SET EXACT ON/OFFPři SET EXACT OFF (default) je "Petr" = "P" pravda — porovnává jen do délky pravého operandu. Při SET EXACT ON musí být řetězce stejné. Pro striktní porovnání používejte ==.
Operátor přiřazení
x = 5 && jednoduché přiřazení
STORE 10 TO a, b, c && vícenásobné přiřazení
STORE "" TO cText
7. Řídicí struktury
IF...ELSE...ENDIF
IF nVek >= 18
? "Plnoletý"
ELSE
? "Nezletilý"
ENDIF
DO CASE
DO CASE
CASE nDen = 1
cText = "pondělí"
CASE nDen = 2
cText = "úterý"
CASE nDen BETWEEN 3 AND 5
cText = "střed týdne"
OTHERWISE
cText = "víkend"
ENDCASE
Funkce IIF (ternary)
cTyp = IIF(nVek >= 18, "plnoletý", "nezletilý")
cText = ICASE( ;
nVek < 13, "dítě", ;
nVek < 20, "teenager", ;
nVek < 65, "dospělý", ;
"senior")
Smyčka FOR ... ENDFOR
FOR i = 1 TO 10
? i, i*i
ENDFOR
FOR i = 100 TO 1 STEP -5
? i
ENDFOR
FOR EACH (pro pole a kolekce)
LOCAL ARRAY aBarvy(3)
aBarvy(1) = "červená"
aBarvy(2) = "zelená"
aBarvy(3) = "modrá"
FOR EACH cBarva IN aBarvy
? cBarva
ENDFOR
DO WHILE ... ENDDO
i = 1
DO WHILE i <= 10
? i
i = i + 1
ENDDO
&& Standardní procházení tabulky
SELECT klienti
GO TOP
DO WHILE .NOT. EOF()
? klienti.jmeno, klienti.prijmeni
SKIP
ENDDO
SCAN ... ENDSCAN (pro tabulky)
Kratší a idiomatičtější způsob procházení tabulky:
SELECT klienti
SCAN FOR aktivni = .T. .AND. mesto = "Praha"
? jmeno, prijmeni
ENDSCAN
&& SKIP a ukazatel se posouvají automaticky
Řídicí příkazy uvnitř smyček
| Příkaz | Popis |
EXIT | Ukončí nejvnitřnější smyčku (jako break) |
LOOP | Pokračuje další iterací (jako continue) |
RETURN | Návrat z procedury |
FOR i = 1 TO 100
IF i % 2 = 0
LOOP && přeskoč sudá
ENDIF
IF i > 50
EXIT && ukonči
ENDIF
? i
ENDFOR
8. Procedury a funkce
Definice procedury / funkce
PROCEDURE Pozdrav(cJmeno)
? "Ahoj " + cJmeno
ENDPROC
FUNCTION Soucet(n1, n2)
RETURN n1 + n2
ENDFUNC
&& Volání
DO Pozdrav WITH "Pavel"
? Soucet(3, 5)
Parametry
FUNCTION Pozdrav(cJmeno, cTitul)
LOCAL cVysledek
IF EMPTY(cTitul)
cVysledek = "Ahoj " + cJmeno
ELSE
cVysledek = "Vážený(á) " + cTitul + " " + cJmeno
ENDIF
RETURN cVysledek
ENDFUNC
? Pozdrav("Petr", "")
? Pozdrav("Petr", "Ing.")
Předávání hodnotou vs. referencí
VFP standardně předává parametry hodnotou. Pro předání referencí použijte @:
PROCEDURE ZdvojNasob(@n)
n = n * 2
ENDPROC
LOCAL x
x = 10
DO ZdvojNasob WITH @x
? x && 20
SET UDFPARMSGlobální přepínač SET UDFPARMS TO REFERENCE změní default na předávání referencí. Většinou se nedoporučuje — držte se explicitního @.
Volitelné parametry a PARAMETERS
FUNCTION Pozdrav
LPARAMETERS cJmeno, cTitul
&& Test, kolik parametrů přišlo
IF PCOUNT() < 2
cTitul = ""
ENDIF
RETURN cTitul + " " + cJmeno
ENDFUNC
| Klíčové slovo | Popis |
PARAMETERS | Privátní parametry (starý styl) |
LPARAMETERS | Lokální parametry (preferováno) |
PCOUNT() | Počet skutečně předaných parametrů |
Soubor s více procedurami (procedure file)
SET PROCEDURE TO mojeFce ADDITIVE
&& v souboru mojeFce.prg:
PROCEDURE Funkce1
...
ENDPROC
PROCEDURE Funkce2
...
ENDPROC
9. Pole (arrays)
VFP podporuje 1D a 2D pole. Indexace začíná od 1.
Deklarace
LOCAL ARRAY aJmena(10) && 1D, 10 prvků
LOCAL ARRAY aMatrix(5, 3) && 2D, 5×3
DIMENSION aData(100) && alternativní zápis
DECLARE aBuf(50) && totéž
aJmena(1) = "Pavel"
aJmena[2] = "Petra" && lze i hranaté závorky
aMatrix(1, 1) = 10
aMatrix(2, 3) = 42
Změna velikosti
LOCAL ARRAY aData(5)
DIMENSION aData(20) && zvětšení (zachová obsah)
DIMENSION aData(3) && zmenšení (oříznutí)
Funkce pro pole
| Funkce | Popis |
ALEN(a, [n]) | Celkový počet prvků (n=1: řádky, n=2: sloupce) |
AINS(a, n) | Vloží prvek na pozici n |
ADEL(a, n) | Smaže prvek na pozici n (poslední je .F.) |
ASORT(a, [start], [count], [order]) | Setřídí pole |
ASCAN(a, expr, [start], [count]) | Vyhledá hodnotu |
ACOPY(zdroj, cíl) | Zkopíruje pole |
ARRAYTOPROP(o, ap) | Pole → vlastnosti objektu |
AFIELDS(a, [tbl]) | Naplní pole strukturou tabulky |
ADIR(a, [skel]) | Naplní pole seznamem souborů |
LOCAL ARRAY aFile(1)
nPocet = ADIR(aFile, "*.dbf")
FOR i = 1 TO nPocet
? aFile(i, 1), aFile(i, 2) && jméno, velikost
ENDFOR
Tabulka → pole
USE klienti
COPY TO ARRAY aLide FIELDS jmeno, prijmeni FOR aktivni
&& nebo SCATTER pro jeden záznam
SCATTER TO aZaznam
SCATTER NAME oRow && do objektu
? oRow.jmeno
&& GATHER zpět
GATHER FROM aZaznam
GATHER NAME oRow
10. Ošetření chyb
TRY ... CATCH ... FINALLY VFP 8+
TRY
USE klienti
SELECT * FROM klienti WHERE id = nID
CATCH TO oErr WHEN oErr.ErrorNo = 1
&& specifický catch
? "Soubor neexistuje"
CATCH TO oErr
? "Chyba " + TRANSFORM(oErr.ErrorNo) + ": " + oErr.Message
? "Procedura: " + oErr.Procedure
? "Řádek: " + TRANSFORM(oErr.LineNo)
FINALLY
USE IN klienti && vždy proběhne
ENDTRY
Vlastnosti objektu Exception
| Vlastnost | Popis |
ErrorNo | Číslo chyby |
Message | Textový popis |
Procedure | Název procedury, kde nastala |
LineNo | Číslo řádku |
LineContents | Obsah řádku |
Details | Doplňkový popis |
UserValue | Volitelná uživatelská hodnota (lze předat přes THROW) |
StackLevel | Úroveň zásobníku |
THROW — vlastní výjimka
TRY
IF nDelitel = 0
THROW "Dělení nulou není povoleno"
ENDIF
nVysledek = nCislo / nDelitel
CATCH TO oErr
? oErr.UserValue
ENDTRY
Klasický ON ERROR (starší způsob)
ON ERROR DO ChybaHandler WITH ERROR(), MESSAGE(), LINENO()
&& ... kód ...
ON ERROR && vrátit default
PROCEDURE ChybaHandler(nErr, cMsg, nLine)
MESSAGEBOX("Chyba " + TRANSFORM(nErr) + ": " + cMsg, 16, "Chyba")
ENDPROC
DoporučeníV novém kódu používejte TRY/CATCH. ON ERROR ponechte jen jako globální záchrannou síť pro neočekávané chyby na nejvyšší úrovni aplikace.
11. Tabulky a databáze
Otevírání a zavírání tabulek
USE klienti && v aktuálním pracovním prostoru
USE klienti IN 0 && v prvním volném work area
USE klienti IN 0 SHARED && sdílený přístup
USE klienti IN 0 EXCLUSIVE && výhradní
USE klienti IN 0 AGAIN ALIAS klienti2 && další otevření pod jiným aliasem
USE klienti IN 0 ORDER prijmeni && s aktivním indexem
USE && zavře aktuální tabulku
USE IN klienti && zavře tabulku v aliasu klienti
CLOSE TABLES
CLOSE DATABASES ALL
Pracovní prostory (work areas)
VFP umožňuje až 32 767 současně otevřených tabulek, každá ve svém pracovním prostoru.
SELECT klienti && přepne aktivní work area
SELECT 0 && vybere první volný
? ALIAS() && jméno aktuální tabulky
? SELECT() && číslo aktuální work area
Pohyb v tabulce
GO TOP && první záznam
GO BOTTOM && poslední
GO 5 && konkrétní pořadí
SKIP && o jeden vpřed
SKIP -1 && o jeden zpět
SKIP 10 && o 10 vpřed
? RECNO() && číslo aktuálního záznamu
? RECCOUNT() && celkem záznamů (vč. smazaných)
? BOF() && před prvním?
? EOF() && za posledním?
Vytvoření tabulky
CREATE TABLE klienti ( ;
id I PRIMARY KEY AUTOINC, ;
jmeno C(30) NOT NULL, ;
prijmeni C(50) NOT NULL, ;
email V(100), ;
narozeni D, ;
plat Y DEFAULT 0, ;
poznamka M, ;
aktivni L DEFAULT .T., ;
vytvoreno T DEFAULT DATETIME() ;
)
&& bez DBC — volná tabulka:
CREATE TABLE mujLog FREE ( ;
datum T, ;
text C(200) ;
)
Úprava struktury
ALTER TABLE klienti ADD COLUMN telefon C(20)
ALTER TABLE klienti ALTER COLUMN jmeno C(50)
ALTER TABLE klienti DROP COLUMN poznamka
ALTER TABLE klienti RENAME COLUMN plat TO mzda
Zobrazení a změna struktury
DISPLAY STRUCTURE && výpis struktury
MODIFY STRUCTURE && vizuální editor
&& nebo zjištění strukturu programově:
LOCAL ARRAY aFlds(1)
AFIELDS(aFlds, "klienti")
FOR i = 1 TO ALEN(aFlds, 1)
? aFlds(i, 1), aFlds(i, 2), aFlds(i, 3)
ENDFOR
Manipulace se záznamy
&& Přidání záznamu
APPEND BLANK
REPLACE jmeno WITH "Pavel", prijmeni WITH "Novák"
&& nebo INSERT (SQL)
INSERT INTO klienti (jmeno, prijmeni) VALUES ("Petr", "Svoboda")
&& Editace
REPLACE plat WITH 35000 FOR mesto = "Praha"
&& UPDATE (SQL)
UPDATE klienti SET plat = plat * 1.05 WHERE aktivni = .T.
&& Mazání (logické)
DELETE FOR aktivni = .F. && označí jako smazané
RECALL FOR id = 42 && obnoví smazaný
PACK && fyzicky odstraní (vyžaduje EXCLUSIVE)
ZAP && smaže všechny záznamy
&& Stav smazání
? DELETED() && je aktuální záznam smazán?
SET DELETED ON && smazané ignorovat při zpracování
Databázový kontejner (DBC)
CREATE DATABASE firma && vytvoří firma.dbc
OPEN DATABASE firma && otevře
CLOSE DATABASE
&& Přidání tabulky do DBC:
ADD TABLE klienti
REMOVE TABLE klienti
&& Vlastnosti DBC dovolují:
&& - dlouhá jména tabulek/sloupců
&& - persistentní relace (DBSETPROP)
&& - validační pravidla na úrovni řádku/pole
&& - default hodnoty, triggery
&& - referenční integritu (RI builder)
12. Indexy a hledání
Vytvoření indexu
&& Strukturální složený index (.cdx) — automaticky se otvírá s tabulkou
INDEX ON prijmeni TAG prijmeni
INDEX ON UPPER(prijmeni) TAG prijmeni_u
INDEX ON DTOS(narozeni) TAG nar
INDEX ON id TAG id CANDIDATE && unikátní
INDEX ON mesto + prijmeni TAG mesto_pri && složený
INDEX ON plat TAG plat_d DESCENDING && sestupný
INDEX ON plat TAG plat_h FOR aktivni && částečný (filtered)
&& SQL syntaxe
ALTER TABLE klienti ADD UNIQUE email TAG email_u
ALTER TABLE klienti ADD PRIMARY KEY id TAG pk_id
Aktivace a manipulace
SET ORDER TO prijmeni && aktivuje TAG
SET ORDER TO 0 && bez indexu (přirozené pořadí)
? ORDER() && aktivní index
? TAGCOUNT() && počet tagů v .cdx
DELETE TAG prijmeni
DELETE TAG ALL
REINDEX && přebudovat indexy
Hledání
SET ORDER TO prijmeni
SEEK "Novák"
IF FOUND()
? "Nalezen na záznamu " + TRANSFORM(RECNO())
ELSE
? "Nenalezen"
ENDIF
&& Funkce SEEK() — vrací rovnou .T./.F. a posune ukazatel
IF SEEK("Novák", "klienti", "prijmeni")
? jmeno
ENDIF
&& LOCATE — sekvenční hledání bez indexu
LOCATE FOR mesto = "Praha" .AND. plat > 30000
DO WHILE FOUND()
? jmeno, prijmeni
CONTINUE
ENDDO
Rushmore optimalizace
VFP automaticky optimalizuje dotazy s WHERE/FOR pomocí Rushmore — pokud existuje index, který přesně odpovídá výrazu ve filtru. Pro maximální využití:
- Indexy musí být přesně stejné jako výraz ve WHERE —
INDEX ON UPPER(prijmeni) optimalizuje WHERE UPPER(prijmeni) = "X", ale ne WHERE prijmeni = "X".
- Funkce
SYS(3054, 11) zapne výpis Rushmore plánu.
SYS(3054, 11) && verbose Rushmore log
SELECT * FROM klienti WHERE UPPER(prijmeni) = "NOVÁK"
SYS(3054, 0) && vypnout
13. SQL příkazy
VFP podporuje plnohodnotnou podmnožinu ANSI SQL pro lokální data.
SELECT
SELECT jmeno, prijmeni, plat ;
FROM klienti ;
WHERE aktivni = .T. .AND. plat > 25000 ;
ORDER BY prijmeni, jmeno ;
INTO CURSOR cZobrazeni
&& cíle dotazu:
SELECT ... INTO TABLE vystup && do nové DBF
SELECT ... INTO CURSOR tmp && do read-only kurzoru
SELECT ... INTO CURSOR tmp READWRITE && editovatelný
SELECT ... INTO ARRAY aData && do pole
SELECT ... TO FILE vystup.txt && do TXT
SELECT ... TO PRINTER && na tiskárnu
SELECT ... TO SCREEN && na obrazovku
JOINy
SELECT k.jmeno, k.prijmeni, o.cisloObj, o.castka ;
FROM klienti k ;
INNER JOIN objednavky o ON o.idKlient = k.id ;
WHERE o.datum >= {^2026-01-01}
&& další typy: LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN
SELECT k.jmeno, NVL(SUM(o.castka), 0) AS celkem ;
FROM klienti k ;
LEFT JOIN objednavky o ON o.idKlient = k.id ;
GROUP BY k.id, k.jmeno ;
ORDER BY celkem DESC
Agregační funkce
| Funkce | Popis |
COUNT(*) | Počet řádků |
COUNT(sloupec) | Počet ne-NULL hodnot |
SUM(sloupec) | Součet |
AVG(sloupec) | Průměr |
MIN(), MAX() | Minimum, maximum |
Subselect a další
&& Subselect ve WHERE
SELECT * FROM klienti ;
WHERE id IN (SELECT idKlient FROM objednavky WHERE castka > 10000)
&& UNION
SELECT jmeno FROM klienti ;
UNION ;
SELECT jmeno FROM dodavatele
&& TOP N
SELECT TOP 10 jmeno, plat FROM klienti ORDER BY plat DESC
SELECT TOP 5 PERCENT ...
&& HAVING
SELECT mesto, COUNT(*) AS pocet ;
FROM klienti ;
GROUP BY mesto ;
HAVING COUNT(*) > 5 ;
ORDER BY pocet DESC
INSERT, UPDATE, DELETE
INSERT INTO klienti (jmeno, prijmeni, mesto) ;
VALUES ("Pavel", "Novák", "Praha")
INSERT INTO klienti FROM NAME oRow && z objektu
INSERT INTO klienti FROM ARRAY aData && z pole
UPDATE klienti SET plat = plat + 2000, ;
vytvoreno = DATETIME() ;
WHERE aktivni = .T. AND mesto = "Brno"
DELETE FROM klienti WHERE aktivni = .F.
PozorDELETE FROM v xBase módu pouze označí záznamy jako smazané. Pro fyzické odstranění je potřeba PACK.
14. Transakce a buffering
Transakce
BEGIN TRANSACTION
TRY
UPDATE ucty SET zustatek = zustatek - 1000 WHERE id = 1
UPDATE ucty SET zustatek = zustatek + 1000 WHERE id = 2
END TRANSACTION && commit
CATCH
ROLLBACK
ENDTRY
Transakce jsou podporované jen pro tabulky v DBC (databázovém kontejneru). Volné tabulky transakce neumí.
Buffering
Buffering řídí, jak se změny v paměti propisují do tabulky. Zásadní pro multi-user aplikace.
| Hodnota | Konstanta | Popis |
| 1 | — | Bez bufferingu (default pro free tables) |
| 2 | — | Pesimistický řádkový |
| 3 | — | Optimistický řádkový |
| 4 | — | Pesimistický tabulkový |
| 5 | — | Optimistický tabulkový (typický pro form-based aplikace) |
SET MULTILOCKS ON && nutné pro buffering 3, 4, 5
USE klienti IN 0 SHARED
CURSORSETPROP("Buffering", 5, "klienti")
&& uživatel mění data ve formuláři...
IF TABLEUPDATE(.T., .F., "klienti") && commit změn
? "Uloženo"
ELSE
TABLEREVERT(.T., "klienti") && rollback změn
ENDIF
? GETFLDSTATE("jmeno") && stav konkrétního pole
? GETNEXTMODIFIED(0) && další změněný záznam
15. Kurzory a views
Kurzory
Kurzor je dočasná tabulka v paměti/temp adresáři. Vznikne nejčastěji jako výsledek SELECT ... INTO CURSOR.
SELECT * FROM klienti WHERE aktivni INTO CURSOR tmp
SELECT * FROM klienti INTO CURSOR tmp READWRITE
SELECT * FROM klienti INTO CURSOR tmp NOFILTER && vždy nové data
&& Vytvoření prázdného kurzoru
CREATE CURSOR tmp ( ;
id I, ;
nzv C(50), ;
hod N(10, 2) ;
)
Lokální views
OPEN DATABASE firma
CREATE SQL VIEW v_aktivni AS ;
SELECT id, jmeno, prijmeni, mesto ;
FROM klienti WHERE aktivni = .T.
&& použití
USE v_aktivni
BROWSE
CursorAdapter VFP 8+
Univerzální způsob připojení k libovolnému zdroji dat (lokální DBF, SQL Server, ODBC, ADO, XML).
LOCAL oCA
oCA = CREATEOBJECT("CursorAdapter")
WITH oCA
.Alias = "klientiSQL"
.DataSourceType = "ODBC"
.DataSource = nConnHandle
.SelectCmd = "SELECT * FROM Klienti WHERE Active = 1"
.Tables = "Klienti"
.KeyFieldList = "ID"
.UpdatableFieldList = "jmeno, prijmeni, plat"
.UpdateNameList = "jmeno Klienti.Jmeno, prijmeni Klienti.Prijmeni, plat Klienti.Plat"
.SendUpdates = .T.
.CursorFill()
ENDWITH
16. Remote data (ODBC, SQL Server)
Připojení přes SQL pass-through (SPT)
LOCAL nHandle, lcCmd
nHandle = SQLCONNECT("DSN=mySQLServer;UID=user;PWD=heslo")
&& nebo přes connection string:
nHandle = SQLSTRINGCONNECT("Driver={SQL Server};Server=.;Database=Test;Trusted_Connection=Yes")
IF nHandle < 0
? "Připojení selhalo"
RETURN
ENDIF
SQLEXEC(nHandle, "SELECT * FROM Klienti WHERE Plat > ?lnPlat", "vystup")
SELECT vystup
BROWSE
SQLDISCONNECT(nHandle)
Klíčové funkce SPT
| Funkce | Popis |
SQLCONNECT() | Připojí přes ODBC DSN |
SQLSTRINGCONNECT() | Připojí přes connection string |
SQLEXEC(h, cmd, [cur]) | Provede SQL příkaz |
SQLPREPARE() | Příprava parametrického dotazu |
SQLGETPROP() / SQLSETPROP() | Vlastnosti spojení |
SQLCOMMIT() / SQLROLLBACK() | Transakce na serveru |
SQLDISCONNECT() | Odpojení |
SQLTABLES() / SQLCOLUMNS() | Metadata |
Parametrické dotazy
LOCAL lnPlat, ldDatum
lnPlat = 30000
ldDatum = {^2026-01-01}
SQLEXEC(nHandle, ;
"SELECT * FROM Klienti WHERE Plat > ?lnPlat AND Vytvoreno >= ?ldDatum", ;
"vystup")
17. Třídy a objekty
Definice třídy v PRG
DEFINE CLASS Klient AS Custom
* Vlastnosti
cJmeno = ""
cPrijmeni = ""
nVek = 0
PROTECTED nID
nID = 0
* Konstruktor
PROCEDURE Init(tnID, tcJmeno)
THIS.nID = tnID
THIS.cJmeno = tcJmeno
ENDPROC
* Metody
PROCEDURE CelyJmeno
RETURN THIS.cJmeno + " " + THIS.cPrijmeni
ENDPROC
PROCEDURE Destroy
* Cleanup
ENDPROC
ENDDEFINE
&& Použití
LOCAL oKlient
oKlient = CREATEOBJECT("Klient", 42, "Pavel")
oKlient.cPrijmeni = "Novák"
? oKlient.CelyJmeno()
Dědičnost
DEFINE CLASS VipKlient AS Klient
nSleva = 0.10
PROCEDURE Init(tnID, tcJmeno, tnSleva)
* Volání rodičovského konstruktoru
DODEFAULT(tnID, tcJmeno)
THIS.nSleva = tnSleva
ENDPROC
PROCEDURE CelyJmeno
* Override + volání původní metody
RETURN "VIP: " + DODEFAULT()
ENDPROC
ENDDEFINE
Speciální klíčová slova OOP
| Klíč | Význam |
THIS | Reference na aktuální objekt |
THISFORM | Reference na formulář, ve kterém je objekt |
THISFORMSET | Reference na formset |
PARENT | Nadřazený kontejner |
DODEFAULT() | Volá metodu rodičovské třídy |
NODEFAULT | V eventu zruší výchozí akci VFP |
PROTECTED | Chráněná vlastnost/metoda (jen pro instanci a potomky) |
HIDDEN | Soukromá (jen pro tuto třídu) |
Třídy z VCX
SET CLASSLIB TO moje_tridy ADDITIVE
LOCAL oKlient
oKlient = CREATEOBJECT("Klient") && načte z VCX
&& nebo bez SET CLASSLIB:
oKlient = NEWOBJECT("Klient", "moje_tridy.vcx")
Vestavěné základní třídy
| Třída | Popis |
Custom | Neviditelná base třída pro vlastní třídy |
Form | Formulář |
Container | Kontejner pro další controly |
Label | Statický text |
TextBox / EditBox | Vstupní pole |
CommandButton | Tlačítko |
CheckBox / OptionGroup | Zaškrtávátko / radio |
ComboBox / ListBox | Combo / list |
Grid | Datová mřížka |
PageFrame / Page | Záložkový panel |
Image | Obrázek |
Timer | Časovač |
Collection VFP 8+ | Generická kolekce |
Empty | Prázdný objekt — lze přidávat členy za běhu |
Empty třída a dynamické vlastnosti
LOCAL oRow
oRow = CREATEOBJECT("Empty")
ADDPROPERTY(oRow, "jmeno", "Pavel")
ADDPROPERTY(oRow, "vek", 35)
? oRow.jmeno, oRow.vek
&& SCATTER NAME ho rovnou naplní z aktuálního záznamu
SCATTER NAME oRow MEMO
? oRow.prijmeni
19. Reporty a etikety
Reporty jsou uloženy v souborech .frx/.frt a navrhují se v Report Designeru. VFP 9 přinesl výrazně přepracovaný engine reportů.
Základní spuštění reportu
REPORT FORM mujReport PREVIEW
REPORT FORM mujReport TO PRINTER PROMPT
REPORT FORM mujReport TO PRINTER NOCONSOLE
REPORT FORM mujReport TO FILE vystup.txt ASCII
&& Filtr záznamů
REPORT FORM mujReport PREVIEW FOR mesto = "Praha"
&& Rozsah
REPORT FORM mujReport PREVIEW NEXT 50
REPORT FORM mujReport PREVIEW REST
VFP 9 Report Listener (object-oriented rendering)
LOCAL oList
oList = NEWOBJECT("ReportListener", HOME() + "FFC\_reportlistener.vcx")
oList.ListenerType = 1 && preview
REPORT FORM mujReport OBJECT oList
&& nebo nově:
REPORT FORM mujReport OBJECT TYPE 1 && preview
REPORT FORM mujReport OBJECT TYPE 3 && XML
REPORT FORM mujReport OBJECT TYPE 4 && HTML (s FFC)
Přímý tisk a ovládání tiskárny
SET PRINTER TO NAME "HP LaserJet" && vybrat tiskárnu
? SET("PRINTER", 3) && aktuální tiskárna
&& "tichý" tisk přímo z kódu
SET PRINTER ON
SET CONSOLE OFF
? "Hlavička sestavy"
? "==================="
SET PRINTER TO
SET CONSOLE ON
Etikety
LABEL FORM mojeEtikety PREVIEW
LABEL FORM mojeEtikety TO PRINTER
21. Práce se soubory
Nízkoúrovňové funkce
&& Otevření / vytvoření / čtení / zápis
nFile = FOPEN("data.txt", 2) && 0=read, 1=write, 2=read/write
nFile = FCREATE("novy.txt")
IF nFile = -1
? "Chyba otevření"
RETURN
ENDIF
cText = FREAD(nFile, 1024) && přečte 1024 bajtů
cText = FGETS(nFile) && jeden řádek
FWRITE(nFile, "text dat")
FPUTS(nFile, "řádek") && s CRLF na konci
FSEEK(nFile, 100, 0) && pozice (0=od začátku, 1=od pos, 2=od konce)
? FSEEK(nFile, 0, 2) && velikost souboru
? FEOF(nFile)
FCLOSE(nFile)
Vysokoúrovňové funkce
cContent = FILETOSTR("vstup.txt")
STRTOFILE(cText, "vystup.txt")
STRTOFILE(cText, "log.txt", 1) && 1 = append
? FILE("klienti.dbf") && existuje?
? DIRECTORY("C:\Data") && existuje adresář?
? FSIZE("data.dbf")
? FDATE("data.dbf")
? FTIME("data.dbf")
DELETE FILE "stary.txt"
RENAME "old.txt" TO "new.txt"
COPY FILE "src.txt" TO "dst.txt"
MD "NovyAdresar" && vytvořit adresář
RD "StaryAdresar"
Cesty a aktuální adresář
? CURDIR() && aktuální adresář
? FULLPATH("klienti.dbf") && absolutní cesta
? JUSTPATH("C:\data\file.txt") && "C:\data"
? JUSTFNAME("C:\data\file.txt") && "file.txt"
? JUSTSTEM("C:\data\file.txt") && "file"
? JUSTEXT("C:\data\file.txt") && "txt"
? ADDBS("C:\data") && "C:\data\"
? DEFAULTEXT("data", "dbf") && "data.dbf"
? FORCEPATH("file.txt", "D:\backup")
? FORCEEXT("file.txt", "bak")
? SYS(5) + SYS(2003) && aktuální drive a path
SET DEFAULT TO "D:\projekty\moje" && změnit pracovní adresář
22. Řetězcové funkce
| Funkce | Popis | Příklad |
LEN(c) | Délka | LEN("abc") = 3 |
UPPER(c) | Velká písmena | UPPER("Abc") = "ABC" |
LOWER(c) | Malá písmena | LOWER("Abc") = "abc" |
PROPER(c) | První velká | PROPER("ahoj svět") = "Ahoj Svět" |
LEFT(c, n) | Zleva n znaků | LEFT("abcdef", 3) = "abc" |
RIGHT(c, n) | Zprava n znaků | RIGHT("abcdef", 3) = "def" |
SUBSTR(c, start, [len]) | Podřetězec | SUBSTR("abcdef", 2, 3) = "bcd" |
STUFF(c, start, len, expr) | Vložit/nahradit | STUFF("abcdef", 2, 2, "XX") = "aXXdef" |
AT(c1, c2, [n]) | Pozice substringu | AT("c", "abcdef") = 3 |
RAT(c1, c2) | Pozice zprava | — |
OCCURS(c1, c2) | Počet výskytů | OCCURS("a", "banana") = 3 |
STRTRAN(c, find, repl) | Nahradit | STRTRAN("abc abc", "a", "X") = "Xbc Xbc" |
CHRTRAN(c, find, repl) | Nahradit znaky 1:1 | CHRTRAN("abc", "ac", "12") = "1b2" |
ALLTRIM(c) | Bez mezer obou stran | — |
LTRIM(c) / RTRIM(c) | Bez mezer zleva/zprava | — |
PADC/L/R(c, n, [pad]) | Doplnění mezerami | PADL("5", 3, "0") = "005" |
REPLICATE(c, n) | Opakování | REPLICATE("-", 5) = "-----" |
SPACE(n) | n mezer | — |
EMPTY(c) | Je prázdný/jen mezery? | — |
ALINES(a, c, [flag]) | Rozdělí na řádky do pole | — |
GETWORDCOUNT(c, [sep]) | Počet slov | — |
GETWORDNUM(c, n, [sep]) | n-té slovo | — |
STREXTRACT(c, beg, end) | Mezi delimitery | — |
BETWEEN(x, lo, hi) | x v rozsahu | — |
LIKEC(pattern, c) | Match s wildcards * a ? | LIKEC("a*c", "abc") |
Praktické příklady
&& Rozdělit CSV řádek do pole
LOCAL ARRAY aFields(1)
nCount = ALINES(aFields, "Pavel,Novák,Praha", 0, ",")
FOR i = 1 TO nCount
? aFields(i)
ENDFOR
&& Vyčistit telefonní číslo (jen číslice)
cTel = "+420 777 123-456"
cClean = CHRTRAN(cTel, "+- ", "")
? cClean && "420777123456"
&& Generovat random ID
cID = SYS(2015) && 10-znakový jedinečný ID
23. Datum a čas
| Funkce | Popis |
DATE() | Dnešní datum |
DATETIME() | Aktuální datum + čas |
TIME() | Aktuální čas jako řetězec "HH:MM:SS" |
SECONDS() | Sekundy od půlnoci (s desetinnou částí) |
YEAR(d) / MONTH(d) / DAY(d) | Komponenty data |
HOUR(t) / MINUTE(t) / SEC(t) | Komponenty času |
DOW(d, [first]) | Den v týdnu (1=Ne ... 7=So) |
WEEK(d) | Číslo týdne v roce |
CDOW(d) | Název dne (lokalizovaný) |
CMONTH(d) | Název měsíce |
GOMONTH(d, n) | Posun o n měsíců |
DTOC(d) / CTOD(c) | Date ↔ char |
DTOS(d) | Date → "YYYYMMDD" (vhodné pro indexy) |
TTOC(t, [flag]) | Datetime → char |
TTOD(t) / DTOT(d) | Datetime ↔ Date |
Aritmetika data
? DATE() + 7 && za týden
? DATE() - 30 && před měsícem
? {^2026-12-31} - {^2026-01-01} && rozdíl ve dnech = 364
? DATETIME() + 3600 && za hodinu (sekundy)
? GOMONTH(DATE(), 3) && za 3 měsíce
&& Začátek a konec měsíce
nDnes = DATE()
dPocatek = GOMONTH(nDnes, 0) - DAY(nDnes) + 1
dKonec = GOMONTH(dPocatek, 1) - 1
Formátování
SET DATE TO GERMAN && DD.MM.YYYY
SET DATE TO ANSI && YYYY.MM.DD
SET DATE TO BRITISH && DD/MM/YYYY
SET DATE TO AMERICAN && MM/DD/YYYY
SET CENTURY ON && čtyřciferný rok
SET MARK TO "." && oddělovač
? DTOC(DATE()) && podle SET DATE
? TRANSFORM(DATE(), "@D") && krátké datum
? TRANSFORM(DATE(), "@E") && evropské
24. Matematické funkce
| Funkce | Popis |
ABS(n) | Absolutní hodnota |
SIGN(n) | Znaménko (-1, 0, 1) |
INT(n) | Celá část (truncate) |
FLOOR(n) / CEILING(n) | Zaokrouhlení dolů / nahoru |
ROUND(n, dec) | Zaokrouhlení na dec míst |
MOD(n, d) | Modulo (i pro reálná čísla) |
SQRT(n) | Druhá odmocnina |
EXP(n) | e^n |
LOG(n) | Přirozený logaritmus |
LOG10(n) | Dekadický logaritmus |
SIN/COS/TAN(n) | Goniometrické (radiány) |
ASIN/ACOS/ATAN(n) | Inverzní |
ATAN2(y, x) | Arctangent z dvou hodnot |
PI() | 3.141592... |
RAND([seed]) | Náhodné číslo <0, 1) |
MIN(...) / MAX(...) | Min / max ze seznamu |
BITAND/OR/XOR/NOT | Bitové operace |
BITLSHIFT(n, k) / BITRSHIFT(n, k) | Posuny |
? ROUND(3.14159, 2) && 3.14
? SQRT(2) && 1.4142...
? PI() && 3.14159...
? SIN(PI() / 2) && 1
&& Náhodné celé v rozsahu 1..100
? INT(RAND() * 100) + 1
&& Bitové operace
? BITAND(12, 10) && 8 (1100 & 1010 = 1000)
? BITOR(12, 3) && 15
25. COM a Automation
Volání externí aplikace přes COM
&& Excel
LOCAL oExcel, oWB
oExcel = CREATEOBJECT("Excel.Application")
oExcel.Visible = .T.
oWB = oExcel.Workbooks.Add()
WITH oWB.Sheets(1)
.Cells(1, 1).Value = "Jméno"
.Cells(1, 2).Value = "Plat"
.Cells(2, 1).Value = "Pavel"
.Cells(2, 2).Value = 35000
ENDWITH
oWB.SaveAs("C:\Temp\plat.xlsx")
oExcel.Quit()
&& Word
LOCAL oWord
oWord = CREATEOBJECT("Word.Application")
oWord.Documents.Open("C:\dopis.docx")
&& ...
&& FileSystemObject
LOCAL oFSO
oFSO = CREATEOBJECT("Scripting.FileSystemObject")
? oFSO.GetFile("C:\data.dbf").Size
&& ADO
LOCAL oConn, oRS
oConn = CREATEOBJECT("ADODB.Connection")
oConn.Open("Provider=SQLOLEDB;Data Source=.;Initial Catalog=test;Integrated Security=SSPI")
oRS = oConn.Execute("SELECT * FROM Klienti")
DO WHILE .NOT. oRS.EOF
? oRS.Fields("Jmeno").Value
oRS.MoveNext()
ENDDO
VFP jako COM server
DEFINE CLASS MujServer AS Custom OLEPUBLIC
PROCEDURE Pozdrav(tcJmeno AS String) AS String
RETURN "Ahoj " + tcJmeno
ENDPROC
ENDDEFINE
&& v projektu pak BUILD MTDLL nebo BUILD EXE — registrace proběhne automaticky
26. XML, XMLAdapter
XML <-> kurzor jednoduchými funkcemi
&& Kurzor → XML
SELECT klienti
CURSORTOXML("klienti", "klienti.xml", 1, 512, 0, "1.0")
&& flags: 1 = atributy, 2 = elementy
&& XML → kurzor
XMLTOCURSOR("klienti.xml", "importovani")
XMLAdapter (object model)
LOCAL oXA, oTable
oXA = CREATEOBJECT("XMLAdapter")
oXA.LoadXML("data.xml", .F., .F.) && load file
&& nebo: oXA.LoadXML(cXmlString, .T.) load string
FOR EACH oTable IN oXA.Tables
oTable.ToCursor(.T.)
? "Tabulka: " + oTable.Alias + ", záznamů: " + TRANSFORM(RECCOUNT())
ENDFOR
&& Z kurzoru zase XML
oXA.AddTableSchema("klienti")
oXA.IsDiffgram = .F.
cXml = oXA.ToXML()
MSXML přes COM
LOCAL oXML, oNode
oXML = CREATEOBJECT("MSXML2.DOMDocument.6.0")
oXML.async = .F.
oXML.load("data.xml")
FOR EACH oNode IN oXML.selectNodes("//klient")
? oNode.selectSingleNode("jmeno").text
ENDFOR
27. Volání Win32 API
DECLARE - DLL
DECLARE INTEGER MessageBox IN user32 ;
INTEGER hWnd, ;
STRING lpText, ;
STRING lpCaption, ;
INTEGER uType
&& volání
? MessageBox(0, "Ahoj z API", "Test", 0)
&& ShellExecute pro otevření URL/souboru
DECLARE INTEGER ShellExecute IN shell32.dll ;
INTEGER hndWin, ;
STRING cAction, ;
STRING cFile, ;
STRING cParams, ;
STRING cDir, ;
INTEGER nShow
ShellExecute(0, "open", "https://www.example.com", "", "", 1)
ShellExecute(0, "open", "C:\dokument.pdf", "", "", 1)
&& Sleep
DECLARE Sleep IN kernel32 INTEGER dwMilliseconds
Sleep(1000) && pauza 1 sekunda
&& Získat handle hlavního okna VFP
DECLARE INTEGER GetForegroundWindow IN user32
&& Spuštění externí aplikace - blokující varianta
RUN /N notepad.exe && /N = neblokovat
RUN /N7 cmd.exe /c dir && minimalizované
Velký katalog API ukázek: Win32API knihovna VFPX (foxypreviewer, vfpwin) obsahuje stovky pre-deklarovaných API funkcí. Doporučuji.
28. Distribuce aplikace
Build EXE
BUILD EXE mojeApp FROM mojeApp.pjx RECOMPILE
&& pro 64-bit i pro 32-bit verze Windows je výsledný EXE 32-bit
Runtime soubory
Aplikace pro distribuci potřebuje VFP 9 runtime knihovny. Klíčové DLL:
vfp9r.dll — hlavní runtime (anglická verze)
vfp9renu.dll — anglické resources
vfp9rcsy.dll — české resources CSY
vfp9t.dll — runtime pro vlákna (DLL servery)
gdiplus.dll — pro Report Listenery a obrázky
msvcr71.dll — Visual C++ runtime
InstallShield Express / Inno Setup
VFP 9 obsahoval InstallShield Express LE pro tvorbu MSI instalátorů. Komunita typicky doporučuje Inno Setup jako jednodušší alternativu.
Manifest pro Windows 7+
Pro správné chování UAC a vzhledu na Windows 7 a novějších přiložte k EXE manifest soubor (mojeApp.exe.manifest) s deklarací compatibility a UI themingem.
29. Přehled hlavních příkazů
| Příkaz | Popis |
? | Vypíše výrazy do výstupu (s odřádkováním) |
?? | Vypíše bez odřádkování |
@ row, col SAY | Pozicovaný výpis (původní DOS syntax) |
ACTIVATE WINDOW | Aktivuje okno |
APPEND BLANK | Přidá prázdný záznam |
APPEND FROM | Importuje data z jiného souboru (CSV, XLS, DBF...) |
BROWSE | Editovatelný gridový pohled na tabulku |
CLEAR | Vyčistí výstupní okno |
CLOSE | Uzavře tabulky/databáze/all |
COPY TO | Kopíruje tabulku do nového souboru |
COUNT | Spočítá záznamy |
SUM, AVERAGE, CALCULATE | Agregace v aktivní tabulce |
DEFINE CLASS | Definuje třídu |
DELETE | Označí záznamy ke smazání |
DISPLAY / LIST | Vypíše záznamy |
DO | Spustí program/proceduru |
EXTERNAL | Pro Project Manager — explicitní reference |
GO / GOTO | Pohyb v tabulce |
HIDE WINDOW | Skryje okno |
KEYBOARD | Vloží klávesy do bufferu |
MODIFY COMMAND/MEMO/FORM/CLASS/DATABASE | Otevře designer |
ON ERROR / ON KEY / ON SHUTDOWN | Globální handlery |
PUSH/POP KEY | Uloží/obnoví klávesové zkratky |
QUIT | Ukončí VFP |
READ EVENTS / CLEAR EVENTS | Event loop |
RELEASE | Uvolní proměnné/objekty/menu |
REPLACE | Update polí v aktuálním záznamu (xBase styl) |
SET XXXX | Spousta nastavení (viz dále) |
SHOW WINDOW | Zobrazí okno |
WAIT | Pauza s libovolnou klávesou |
WITH ... ENDWITH | Zkrácený zápis pro objektové vlastnosti |
Důležité SET příkazy
| SET | Default | Co řeší |
SET DATE | AMERICAN | Formát data v zobrazení |
SET CENTURY | OFF | 2 vs. 4ciferný rok |
SET DELETED | OFF | Ignorovat smazané záznamy |
SET EXACT | OFF | Přesná shoda řetězců |
SET ANSI | OFF | ANSI vs xBase porovnávání ve WHERE |
SET NEAR | OFF | SEEK posun na nejbližší při neúspěchu |
SET TALK | ON | Zobrazování informací o stavu |
SET SAFETY | ON | Dotaz před přepsáním souboru |
SET MULTILOCKS | OFF | Pro buffering 3,4,5 musí být ON |
SET REFRESH | 0,5 | Interval refresh BROWSE |
SET DEFAULT TO | — | Aktuální adresář |
SET PATH TO | — | Cesty pro hledání souborů |
SET CLASSLIB TO | — | VCX knihovny tříd |
SET PROCEDURE TO | — | PRG soubory s procedurami |
30. Přehled funkcí
Informační funkce
| Funkce | Popis |
VARTYPE(x) | Typ hodnoty: "C","N","L","D","T","O","U" (undefined) |
TYPE("nazev") | Typ podle jména proměnné/výrazu |
USED([alias]) | Tabulka otevřena? |
FCOUNT() | Počet sloupců aktuální tabulky |
FIELD(n) | Jméno n-tého sloupce |
RECNO() / RECCOUNT() | Aktuální záznam / celkem |
BOF() / EOF() | Začátek/konec tabulky |
FOUND() | Poslední SEEK/LOCATE byl úspěšný |
DELETED() | Aktuální záznam je smazaný |
EMPTY(x) | Hodnota je prázdná (pro daný typ) |
ISNULL(x) | Hodnota je .NULL. |
NVL(x, y) | Vrátí y pokud x je NULL |
EVL(x, y) | Vrátí y pokud x je EMPTY |
BETWEEN(x, lo, hi) | x v rozsahu |
INLIST(x, ...) | x v seznamu |
EVALUATE(c) | Vyhodnotí výraz z řetězce |
EXECSCRIPT(c) | Spustí kód z řetězce VFP 9 |
Systémové
| Funkce | Popis |
SYS(0) | Síťové jméno + uživatel |
SYS(2) | Sekundy od půlnoci |
SYS(3) | Unikátní jméno souboru |
SYS(5) | Aktuální disk |
SYS(2003) | Aktuální adresář |
SYS(2015) | Unikátní 10-znakový string |
SYS(2018) | Parametry poslední chyby |
SYS(2333) | Bind events / detach (VFP 9) |
SYS(3054, n) | Rushmore log |
OS() | Operační systém |
VERSION([n]) | Verze VFP |
HOME([n]) | Adresář VFP |
GETENV(c) | Hodnota proměnné prostředí |
WONTOP() | Aktuální top window |
RGBSCHEME(n) | Barva ze schématu |
31. Systémové proměnné
Předdefinované globální proměnné začínající podtržítkem.
| Proměnná | Popis |
_SCREEN | Hlavní okno VFP (objekt typu Form) |
_VFP | Aplikační objekt |
_MSYSMENU | Hlavní systémové menu |
_TALLY | Počet záznamů zpracovaných posledním xBase příkazem |
_TEXT | Soubor pro výstup TEXT příkazu |
_PRETEXT | Vyhrazené pro Project Manager |
_STARTUP | PRG/APP spouštěné při startu |
_FOXCODE | Intellisense tabulka |
_FOXTASK | Task tabulka |
_PCLPAGE | PCL formátování pro tisk |
_THROTTLE | Throttle u výstupu |
_WINDOWS | .T. pokud je VFP na Windows (always .T.) |
_DOS / _MAC / _UNIX | Platforma (vždy .F. ve VFP 9 pro Windows) |
&& Příklady
_SCREEN.Caption = "Moje aplikace"
_SCREEN.WindowState = 2 && maximalizováno
_SCREEN.AddObject("oTimer", "Timer")
&& Skrytí systémového menu
_MSYSMENU.Visible = .F.
&& Jméno z _TALLY
SELECT COUNT(*) FROM klienti
? _TALLY
32. Časté kódy chyb
| Kód | Význam |
| 1 | File does not exist |
| 3 | Too many files open |
| 4 | End of file encountered |
| 5 | Record is out of range |
| 9 | Data type mismatch |
| 10 | Syntax error |
| 11 | Function argument value, type, or count is invalid |
| 12 | Variable not found |
| 13 | Alias not found |
| 15 | Not a table |
| 20 | Record not in index |
| 26 | No table is open in current work area |
| 36 | Command contains unrecognized phrase/keyword |
| 41 | Memo file is missing or invalid |
| 43 | Insufficient memory |
| 52 | No database is open |
| 108 | File is in use by another |
| 109 | Record is in use by another |
| 110 | Exclusive open required |
| 111 | Cannot update file |
| 1444 | Class definition for X is not found |
| 1429 | OLE error |
| 1925 | Unknown member X |
| 1958 | Object class is invalid |
33. Klávesové zkratky IDE
Editor a Command Window
| Zkratka | Akce |
| Ctrl+F2 | Zobrazit/skrýt Command Window |
| F2 | Aktivovat Command Window |
| Ctrl+S | Uložit |
| Ctrl+F | Najít |
| Ctrl+L | Hledat dál |
| Ctrl+R | Najít a nahradit |
| Ctrl+G | Jít na řádek |
| Ctrl+I | Odsadit blok |
| Ctrl+U | Zrušit odsazení |
| Ctrl+Q | Komentovat blok |
| Ctrl+W | Uložit a zavřít editor |
| Esc | Zavřít bez uložení |
| Ctrl+J | Intellisense (force) |
Spuštění a debug
| Zkratka | Akce |
| Ctrl+D | Spustit DO program |
| Ctrl+E | Zavřít projekt |
| F5 (v debuggeru) | Continue |
| F8 | Step Into |
| Shift+F8 | Step Over |
| F9 | Toggle breakpoint |
| Ctrl+Shift+F2 | Trace Window |
| Ctrl+Alt+End | Cancel běžícího kódu |
Form Designer
| Zkratka | Akce |
| F11 | Properties window |
| Ctrl+P | Properties window (alt.) |
| F7 | Code window |
| Ctrl+klik | Otevře code v dvojkliknutém eventu |
| Ctrl+A | Vybrat všechny controly |
| Ctrl+D | Data Environment |
Project Manager
| Zkratka | Akce |
| Ctrl+Tab | Přepínat záložky |
| Ctrl+Shift+Klik | Drag-out item |
| Enter na .prg | Otevře v editoru |
| Ctrl+Enter na .prg | Spustí program |
Visual FoxPro 9.0 — Referenční příručka • Sestaveno 2026
Pro produktivní práci doporučuji VFPX komunitní rozšíření a HackFox/MasterFox tipsheety.