Několik tipů pro VFP

Změna pořadí znaků v řetězci


Někdy potřebujete z nějakého řetězce vytvořit nový, který bude obsahovat některé znaky původního řetězce, ale v jiném pořadí. Předpokládejme například, že máme datum uložené ve stejném tvaru jako při volání funkce DTOS(DATE()), tj. ve tvaru rrrrmmdd, např. 20000820. Potřebujeme je převést do tvaru dd.mm.rr, tedy 20.08.00. Sice by fungovalo
?SUBSTR(DTOS(DATE()),7,2)+"."+ SUBSTR(DTOS(DATE ()),5,2)+"."+ SUBSTR(DTOS(DATE()),3,2)
ale rozhodně je jednodušší
?CHRTRAN("78.56.34", "12345678", DTOS(DATE()))
Nápověda : druhý řetězec "očísluje" znaky v třetím řetězci, první řetězec určuje pořadí těchto očíslovaných znaků ve výsledném řetězci a také přidané znaky.

Odstranění nepotřebných mezer

Tohle ani snad není tip, pouze připomínka věcí, které fungují ve FoxPro skutečně dlouho. V DBF máme údaje včetně mezer na konci, takže pokud v sestavě potřebujeme na jednom řádku jméno i příjmení (nebo město a ulici, nebo …)
jmeno    = "Milan     "
prijmeni = "Kosina    "
často složitě píšeme
?alltrim(jmeno)+" "+alltrim(prijmeni)
Jednodušší ale je
?jmeno-(" "+prijmeni)

Rozdělení textu na jednotlivá slova


Pokud potřebujeme rozdělit obsah řetězcové proměnné lcStr na jednotlivá slova, stačí použít funkci ALINES(), kterou si pomocí funkce CHRTRAN() přizpůsobíme pro dělení podle mezery:
lnPočetSlov = ALINES(laSlova,CHRTRAN(lcStr, " ", CHR(13)), .T.)
Podobně bychom postupovali pro slova oddělená čárkami,…
Vynechání znaků na začátku, na konci nebo na začátku i na konci Představme si, že máme řetězec:
lcStr = "00000123000456000"
kde se potřebujeme zbavit vedoucích nul. K tomu stačí
lcCharX = "0"
?CHRTRAN(LTRIM(CHRTRAN(lcStr, lcCharX+" ", " "+lcCharX)), " "+lcCharX, lcCharX+" ")
Nápověda : nejprve CHRTRAN() vymění v celém řetězci znak za mezeru, potom pomocí LTRIM() odstraníme mezery pouze ze začátku řetězce a nakonec pomocí dalšího CHRTRAN() vyměníme zpět mezeru za znak.

Pokud bychom se potřebovali zbavit všech nul na konci, stačí změnit LTRIM() na RTRIM(). A pro odstranění všech nul na začátku i na konci stačí ALLTRIM().

Odstranění všech znaků kromě vybraných:
Nyní máme například řetězec
lcStr = "Posíláme Vám fakturu na 123 šroubků"
a chceme z něj vybrat všechny číslice. Definujme proto které znaky chceme vybrat
lcCharOK = "0123456789"
a potom už stačí použít
?CHRTRAN(lcStr, CHRTRAN(lcStr, lcCharOK, ""), "")
Nápověda : nejprve pomocí CHRTRAN() vytvoříme tabulku znaků, které NECHCEME, a ty pomocí ní v dalším CHRTRAN() odstraníme.

Spuštění screen saveru


Protože nechci, aby se všechny tipy týkaly pouze práce s řetězci, tady je způsob, jak programově spustit screen saver (nezapomeňte, že v DECLARE musíte přesně psát malá a velká písmena):
#define WM_SYSCOMMAND 0x0112
#define SC_SCREENSAVE 0xF140
DECLARE INTEGER SendMessage IN Win32API ;
       INTEGER hwnd, INTEGER uMsg, INTEGER wParam, INTEGER lParam
DECLARE INTEGER GetDesktopWindow IN Win32API
lnhWnd = GetDesktopWindow()
= SendMessage(lnhWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0)

A to je vše. Zdraví vás
Milan Kosina, kosina@vol.cz