Vazeni uzivatelia, snazil som sa spravit nejake prve demo ukazky, ktore Vam, verim, na zaciatku trosku pomozu. Ako uvidite, az na "kozmenticky" syntax prikazov spocivajuci v pridani prefixu DC_ sa na Clipper-ovskom kode nic nezmenilo. Niekde bude samozrejme treba pridat nejake "textove objekty" navyse, pripadne troska upravit postupnost niektorych prikazov, ale princip programu zostane zachovany. Budem sa to snazit strucne okomentovat, aj ked si myslim, ze je to dost zrozumitelne - v pripade nejakych nejasnosti ma kontaktujte eMail-om, ale predtym si najskor dokladne pozrite dokumentaciu Xbase++ a eXpress++! Samozrejme nechcem nahradzat priklady z dokumentacie alebo z demo verzii prislusnych produktov, len su tu spracovane najcastejsie Vase otazky, plus nejake moje doterajsie skusenosti. - hned uvodom, ak len chcete mat 32-bit-ovu "textovu" verziu, teda 100% kopiu Vasej DOS-ovskej aplikacie, tak sa nemusite s nicim trapit - a len jednoducho si ju prekompilujte pomocou Xbase++ - no a ak chcete mat plne GUI verziu, tak citajte dalej :-) - predtym ako zacnete studovat zdrojovy kod jednotlivych funkcii, vyskusajte si najskor vsetky volby z menu - v menu systeme som spravil az tri urovne menu(Evid.4) aj s jednou zakazanou polozkou-PragoSoft3 - na rychly vyber najcastejsie pouzivanych Volieb si mozete spravit TOOLBAR - napr. osoby, presuny, provizie... - na plochu si mozete umiestnit hocijaky obrazok(-y) - menu polozky PragoSoft 1, 2 a 4 maju po dve varianty, aj pre ovladanie- aktivovanie bud "zvolenymi" klavesami alebo funkcnymi klavesami F2... samozrejme ich mozete aktivovat aj kliknutym mysi; vid spravene funkcie pre Vas na osetrovanie stlacenych klaves; takze mysi sa nemusite pocas celeho behu programu ani dotknut ! - volby PS 1 a 2 su len take odlahcene priklady na rychle prehladne "zoznamenie sa" s problematikou a troska funkcnejsi priklad je v PS4, kde je aj pridanie, oprava a vymazanie polozky; rozmiestnenie jednotlivych poli GET si moc nevsimajte, je to velmi okliestnena verzia jednej obrazovky z nasho jedneho programu, ale je tu ukazana vacsina prikladov, s ktorymi sa stretnete ; tu si treba uvedomit jednu dolezitu vec, a to, ze vsetko su to objekty, preto napriklad ak v nejakej funkcii, ktoru volate, zmenite hodnotu nejakej polozky v hlavnou GetList-e, treba po jej navrate zavolat funkciu LOSTFOCUS-vid zrojak; takisto, nemozete priamo vypisovat hocikde a z hocikadial na obrazovku, nie ste MS-DOS-e, ale vzdy si musite najskor vytvorit prvotny objekt a potom jednoducho uz do neho "vpisujete" co len chcete-vid :setCaption(; - tu upozornim na funkcie pre VALID-aciu jednotlivych GET poli; a aj WHEN - takisto je tu ukazka aj Scope funkcii-vid GET PSC; skuste najskor vlozit 94911, potom 94901, potom 99999 a nakoniec 11111 a uvidite rozdiely - jednoducho sa treba len pohrat s niektorymi parametrami... - takisto tu mate spravene rychle ovladanie pri pridavani alebo oprave udajov na Zapis udajov(PGDN/ALT+Z) alebo Stornovanie zmien(ESC/ALT+S) s ToolTip napovedami - rychlo zistite, ze uzivatel sa nemusi pocas celeho behu programu mysi ani dotknut, takze sa neznizi ziadna produktivita prace, coho sa boji vacsina uzivatelov este DOS verzii ! - dolezita poznamka: napriek tomu, ze mate moznost ihned po vstupe novych udajov v hociktorom GET poli stlacit PGDN alebo ALT+Z alebo kliknut na OK, DOPORUCUJEM Vam vzdy potvrdit vstup stlacenim klavesy ENTER, aby sa vykonali spravne vsetky VALID-acie a ostatne podmienky, aj ked to vacsinou pracuje bez problemov, ale istota je istota :-) - na presun medzi jednotlivymi GET polami mozete pouzit ENTER, TAB, SHIFT+TAB, stlacit priradenu kombinaciu HOT-Klaves(vid ACCELKEY xbeK_ALT_B pre GET KodBanky vo funkcii Oprav() v PS4() ) alebo priamo kliknut mysou do pozadovaneho GET pola(tu ale doporucujem vzdy kliknut na jeho zaciatok, nie niekde "v nom") - trosku iny sposob vytvorenia Browse objektu a PuschButton-ov je ukazany vo volbe Banky - TestUpdated()- ukazky testovania aktualizacie GET-ov, ci bola zmenena ich povodna hodnota alebo nie, a nasledny zapis udajov len pri ich zmene, aj ked bol ukonceny vstup ako OK;(inak povedane, naco sa zdrzovat zapisovanim udajov na disk-hlavne pri praci v sieti, ak neboli zmenene); na rozdiel od funkcie Updated() tato kontroluje nielen normalne GET-y, ale aj CheckBox-y, ComboBox-y a vsetky ostatne GET objekty; - vyzaduje pridat volbu SAVE do GETOPTIONS, DC_GetRefresh() a DC_GetOrigSet() do EVAL pre DCREAD, po ukonceni vstupu TestUpdated() a DC_GetDestroy() na konci - vid Pridaj/Oprav funkcie vo volbe Banky a PragoSoft4 - ak citate/editujete priamo databazove polia, napr. MENO, OBEC v databaze OSOBY, tak bud na zaciatku procedury/funkcie ich treba deklarovat ako FIELD MENO, OBEC alebo este lepsie(doporucovane!) je pouzivat ich alias databazy, teda napr. OSOBY->MENO, OSOBY->OBEC - takisto aj vsade inde v programe pouzivajte spolu nazvami poli aj ich aliasy prislusnej databazy, a takisto aj dopurucujem kvoli "istote" vzdy nastavit prislusnu pracovnu databazu pomocou dbSelectArea() - pomocou Filtra v Browse-ri si mozete "obmedzit-filtrovat" zaznamy podla lubovolneho pola a lubovolnej podmienky - pomocou Hladaj v Browse-ri si v aktualnom stlpci od aktualnej pozicie/vety mozete postupne vyhladat vsetky zaznamy splnajuce Vasu podmienku - spravil som aj par ukazok na Progress Bar; ja osobne ich nepouzivam vobec, alebo len velmi malo, pretoze cas na ich vytvorenie/aktualizaciu/znicenie je niedeky/vacsinou dlhsi ako vlastne vykonanie prikazu; preto ja pouzivam Objekt TEXT, kde len menim jeho text, ktory v podstate vobec nezdrzuje a splni tu istu "informacnu" funkciu - vid priklad "Test Skip+Print - 1 RecNo() - info text" a "Test Progress varianta 2" - BROWSE objekt zabera dost pamate a systemovych prostriedkov a aj je trosku pomalsi, "doporucuje sa" vsade tam, kde nie je potrebna az taka "konfigurovatelnost" (napr. pri obycajnom prezerani DBF suborov a ich aktualizovani cez dalsie funkcie (napr.Pridaj/Oprav apod.), pouzivat QUICKBROWSE objekt, ktory splna tu istu informacnu funkciu, ale vzhladom na jeho interny navrch je super rychly a zabera minimum syst.zdrojov; ma vyznam pouzivat ho aj na rychlych PC a nielen na pomalych; inak povedane, naco sa zbytocne zdrziavat pomalym vykreslovanim nejakych nepodstatnych veci - najvacsi rozdiel medzi rychlostou prace a celkovou narocnostou ihned zbadate, ked budete prezerat DBF s nastavenou nejakou FILTER alebo SCOPE podmienkou, a to je dost casta situacia v realnych podmienkach u zakaznika, ked ho zaujima len nejaka podmnozina zaznamou - ak si pozriete priklady Obce A a Obce B, tak uvidite len minimalne rozdiely v ich strukture, ale obrovsky rozdiel v rychlosti prezerania a reakciach - tu si vsimnite funkcie konciace na _Q, riadky/funkcie obsahujuce odkazy na M->nRecnoDB a vyskyty funkcii dbSuspendNotifications() a dbResumeNotifications(); skuste si ich aj "zaremovat", aby sa nekompilovali a uvidite ich vyznam v pouzitych funkciach - skuste si nastavit Filter na rovnaku podmienku v oboch prikladoch (napr."TRA $ OBEC" pomocou Funkcie Filter) a potom len jednoducho prezerat DBF - rozdiel v rychlosti je velky aj na mojom Intel Pentium IV 1.5GHz, takze nie je to urcene len pre pomale PC - ako uvidite, skip-ovanie filtrovanej databazy, ked su zaznamy, ktore splnaju pozadovanu podmienku "fyzicky" dost od seba vzdialene, tak pri QuickBrowse objekte to vobec "necitite" na rozdiel od Browse objektu; tu vyrazne rozhoduje aj to, ako mate nastavene Syst.par. v Servise pre Browse objekty, ci na "A" alebo "N" ! - skuste si v Servis-Parametre nastavit najskor posledne styri nastavenia pre Browse na A(ano) a potom druhykrat na N(nie) a len jednoducho prezerajte-prechadzajte databazu hore-dole. Najlepsie uvidite rozdiel, ked skocite na koniec databazy(CTRL+PGDN): a) a len stlacte klavesu-sipku "posun hore" a drzte ju, b) alebo stlacte klavesu PGUP "skok o stranku hore" a drzte ju; - rozdiely v oboch pripadoch(Browse/QuickBrowse) v rychlosti posunu a aj v prekreslovani su obrovske, vyskusajte si to aj s "A" aj "N" volbou v parametroch pre BROWSE a aj QUICKBROWSE objekt - takisto je "trochu" citit rozdiel, ak je databaza otvorena Vyhradne-Exclusive alebo Zdielane-Shared - udaje zo suboru ParamSys.INI su "zdielane" aj nasimi DOS-ovskymi verziami programov; tu doporucujem zvazit nastavenia pre posledne parametre pre Browse/QuickBrowse objekty na "A"(Ano) vs. "N"(Nie)-nastavenie na "A" je sice efektne, ale "troska" zdrzuje obcas posuny po velkych databazach; Naopak, "N" vyrazne zrychly presuny po databazach a prekreslovanie objektu Browse a aj QuickBrowse; niekedy je samozrejme "ziaduce-pozadovane" zobrazovat priebezne aktualne cislo vety, pocet zaznamov splnajucich podmienku a akt.stav PushButtonov - dobry "kompromis" je QuickBrowse s "A" - spravene su aj funckie na Nahlad pred tlacou a vlastnu tlac TXT suborov s moznostou vyhladavania "hladaneho" textu priamo vo vytvorenej zostave - pomocou funkcie Demo() si mozete "vyrobit" demo verziu a hlasky v urcitych casovych intervaloch a bud nechat na uzivatela, aby ukoncil program "dobrovolne" alebo po uplynuti zadaneho casu jednoducho "skoncit"- quit... - pripojil som aj zopar uzitocnych funkcii vyuzivajucich priamo systemove DLL, ako zistenie serioveho cisla disku, velkost dostupnych systemovych zdrojov, priame vyvolanie posty(eMail) apod. - ak nemate rsrc16.dll/rsrc32.dll, tak si ich nainstalujte cez volbu Pridat-Ubrat programy/Instalacia Windows/Systemove nastroje/Merac systemovych prostriedkov - pripojil som aj funkcie, ktore som si vyrobil na spakovanie/rozbalenie a zalohovanie/obnovenie suborov na disk/disketu; vyznam jednotlivych parametrov WinRar(min.ver.2.9) si pozrite v jeho dokumentacii; Princip je jednoduchy: vytvori sa adresar Zaloha a podadresare Mesiac01-12 a AktualnyDen. Pri kazdom starte/ukonceni programu sa vytvori/zaktualizuje archiv v prislusnom podadresari podla aktualneho dna v mesiaci(ak este neexistuje, tak sa najskor vytvori) a potom sa spravi aj kopia do adresara Aktualny den ako podadresar Hodina/Minuta. Tymto mam zarucene to, ze ak z nejakeho dovodu sa porusi nejaka databaza/zisti sa nejaky problem, tak sa v ten den viem vratit k stavu, kedy to este bolo v poriadku (preto mam nastavene, ze automaticky sa zalohuje kazde XX hodin-vid funkcie Test_Zal() a PM() ), alebo, ked to zistim o den, dva, resp, neskor, viem sa vratit k stavu k urcitemu dnu, kedy to bolo este ok. Zaroven sa kontroluje, ci nahodov nie je "novy den", ak ano, tak sa cely obsah adresara AktualnyDen vymaze, aby sa to tam nepoplietlo-nehromadilo. Sumarum: vzdy mam poslednu zalohu z kazdeho dna plus priebezne zalohy aktualneho dna. - na SAY doporucujem pouzivat font "Arial CE" a na GET "Courier New CE"; font "Times New Roman CE" nie je moc vhodny na SAY, nie je tak citatelny - po spusteni volby Benchmark uvidite, preco sa "doporucuje" pouzivat kvoli celkovej rychlosti behu programu hlavne Local/Static premenne; samozrejme je niekedy takze alebo nemozne uplne Private/Public prestat pouzivat, lebo ich vidiet "skoro vsade" bez nutnosti ich posielat ako parametre - takisto sa odporuca programy spustat na Windows2000 alebo WinXP, pretoze len to su skutocne 32-bit-ove systemy, Win9x maju plno stareho kodu a je to citit(ale da sa to prezit); na Win2000/XP to chodi jedna radost; vid web podstranku Testy - pri praci so sietovymi verziami Vasich aplikacii Vam velmi moc doporucujem kvoli "velkosti" EXE suborov a DLL kniznic mat ich nahrate na kazdom jednom lokalnom pocitaci a spustat program z neho a nie mat len umiestneny jeden EXE subor s DLL kniznicami na sietovom disku a spustat to zo servera; rozdiel "v rychlosti" uvidite sami :-) - na serveri majte ulozene len databazy Vytvorenie projektu a kompilacia: napriek tomu, ze je to dost podrobne a nazorne popisane a ukazane aj v dokumentacii Xbase++ a aj eXpress++, tak Vas na nu v prvom rade odkazujem, ale aj prikladam strucne ukazky a postupy, ako to robim ja: princip je rovnaky ako v Clipper-i, len rozdielne su programy, ktore kompiluju(XPP vs CLIPPER) a linkuju(PBUILD vs RMAKE) vytvorene XPJ subory, tzv.projekty(v Clipper-i to boli RMK/LNK subory) -Xbase: aby som nemusel stale pisat postupnost tych istych prikazov, ked idem vytvarat novy projekt, tak som si vyrobil BAT subor, kde to mam z automatizovanem, a uz len napisem "xpj cHlavnyPRG", kde miesto cHlavnyPRG dam nazov hlavneho PRG suboru, teda napr. "xpj test"; no a potom neskor, ked spravim nejake zmeny v zdrojakoch, uz len spustam _mybuild.bat na prekompilovanie zmien a vygenerovanie noveho EXE s tym, ze ak by tam bol nejaky problem, tak chybove hlasky su presmerovane do suboru _errost.txt - subor XPJ.BAT a GUI.EXE si nahrajte do adresara, na ktory mate nastavenu cestu-PATH, aby ste ho spustit z lubovolneho adresara -Xbase+eXpress: tu si len vzdy skopirujete nejaky Vas subor projektu a do casti pre PRG subory si napiste vsetky subory, ktore sa maju linkovat -ak si chcete pridat priamo do EXE programu nejake dalsie ikony, bitmapy apod, napr.MOJELOGO.BMP, tak ho treba -nakopirovat do adresara \exp17\bitmaps, -pridat-zadefinovat do \include\dcbitmap.ch novu hodnotu pre neho, napr. #define BITMAP_MOJELOGO 9999 -pridat-zadefinovat do \lib\express.arc BITMAP_MOJELOGO = "..\BITMAPS\mojelogo.bmp" -prekompilovat zmeny suborov prikazom "arc express" -prekomplilovat dclipx.xpj v adresari \source\dclipx a nakopirovat nove dclipx.* do \lib -tu mozete vyuzit moj _cl.bat subor, ktory treba vzdy spustit aj po naistalovani kazdej novej verzie eXpress-u Ak sa Vam zle zobrazuju narodne znaky, tak si: a) bud si v projekte nastavte GUI = no (plati pre textovy rezim), alebo b) si upravte v appsys.prg standardny font "Alaska Crt" na "Courier New CE" a prilinkujte si ho k aplikacii(plati pre text/GUI rezim), alebo c) pouzite pre jednotlive objekty fonty Arial CE, Courier New CE alebo Times New Roman CE - plati pre plne graficky rezim GUI vid priklady v podadresari CLIP_XBA; neviem, ci to funguje-neskusal som to s kodovou strankou Kamenickych, ale ak mate udaje/texty v Latin2, tak je to bez problemov; pripadne si to prekonvertujte z kodu Kamenickych do Latin2, pretoze ramceky v plne grafickom rezime aj tak nebudete potrebovat - zmeny v jednotlivych verziach citajte v subore _verzie.txt, vyhradzujem si pravo robit zmeny kodu a funkcnosti bez upozornenia ! Dufam, ze Vam tieto moje skusenosti, rady a vysledky z doterajsej prace pomozu a budem vdacny za spatny ohlas a kontaktovanie v pripade hocijakych nejasnosti. - pripojeny subor praha.exe treba nahrat do hlavneho adresara na disku C: a len spustit - vytvori sa podadresar praha so vsetkymi potrebnymi subormi - spustite _mybuild.bat na vytvorenie exe suboru - pre spravne zobrazovanie "narodnych" textov je potrebne prekompilovat kazdu novo-nainstalovanu verziu eXpress-u - na to vam posluzi subor _cl.bat. Tento prekopirujte do adresara c:\exp17\source\dclipx a len ho spustite, pripadne si ho upravte podla potreby - neplati pre demo verziu na nasej stranke, ta uz je upravena - nezabudnite mat nastavene cesty v autoexec.bat: SET ALINK=/PM:PM SET XPPRESOURCE=C:\ALASKA\XPPW32\RESOURCE SET PATH=%PATH%;C:\EXP17\LIB;C:\ALASKA\XPPW32\BIN;C:\ALASKA\XPPW32\LIB SET LIB=C:\EXP17\LIB;C:\ALASKA\XPPW32\LIB SET INCLUDE=C:\EXP17\INCLUDE;C:\ALASKA\XPPW32\INCLUDE ak mate aj eXpress++ 2.0, tak cesty k nemu treba napisat pred eXpress17++ a Xbase++, teda: SET ALINK=/PM:PM SET XPPRESOURCE=C:\ALASKA\XPPW32\RESOURCE SET PATH=%PATH%;C:\EXP20\LIB;C:\EXP17\LIB;C:\ALASKA\XPPW32\BIN;C:\ALASKA\XPPW32\LIB SET LIB=C:\EXP20\LIB;C:\EXP17\LIB;C:\ALASKA\XPPW32\LIB SET INCLUDE=C:\EXP20\INCLUDE;C:\EXP17\INCLUDE;C:\ALASKA\XPPW32\INCLUDE Dolezita poznamka: aby vsetky demo ukazky pracovali spravne, je potrebne mat stiahnute eXpress++ 1.7, min. verziu 208 (vid \exp17\readme.txt) demo z nasej www stranky, + Xbase++ 1.7 demo a PFL1 a aj PFL1b Vela uspechov v programovani Vam zela Zdeno Bielik - ACE System Vas Autorizovany obchodny partner pre Cesku a Slovensku republiku http://www.xbase.sk