PCPROG.4

22 Apr 1994 - 05 Jan 1995

Topics

  1. algoritmi (153)
  2. comment (15)
  3. ms.dos (123)
  4. windows (304)
  5. asembler (103)
  6. basic (80)
  7. jezici (196)
  8. pascal (880)
  9. cccc (586)
  10. cpp (157)
  11. clipper (1267)
  12. baze.podataka (525)
  13. razno (529)

Messages - baze.podataka

baze.podataka.415 djelovic, -> #414, max.headroom
> Ali... Pošto je sve relativno u odnosu na font koji se koristi (moj > slučaj: Arial, 8 pts), meni treba nekakva vrsta ofseta kojim ću > množiti tamo-neke-koordinate i tako dobijati "od-do" vrednosti za > linije tog mog okvira. Zna li neko ofsete (vertikalne i horizontalne)? Dialog Box Measurements Every dialog box template contains measurements that specify the position, width, and height of the dialog box and the controls it contains. These measurements are device independent, so an application can use a single template to create the same dialog box for all types of display devices. This ensures that a dialog box will have the same proportions and appearance on all screens despite differing resolutions and aspect ratios between screens. Dialog box measurements are given in dialog base units. One horizontal unit is equal to one-fourth of the average character width for the system font. One vertical unit is equal to one-eighth of the average character height for the system font. An application can retrieve the number of pixels per base unit for the current display by using the GetDialogBaseUnits function. An application can convert measurements from dialog base units to pixels by using the MapDialogRect function. The template must specify the initial coordinates of the upper left corner of the dialog box. Usually the coordinates are relative to the upper left corner of the owner window's client area. When the template specifies the DS_ABSALIGN style or the dialog box has no owner, the position is relative to the upper left corner of the screen. Windows sets this initial position when it creates the dialog box, but permits an application to adjust the position before displaying the dialog box. For example, an application can retrieve the dimensions of the owner window, calculate a new position that centers the dialog box in the owner window, then set the position by using the SetWindowPos function. The template should specify a dialog box width and height that does not exceed the width and height of the screen and ensures that all controls and are within the client area of the dialog box. Although Windows permits a dialog box to be any size, creating one that is too small or too large can prevent the user from providing input, defeating the purpose of the dialog box. Many applications use more than one dialog box when there are a large number of controls. In such cases, the initial dialog box usually contains one or more push buttons that the user can click to display the next dialog box. [From the Microsoft(R) Windows(tm) API]
baze.podataka.416 moebius,
Pretpostavljam da ovo svi vec znaju, sem mene.. Kako izgleda .DBF na disku? Hteo bih da napisem C rutine za otvaranje .DBF pa mi treba opis formata. Ajde budite dobri, pomozite.. Dragan
baze.podataka.417 ndragan, -> #404, mdrazic
/ naziv diska veš samo path (npr. ĐappĐbazeĐ ). Tada sve u aplikaciji Ili još lepše, spakuješ imena direktorija u par javnih promenljivih, koje definišeš u nekom init programu, pa prilikom selidbe samo to promeniš.
baze.podataka.418 gaston, -> #371, djelovic
>>>Bre! :) Zasto jednostavno ne napravite dve baze, jednu sa indeksima i jednu >>>bez, pa uradite compare? Tako cete najbrze otkriti u kom zecu lezi grm. Ozbiljno: Zahvaljujem djelovic-u na sugestiji o nacinu kako pronaci mesto u FOX DBF-u gde se belezi informacija o tome da li baza ima CDX ili ne. Konkretno: Komparirao sam dve baze, jednu bez CDX i drugu sa njim i otkrio da je oznaka na 29-om bajtu od pocetka DBF fajla (odnosno zaglavlja). Kao dokaz prilazem programce za proveru: procedure CheckCDX * Proverava treba li DBF da ima CDX fajl ISKLJUCIVO na osnovu * oznaka u zaglavlju DBF fajla * public zagl, name_dbf ************* 1. SLUCAJ: DBF BEZ CDX * kreiranje DBF fajla sa jednim poljem, bez CDX name_dbf = "bez_cdx.dbf" create table (name_dbf) (polje1 N(10,2) ) use * citanje zaglavlja pomocu funkcije Zaglavlje() zagl = Zaglavlje("bez_cdx.dbf") if Empty(zagl) wait "CITANJE ZAGLAVLJA NIJE USPELO !" window return endif * ispisivanje informacija u fajl if File("A1.TXT") Erase A1.TXT endif =Ispisi() * pregled fajla modi file a1.txt ************* 2. SLUCAJ: DBF SA CDX * kreiranje DBF fajla sa jednim poljem, SA CDX name_dbf = "sa_cdx.dbf" create table (name_dbf) (polje1 N(10,2) ) index on polje1 tag polje1 use * citanje zaglavlja pomocu funkcije Zaglavlje() zagl = Zaglavlje("sa_cdx.dbf") if Empty(zagl) wait "CITANJE ZAGLAVLJA NIJE USPELO !" window return endif * ispisivanje informacija u fajl =Ispisi() * pregled fajla modi file a1.txt erase bez_cdx.dbf erase sa_cdx.dbf erase sa_cdx.cdx erase a1.txt return ******************** function Zaglavlje * * Funkcija otvara DBF fajl na niskom nivou, cita zaglavlje * i smesta ga u znakovnu promenljivu z * * parametri: ime_dbf - znakovna promenljiva, ime DBF fajla * vraca: z - znakovna promenljiva sa rezultatom * parameters ime_dbf private z * otvaranje DBF fajla na niskom nivou ff = FOpen( ime_dbf, 12) if ff < 0 wait 'Greska pri otvaranju fajla.' window nowait return "" endif * postavljanje pokazivaca na pocetak i citanje zaglavlja (prvih 32 bajta) =FSeek(ff, 0, 0) z =FRead(ff, 32) =FClose(ff) return z ******************** function Ispisi * ispis ide u tekstualni fajl A1.TXT SET ALTERNATE TO A1.TXT ADDITIVE SET ALTERNATE ON ? "Podaci o DBF fajlu: ", name_dbf * zdraknite malo kako izgleda zaglavlje sa kukama i kvakama ... ? zagl * a zatim ce biti ispisan broj ASCII koda za svaki bajt (znak) u zaglavlju for i = 1 to Len(zagl) s = SubStr( zagl, i, 1) s = PadL( AllTrim( Str( Asc(s),3,0) ), 3, "0") ? i, " ", s next ? ? * specijalno, na 29-om mestu je oznaka da li DBF ima CDX s = substr( zagl, 29, 1) if Asc(s) = 1 ? CHR(7) ? "29.-ti bajt je: ", Asc(s), " DBF bi trebalo da ima CDX fajl !" else ? "29.-ti bajt je: ", Asc(s), " DBF --- NEMA --- CDX fajl !" endif ? CLOSE ALTERNATE SET ALTERNATE OFF SET ALTERNATE TO return Eto, toliko od mene ... P.S. Naravno, to ne oslobadja ndragan-a da ispuni preuzetu obavezu i posalje celokupnu strukturu FOX DBF i ostalih fajlova ... B) P.S.2. Zlobno: A sada malo ciste zlobe: To pokazuje da _lipper-asi koji tajno prate ovu temu ne bi li nesto naucili, toliko dobro hvataju FOX-ove fazone da ne samo sto uspesno ucestvuju u raspravama, nego sam vise nego siguran da ce im to jednog lepog dana, kada ih Svevisnji bude prosvetlio i priveo k pravom programskom paketu za izradu programa za baze podataka i otimanje para od korisnika, vise nego korisno posluziti. Stavise, mislim da znam krajnju fazu u preobracenju _lipper-asa u FOX-ovca: kada pocnu da diskutuju o SQL-u, dan velikog prosvetlj- enja i konacnog preobracenja nije daleko ... B->>>>> Neka se djelovic ne ljuti, zloba ionako dolazi od coveka najgore fele: od bivseg _lipper-asa koji je uspesno presao na FOX ... B--->>>>>>>>>>>> P.S.3. Zamalo da zaboravim: _lipper-asi ne moraju da se brinu, prilikom prelaska iz jedne u drugu veru nisu mi nista odsekli... Cak sam se posle toga uspesno ozenio i dobio cerkicu ...B)
baze.podataka.419 max.headroom, -> #412, dpredovic
> služi samo za pregled). SET CURSOR OFF se pravi mnogo > pametan, pa se Kursor je isključen (sa SET CURSOR OFF) u samo tri slučaja: GET nekog polja, INKEY() i za vreme trajanja WAIT komande. > ON KEY LABEL <somekey> DO someproc *** TEST.PRG ON KEY LABEL F2 DO x USE baza ORDER tag1 DEFINE WINDOW a FROM 1,1 TO 10,50 TITLE "Browser" BROWSE FIELDS ime, prezime WINDOW a ... ... *** X.PRG CLOSE DATA USE baza ORDER tag2 BROWSE LAST KEYBOARD "šENTERć" RETURN Samo, koncepcija ti loša :) Lakše ti je da mu prvo ponudiš koji ćeš ORDER da obrađuješ, pa tek kada on kaže "ime" ili "prezime", ti mu udariš BROWSE.
baze.podataka.420 mdrazic, -> #418, gaston
> A sada malo ciste zlobe: To pokazuje da _lipper-asi koji tajno prate ovu > temu ne bi li nesto naucili, toliko dobro hvataju FOX-ove fazone da ne > samo sto uspesno ucestvuju u raspravama, nego sam vise nego siguran da ce > im to jednog lepog dana, kada ih Svevisnji bude prosvetlio i priveo k > pravom programskom paketu za izradu programa za baze podataka i otimanje > para od korisnika, vise nego korisno posluziti. Stavise, mislim da znam > krajnju fazu u preobracenju _lipper-asa u FOX-ovca: kada pocnu da > diskutuju o SQL-u, dan velikog prosvetlj- enja i konacnog preobracenja > nije daleko ... B->>>>> Možda Clipperaši samo hoće da pomognu braći sapatnicima Foxovcima :) Clipperaši mogu da biraju: hoće li da rade sa .NTX, .CDX (Fox), .NDX,.MDX (dBase), .NSX (SiX). Zato Clipperaši znaju neke od problema koji muče Foxovce. Kada Clipperaši počnu da diskutuju o SQL-u tada neće pogledavati u pravcu Fox-a, već će koristiti Visual Objects :))) Ne shvatite me pogrešno, mislim da je Fox sjajan softver, ali ipak koristim Clipper zato što: a) u vreme kada sam počeo da radim nisu mogli da se porede, b) i dalje su jezik, prateće biblioteke, otvorenost, objektna orijentacija i mogućnost proširenja na strani Clippera. Kada počnemo nešto ozbiljno da radimo u VO, poredićemo i Windows aplikacije, za sada Fox ovde vodi 1:0. Nadamo se bar izjednačenju :)) Milan
baze.podataka.421 dpredovic, -> #419, max.headroom
>> služi samo za pregled). SET CURSOR OFF se pravi mnogo >> pametan, pa se > > Kursor je isključen (sa SET CURSOR OFF) u samo tri slučaja: > GET nekog polja, INKEY() i za vreme trajanja WAIT komande. I nema šansone da ga isključim u browsu? > Samo, koncepcija ti loša :) Lakše ti je da mu prvo ponudiš > koji ćeš ORDER da obrađuješ, pa tek kada on kaže "ime" ili > "prezime", ti mu udariš BROWSE. Koncepcija mi se dopada, em ukida jedan nivo menija, em nema potrebe da čovek gasi tabelu, pa opet trči kroz menije samo da bi dobio drugi redosled. Inače, pronašao sam fazon: SHOW WINDOW REFRESH :)
baze.podataka.422 dpredovic, -> #416, moebius
> Hteo bih da napisem C rutine za otvaranje .DBF > pa mi treba opis formata. Jedan source, hiljadu reči... Ovo radi sekvencijalni pregled baze, iz c-a. dbflist.zip
baze.podataka.423 moebius, -> #422, dpredovic
> Jedan source, hiljadu reci... Ovo radi sekvencijalni pregled baze, > iz c-a. Pravo u metu! Hvala Dragan
baze.podataka.424 goxx, -> #418, gaston
■ ■ Komparirao sam dve baze, jednu bez CDX i drugu sa njim i otkrio da je oznaka ■ na 29-om bajtu od pocetka DBF fajla (odnosno zaglavlja). ■ Kao dokaz prilazem programce za proveru: ■ procedure CheckCDX ■ * Proverava treba li DBF da ima CDX fajl ISKLJUCIVO na osnovu ■ * oznaka u zaglavlju DBF fajla Nekome sam odgovorio (pre petnaestak dana) da u dbf fajlovima nema informacija o indeksima. Po ovome bi moglo da se kaže da nisam u pravu, ali ... Prevashodno nisam mislio na to da li postoji indeksni fajl ili ne već, ako postoji kako se on zove jer nam je jedino ta informacija relevantna. Zato je najbolje imati neki rečnik baze podataka pa na osnovu njega kontrolisati integritet baze (baza = svi fajlovi). ■ P.S.2. Zlobno: ■ ... ■ _lipper-asa u FOX-ovca: kada pocnu da diskutuju o SQL-u, dan velikog ■ prosvetljenja i konacnog preobracenja nije daleko ... B->>>>> ■ ... ■ Neka se djelovic ne ljuti, zloba ionako dolazi od coveka najgore fele: ■ od bivseg _lipper-asa koji je uspesno presao na FOX ... B--->>>>>>>>>>>> Kad već vučeš za jezik :)) Jel može nešto u tom FOX-u da se napiše, a da izgleda lepo ? Šta će vam oni silni znaci jednakosti u pozivima funkcija za rad sa fajlovima na niskom nivou? :))))). Goran
baze.podataka.425 pedjolino,
Jedno ORACLE pitanje. Postoji li nacin da se u Forms-ima odradi rollback a da ne odradi i clear_form. Negde pise da ne moze ali me zanima koristi li neko neki trik za to. Naime posle upotrebe rollbacka u bilo kojoj proceduri koja odradjuje komplikovanu transakciju ili napolje iz forme ili ponovni execute_query, pa skok na slog gde je bio i ostale zezalice.. Ne pomaze ni koriscenje savepointa, bar ja ne videh kako. Pozdrav Nenad.
baze.podataka.427 bulaja,
Ima li neko Windows ODBC drajver za FoxPro datoteke? Znači treba mi osim za standardne .DBF baze podataka još i za .CDX indekse i .FPT memo polja.
baze.podataka.428 max.headroom, -> #421, dpredovic
> Inače, pronašao sam fazon: SHOW WINDOW REFRESH :) Jest, ba! :) (Prozori, prozori, a ja kopao po BROWSE-u...)
baze.podataka.429 max.headroom,
DATA DICTIONARY Ako vas pri svakoj novoj aplikaciji (FoxPro v2.5 for Win) zatrpava sveža gomila papira sa opisima baza, polja, tagova, relacija i svega ostalog, dakle, relevantnog - ovaj programčić je prava stvar. Uvek pristupačan i krajnje jednostavan. "Dolje papir! čivjela elektron'ka!" :) datad.arj
baze.podataka.430 misa.m, -> #427, bulaja
>> Ima li neko Windows ODBC drajver za FoxPro datoteke? Ima.
baze.podataka.431 szeman, -> #422, dpredovic
>> Jedan source, hiljadu reči... Ovo radi sekvencijalni pregled baze, iz >> c-a. Hvala ti puno i od mene, ubih se sa onim zezalicama iz bltc18z.zip (koja je, uzgred, sa bug-om.)
baze.podataka.432 ndragan, -> #411, oki.
/ Valjda je za stari Fox (Base)? Tj. za nešto što bi moglo da trči i na super turbo ih teu sa nan tan tatasturom? Kome to još treba?
baze.podataka.433 ndragan, -> #414, max.headroom
/ č 10,5 GET x / =OKVIR(10,5,20) č 10,5 GET x size 1, 28 =OKVIR(10, 5, 1, 28) S tim da okvir crtaš tako da bude otprilike za 0.1 do 0.2 širi na sve strane oko polja. E sad, zašto 28. Treba ti oko 30% šire polje, inače ako uneseš dva tri velika slova, neće ti stati, bez obzira na font. Takođe, prilikom ubacivanja parametara za tu funkciju bi trebalo da bude uzeta u obzir i srednja širina fonta za rečeni objekat u odnosu na širinu fonta za ceo prozor, pošto se veličine za okvir računaju upravo preko ovog poslednjeg (visina i srednja širina difolt fonta za prozor), a tvoj objekat može da ima i neki drugi font. Sve skupa, prilikom prebacivanja aplikacije iz dosa pod pendžere, gdegod spaziš len( ) i Define window from ... to / size, računaj da ćeš imati da računaš. Vrednosti preuzete iz dosa će funkcionisati, al' ima da rodiš mečku dok počne da liči na nešto. / (ja dobih 0.8 kao horiz. offset, ali to nije dovoljno precizno - fale Rešenje je da uzmeš odnos širine fonta za objekat podeljeno sa širinom fonta za prozor (srednje!) i dobijenim koeficijentom množiš parametre u proceduri koji se odnose na širinu, a odnosom visina da množiš visinu, pa onda plus nešto da dobiješ razmak. BTW, kod mene stoji set readborder off, mnogo je lepše kad sam nacrtaš ispupčeni ili udubljeni okvir, mada to ume da potraje (masku sa dvadesetak polja i tridesetak takvih okvira iscrtava do deset sekundi na 486/40 sa 8M) (mada, našli smo načina da i tome doakamo :).
baze.podataka.434 ndragan, -> #410, isimic
/ Ima li neko literaturu za FoxPro 2.6 Library Construction Kit? Ili, / kako se od C programa prave biblioteke za FoxPro 2.6? Knjiga uopšte nije naivna, samo formatu parametara koji se prosleđuju tamo i nazad posvećeno je prvih dvadesetak strana. Dovoljno je džebeno da smo to ostavili za neka vremena kad bude vremena za eksperimentisanje. Da, knjiga je ista od 2.5.
baze.podataka.435 ndragan, -> #412, dpredovic
/ Padalo mi je napamet neko zezanje sa refresh, ali nisam uspeo da / izvedem nista mnogo pametno... Štos je u tome da ne treba da daš refresh na prozor u kome se nalazi brauz, nego na sam brauz prozor. Njegovo ime je jednako aliasu baze, osim ako mu daš naslov, kada je jednako prvoj reči naslova, tj. najbolje je da naslov strpaš u promenljivu, koja ti posle sadrži i ime pendžera koji treba osvežiti (*) . BTNJ, ako je instaliran 852 i u config.fp stoji codepage=auto, taj naslov, kao i sva moguća imena (baza, polja, procedura, promenljivih, pendžera itd) mogu da sadrže šđžčć, koje ispravno prepoznaje i u velikim i malim slovima. ------ (*) za osvežavanje ne preporučujem ni pepsIkolu ni kokAkolu, čak i moja najmlađa ćerka je izjavila da je to 'isto govno'. Najbolje samo jedan Show Window (ime_pengera) Refresh jer garantovano osvežava, a ne goji.
baze.podataka.436 max.headroom, -> #433, ndragan
> off, mnogo je lepše kad sam nacrtaš ispupčeni ili > udubljeni okvir, mada to ume da potraje (masku sa > dvadesetak polja i tridesetak takvih okvira iscrtava do > deset sekundi na 486/40 sa 8M) (mada, našli smo načina da > i tome doakamo :). 'Ebem li ga da li mu ovo dođe pod "baze.podataka", al' šta ćeš - Win radi svoje :) Elem, ja setujem READBORDER na ON, a potom nacrtam ivice da izgleda kao da je udubljeno. Efekat se time malčice pojačava (stvar ukusa). Nego, za ono "brzo" iscrtavanje prozora: da li je trik da ga prvo DEFINE, potom crtkaš, pa tek na kraju ACTIVATE? Dobiješ utisak da ga odmah "baci" na ekran :)
baze.podataka.437 aandrejin,
Imam pitanje u vezi sa ACCESS-om 2. Forma ima 3 polja. Hoću da izvedem da ako je polje1=null onda da druga 2 polja budu enabled=false, odnosno da "posive". Možda je od neke važnosti što je polje1 text, a druga 2 polja datumi. Ovo je u VBasicu najprostija stvar, ali meni u ACCESSu nikako da uspe. Unapred hvala na odgovoru. HPS: probo sam i sa IsNull funkcijom ali :(
baze.podataka.438 peca.st,
Hi svima! Koristim FoxPro for Windows 2.6. Rade}i sa njim, uo~io sam potrebu za kori}enjem nekih ve} postoje}ih SW procedura i funkcija, kako ne bih nanovo izmi{ljao toplu vodu. Recimo, trenutno sam u "pohodu" za 'Incremental Search' rutinom. Znate li mo`da gde mogu na}i neke rutine ove vrste za svoju vrziju FoxPro-a? Ima li neko od vas ne{to {to bi mi moglo pomo}i? Hvala unapred! :) Puno pozdrava!
baze.podataka.439 max.headroom,
VEZA: C => FOXPRO for WIN (1/4) (Prolog: tekst je za C-debile poput mene, ali može da se iskopa i ponešto korisnoga - kao i iz svakog tematski uokvirenog štiva, uostalom. Pod pojmom "C-debil" podrazumevam osobu koja se programiranja latila tek od mas-manije usmerene na Xbase jezik. Da sam hteo da učim C, sada bih pisao UNIX za digitalne časovnike, a ne aplikacije koje ne ispuštaju bazu podataka ni posle shut-down-a. Drugim rečima - "da sam školu učio, ne bih ovde čučio. Prstom pokaži gde se kuglica nalazi" ;) * * * Iako (svi znamo da) je FoxPro kompletan sistem za razvoj aplikacija, postoji potreba za njegovom primenom na mestima gde Fox-ova snaga ne može da dođe do izražaja zbog pomanjkanja funkcija koje podržavaju željenu vrstu "razonode" (primera radi: komunikacija sa A/D konverto- rom). Druge aplikacije su u .DLL formatu, i njih možemo koristiti samo ako je omogućena njihova veza (link) sa FoxPro-om. Srećom, još od FoxPro-a v2.00 postoji API (Application Programming Language) koji omogućuje korisniku da postojeći sistem nadogradi proizvoljnim brojem novih funkcija. Te funkcije se odnose na, kao što sam pomenuo, pisanje i čitanje sa A/D konvertora, I/O porta (dakle, raznorazne modemske komunikacije nama dobro znane), itd. Koristeći API, možemo sistem nadograđivati koliko nam volja što mrežnim, grafičkim i ostalim funkcijama, i, što je najvažnije, preko njega dobijamo pristup neograničenom broju Windows aplikacija i .DLL-a. Da bi pristupili eksternoj biblioteci rutina (.FLL fajlovi), koristimo komandu SET LIBRARY TO. Najčešće su pomenuti .FLL fajlovi pisani u C-u ili asembleru. Majkrosoftov "Library Construction Kit" (LCK) sadrži sav kod neophodan da bi se kreirao jedan .FLL fajl, kao i one osnovne funkcije koje čine samo jezgro Fox-a (pristup .DBF fajlovima, prozorima...). Pošto smo nabavili i instalirali LCK, potrebno je imati i standardni C-kompajler (kao što su Watcom C, odn. Microsoft C/C++). Tada posedujete sav alat neophodan za kreiranje, kompajliranje i linkovanje C programa u .FLL datoteku. Tekst koji sledi pokazuje kako koristiti API za kreiranje i dodavanje jedne jednostavne funkcije FoxPro-u. ELEMENTI C PROGRAMA Xbase jezik je tzv. "weakly typed" jezik. Drugim rečima, u Xbase-u jedna varijabla pri kreiranju može imati jedan tip (npr. datumski), da bi se kasnije u programu konvertovala u drugi (npr. karakter). C je, međutim, "strongly typed" jezik i kod njega je pre-deklaracija promenljivih određivanje njihovog tipa koji je, kasnije, nepromenljiv. Hederi Sve C funkcije se moraju pre-definisati time što se odredi tip njihovog ulaznog i izlaznog parametra. I umesto da vas primorava da stalno iznova pišete pre-definicije ili radite njihov cut/paste u nove programe, C poseduje kompajlersku direktivu #include, koja se može koristiti da bi se "dodali" posebni fajlovi, tzv. hederi, a koji sadrže pomenute pre-definicije. Hederi najčešće imaju ekstenziju .H - LCK ih takođe poseduje; on nudi poseban heder-fajl, PRO_EXT.H, koji sadrži sve potrebne strukture i definicije f-ja neophodne FoxPro-u. Globalne promenljive Kao i kod Fox-a, sve promenljive kreirane u funkciji (dakle, pri njenom pozivanju) bivaju izgubljene posle izlaska iz iste. C predviđa postojanje globalnih struktura i promenljivih, slično PUBLIC promenljivama. Globalne promenljive su deklarisane čim su napisane van funkcije, i važe za sve vreme njenog izvršavanja. Rezultati funkcija Sve C f-je su definisane vrednošću koja se od njih očekuje kao rezultat (izlazni parametar). Najčešće su one tipa int, float, ili char. Još jedan tip f-je, void, ne vraća nikakav rezultat. Sve API f-je koje se pozivaju direktno iz Fox-a moraju biti void tipa. To ne znači da one ne mogu imati i rezultat (logično, jelte) - to samo znači da se ne koristi standardni mehanizam vraćanja rečenog rezultata. LCK nudi posebne f-je za rezultirajuće numerike, stringove i boolean izraze; one daju FoxPro-u posebnu kontrolu nad memorijom i formatiranjem.
baze.podataka.440 max.headroom,
VEZA: C => FOXPRO for WIN (2/4) FOXINFO STRUKTURA FoxInfo je veza između FoxPro-a i rutina pisanih u C-u. FoxInfo struktura sadrži sledeće: ime f-je, onakvo kakvim će biti pozivana iz Fox-a; ime C funkcije; broj parametara i njihov tip. Potreban je jedan podatak u FoxInfo bazi za svaku f-ju koja će biti pozivana iz FoxPro-a. Primer jednostavne C funkcije Najlakši način da se kreira željena API biblioteka rutina, jeste da se baci pogled na konkretan primer. Ono što sledi je kompletan listing jedne C funkcije nazvane ARGUTYPE.C, koja je slična Fox-ovoj f-ji TYPE(), i koja kao rezultat vraća tip podatka zadatog kao ulazni parametar. Razlika je u tome što ARGUTYPE.C rezultat vraća kao kompletan string, a ne kao pojedinačni karakter. /* A R G U T Y P E . C */ #include <stdlib.h> #include <pro_ext.h> char *typesŠ Ć = š "Character", "Date", "Integer", "Float", "General","Logical","Memo","Numeric", "Picture","Reference","Unknown" ć; void far argutype(ParamBlk FAR *parm) š int ix; int tp = parm->pŠ0Ć.val.ev_type; for (ix = 0; ix < 10 && tp != typesŠixĆŠ0Ć; ix++); _RetChar(typesŠixĆ); FoxInfo myFoxInfoŠ Ć = š š"ARGUTYPE", argutype, 1, "?"ć, ć; FoxTable _FoxTable = š (FoxTable FAR *)0, sizeof(myFoxInfo) / sizeof(FoxInfo), myFoxInfo ć; Dakle, napisana funkcija je dugačka samo četiri reda, a poznajući C programere (ne računam sebe, svakako), može biti i kraća. Šta kaže f-ja? Elem, njena prva linija deklariše promenljivu ix, koja je samo brojač. Druga linija definiše promenljivu tp. Da bi se shvatilo kako se promenljiva inicijalizuje, potrebno znati kako API prihvata zadate parametre. Svi parametri koji se prosleđuju API-ju moraju biti posebne strukture nazvane ParamBlk (strukture su u C-u grupa elemenata koja se tretira kao jedna celina. One su nešto kao matrice (arrays) u Fox-u, u kojima svaki elemenat može biti posebnog tipa). Pomoću FoxPro-a parametar se API-ju može proslediti koristeći bilo "call-by-value", bilo "call-by- reference" pristup. Da bi se došlo da parametra, svaki tip zahteva posebnu strukturu. "Call-by-value" biva obrađen preko "Value" (vrednost) strukture, dok "Call-by-reference" (referenca) obrađuje "Locator" struktura. Kada se dve strukture fizički preklope, oni kreiraju uniju (union). Tako, ParamBlk struktura je unija Value i Locator struktura, pa programer mora odlučiti koju "stranu" unije primenjuje. Prvi bajt strukture sadrži tip poziva i govori koja će se "strana" koristiti. "Seciranje" segmenata koda je dobra prilika za dekodiranje C nomenkla- ture: tp = parm->pŠ0Ć.val.ev_type; parm-> Pointer na ParamBlk strukturu pŠ0Ć. Prvi parametar strukture val. Koristi "Value" stranu Parameter strukture ev_type Ovaj element sadrži tip podatka Konkretno, ova rutina koristi "call-by-value". ParamBlk struktura omogućuje prosleđivanje više parametara (tzv. subscript struktura, tj. strukt. sastavljena od elemenata). Elementi se u C-u navode iza uglastih zagrada (ŠĆ), dok matrice uvek počinju elementom 0.
baze.podataka.441 max.headroom,
VEZA: C => FOXPRO for WIN (3/4) Rutina, potom, uzima prvo slovo tipa parametra i poredi ga sa prvim slovom proširene definicije (vidi: types). Ako je poređenje uspelo, kao rezultat se vraća proširena definicija tipa (ond. cela reč). Ako, pak, poređenje nije uspelo, rutina vraća string "Unknown" (nepoznati tip). Funkcija _RetChar() vraća sadržaj matrice - ona očekuje pointer na string koji se završava "null" karakterom, kao svoj jedini argument. Na kraju listinga ARGUTYPE.C nalazi se FoxInfo struktura. Ona definiše svaku novu f-ju koja se dodaje FoxPro-u. Prvi element je ime koje će Fox koristiti da pristupi novoj funkciji. Njeno ime mora biti navedeno pod navodnicima i napisano velikim slovima. Drugi element je ime funkcije u C-u, i ono ne mora biti identično Fox-ovom. Međutim, pošto je C case-sensitive jezik, ime f-je u koje će koristiti C mora biti navedeno pazeći na mala i velika slova. Treći element je broj argumenata koji se prosleđuje (1), a četvrti je pod navodnicima i definiše njihove tipove. Treći i četvrti element omogućavaju FoxPro-u da proveri broj i tip argumenata pre nego što je API i pozvan. Program je smešten u fajl sa ekstenzijom .C i spreman je za kompajliranje. Kao što je ranije napomenuto, ParamBlk struktura je u stvari unija Value i Locator struktura. Prvi elementi iz obe strukture se preklapaju, što se koristi za indikaciju da li je parametar prosleđen po vrednosti ili po referenci. Value struktura ParamBlk strukture se definiše na sledeći način: typedef struct š char ev_type; char ev_padding; short ev_width; unsigned short ev_length; long ev_long; double ev_real; MHANDLE ev_handle; ć Value; Prvi element, ev_type, mora biti jedan od sledećih: C,N,I,D,G,L, ili M. Ako je R, parametar se prosleđuje po referenci i potrebno je koristiti Locator "stranu". Pretpostavljajući da je ev_type jedna od gornjih vrednosti, definicija ostalih elemenata Value strukture zavisi od tipa parametra koji se prosleđuje. Sledeća tabela prikazuje za šta se koristi koje polje za koji tipa parametra: Polja typedef strukture ------------------------------------------------------------------------ Tip elementa Character Numeric Integer Date Logical Memo/Gen ------------------------------------------------------------------------ ev_type 'C' 'N' 'I' 'D' 'L' 'M' ev_width širina širina FCHAN ev_length dužina broj logical stringa decimala ev_long long duž. memo integer polja ev_real double date ofset precision memo polja ev_handle MHANDLE stringa ------------------------------------------------------------------------ Locator struktura se koristi za prosleđivanje argumenata po referenci, kao i za prosleđivanje matrica, memo-polja i "general" polja. Evo njene definicije: typedef struct š char l_type; short l_where; short l_NTI; short l_offset; short l_subs; short l_sub1; short l_sub2; ć Locator; Prvi element, l_type, mora biti "R". Evo i tabele: Locator polja i njihova upotreba ----------------------------------------------------------------------- Locator polje Upotreba polja ----------------------------------------------------------------------- l_type 'R' l_where -1 za promenljivu, ili broj radne oblasti l_NTI Ime indeksa l_offset Broj polja (ako je baza), prvi. el. je 0 l_subs 0 za promenljivu, ili broj elementa matrice l_sub1 Prvi element (ako je matrica) l_sub2 Drugi element (ako je matrica dvodimenzionalna) -----------------------------------------------------------------------
baze.podataka.442 max.headroom,
VEZA: C => FOXPRO for WIN (4/4) KOMPAJLIRANJE Da bi se ARGUTYPE.C iskompajlirao, koristeći Watcom-ov C 9.0 kompajler, zadajemo sledeće parametre: wcc /o1 /of /s /d2 /m1 /fpc argutype Objašnjenje svičeva: /o1 loop optimization /of generate traceable stack frames /s removes stack overflow checks /d2 embed symbolic debugging information /m1 use the large model /fpc use only the floating point library, not the coprocessor Kada je kompajliranje uspelo, kao rezultat dobijamo ARGUTYPE.OBJ fajl. LINKOVANJE Za linkovanje je potreban jedan "front-end" fajl, koji će u kombinaciji sa ARGUTYPE.OBJ rezultovati .EXE datotekom. Da bi linkeru objasnili šta sve treba da uđe u taj .FLL fajl, koristimo .LNK datoteku. Ona (ARGUTYPE.LNK) izgleda ovako: debug all sys windows dll lib clibl lib windows lib proapiwl name ARGUTYPE.exe option symfile = ARGUTYPE.map option heapsize = 5k option map option oneautodata file libentry.obj file ARGUTYPE.obj Sve specifične FoxPro f-je vade se iz PROAPIWL.LIB fajla (stiže zajedno sa LCK-om), dok se opšte C i Windows f-je koje rutina zahteva dobijaju iz WINDOWS.LIB i CLIBL.LIB fajlova (stižu zajedno sa kompajlerom). Ako je linkovanje uspelo, kao rezultat se dobija ARGUTYPE.EXE. Potom je potrebno učiniti sledeće korake da bi Windows 3.1 prepoznao fajl i da bi ga Fox mogao učitati: rc -31 ARGUTYPE.exe copy /b ARGUTYPE.exe+ARGUTYPE.map del ARGUTYPE.fll rename ARGUTYPE.exe ARGUTYPE.fll Prva linija poziva resource kompajler koji markira ARGUTYPE.EXE kao Windows 3.1 executable. Druga linija kombinuje fajl i symb. tabelu u jedan fajl, dok treća briše postojeću kopiju fajla. Poslednja linija samo preimenuje ARGUTYPE.EXE u .FLL, što omogućava Fox-u da ga prepozna kao biblioteku. Sve ovo utrpajte u neki .BAT fajl (dajte da se automatizujemo), odn. koristite Watcom-ov MAKE. DODAVANJE NOVE FUNKCIJE FOXPRO-U Pošto je .FLL kreiran, iz Fox-a ga jednostavno uzmite kao eksternu biblioteku sa SET LIBRARY TO argutype. LIST STATUS ili DISPLAY STATUS daju sledeće rezultate: API library Instance Handle c:ĐfoxproĐwinapiĐargutype.fll 0031B994 Function Address ARGUTYPE 08D7:0130 Da bi se novokreirana f-ja testirala, dovoljno je zadati: ? argutype(DATE()) što bi trebalo da rezultuje ispisom stringa "Date". Probajte i ostale tipove. Ako posedujete više biblioteka, koristite ih sve odjednom upotrebom: SET LIBRARY TO lib1, lib2, itd... (za korišćenje neke dodatne biblioteke upotrebite ADDITIVE opciju). Ako vam neka od biblioteka više ne treba, zadajte: RELEASE LIBRARY lib1.
baze.podataka.443 djelovic, -> #422, dpredovic
> VEZA: C => FOXPRO for WIN (4/4) Hvala na veoma zanimljivom primeru!
baze.podataka.444 jasicp,
Postoji li grupa za Paradox Engine ? Ako ne postoji, neka interesenti posalju mail.
baze.podataka.445 spantic,
Sećate se Maxovog obećanja da će sve svoje zanimljive poruke o Fox-u da sredi u fajl? ;) Dok on to ne uradi evo svih poruka tematske prirode zaključno sa korišćenjem C-a. -> Max: Moja škola FOX-a max.zip
baze.podataka.446 ndragan, -> #421, dpredovic
/ I nema šansone da ga isključim u browsu? Browse nowait save nowait znači da ne čeka da se on šeta kroz brauz, nego program nacrta brauz i trči dalje. Problem je što tekući slog nije druge boje. Save znači da ostavi sliku na ekranu iako je brauz izašao.
baze.podataka.447 ndragan, -> #418, gaston
/ P.S. Naravno, to ne oslobadja ndragan-a da ispuni preuzetu obavezu i / posalje celokupnu strukturu FOX DBF i ostalih fajlova ... B) Toga ima kol'ko nećeš, a i to čudo što smo sad kopali uopšte nije dokumentovano (16-31. bajt zaglavlja, piše Reserved). Mogao bih možda da fotoklompiram (tamo) par strana pa da pošaljem nekome faks odavde (knjige su mi u Mađarskoj, a tamo imam druga posla, i stvarno nemam kad da prekucavam sitan štep iz Razvijačkih Gajdi /Developers' Guide/). Ima i struktura za Cdx, Scx, Pjx, Frx, Lbx...
baze.podataka.448 ndragan, -> #424, goxx
/ Prevashodno nisam mislio na to da li postoji indeksni fajl ili ne već, / ako postoji kako se on zove jer nam je jedino ta informacija Piše samo ima/nema, a ako ima, zove se isto kao i baza. Toliko može da stane u ono slobodnog mesta u zaglavlju, inače - gde bi nas odvelo kada bi ime svakog indeksa trpali u zaglavlje. Prvo, bilo bi glomazno - pod FoxproX možeš da imaš do 255 indeksa na jednu bazu. Drugo, beleženje informacija o privremenim indeksima je ne suvišno, nego bi stvaralo dodatne glavobolje. Zato je i dovoljan onaj jedan bajt.
baze.podataka.449 max.headroom,
Još malo o FoxPro-u. Ponosne vlasnike paketa ovo što sledi ne bi trebalo previše da tangira, jer je tekst napisan sa ciljem da one, koji još nemaju Fox, uputi u mogućnosti primene Windows verzije. Sve što sledi uzeto je iz ĐFOXPROWĐGOODIESĐFOXTOOLS direktorijuma. Kako korisiti Windows API, i sve što on nudi? Kako koristiti moćne funkcije biblioteka koje upravljaju Windows-om? Na ova pitanja Microsoft ne nudi direktan odgovor (bar ga u FoxPro help-u nema), ali se pozivaju na određene reference (knjige, source-ove), i lično priznaju da pravih "mahera" na ovom polju ima malo, te da pomenuti nisu bliski ideji da svoja znanja šire dalje. Zato i postoji premalo primera, ali se nadam da su dovoljni da pokažu gotovo neiscrpne mogućnosti koje ovakav pristup nudi. *-------------------- dialer.prg ------------------------ * Jednostavan programčić koji šalje podatke na COM port, a koristi * FOXTOOLS.FLL biblioteku za generički DLL pristup. FOXTOOLS bibl. nudi * dve izuzetno korisne f-je: RegFn() i CallFn(). Kao što se iz primera * da videti, RegFn() (registrovanje f-je) vraća integer vrednost kao * pointer na Windows API funkciju, a koja se poziva preko f-je CallFn() * sa odgovarajućim brojem parametara (prvi param. je obavezno pointer). * * Dakle, prvo u razmatranje uzmemo biblioteku FOXTOOLS.FLL... SET LIBRARY TO SYS(2004)+"foxtools.fll" ADDITIVE * Potom u promenljive OPENCOMM (ptr. na f-ju koja "otvara" serijski * port). WRITECOMM (ptr. na f-ju koja piše na serijski port), i * CLOSECOMM (ptr. na f-ju koja "zatvara" COM-port) Fox smešta potrebne * vrednosti... Funkcija REGFN() ima sledeće parametre (sve Char tipa): * * REGFN(ImeFunkcije, TipoviArgumenata, TipRezultata, ImeDLL) * * Ako je f-ja registrovana, rezultat je referenca na f-ju (pointer), a * ako nije ispisuje se message-box i REGFN() vraća -1. * * Tipovi argumenata su: * I - Integer * L - Long * C - Character string * F - Floating point number * D - Double precision number opencomm = REGFN("OpenComm", "CII", "I") writecomm = REGFN("WriteComm", "ICI", "I") closecomm = REGFN("CloseComm", "I", "I") * Otvaranje COM-porta zahteva i nešto preciziranja (COM1 promenljiva), * dok se u promenljivu S smešta string koji će na serijski izlaz biti * odaslat... com1 = CALLFN(opencomm, "COM1:", 100, 100) s = "ATDP 648422" + CHR(13) * Pisanje na COM1: (u pitanju je promenljiva S, tj. "ATDP 648422")... =CALLFN(writecomm, com1, s, LEN(s)) * Posle pritiska na bilo koji taster modem ide off-line... WAIT WINDOW "Pritisni bilo koji taster za hang-up" s = "ATH0" + CHR(13) =CALLFN(writecomm, com1, s, LEN(s)) * COM-port se zatvara... =CALLFN(closecomm, com1) * Kao i biblioteka koja nam više neće trebati... RELEASE LIBRARY SYS(2004)+"foxtools.fll" * EOF dialer.prg *--------------------------------------------------
baze.podataka.450 ndragan, -> #436, max.headroom
/ prvo DEFINE, potom crtkaš, pa tek na kraju ACTIVATE? Dobiješ utisak da / ga odmah "baci" na ekran :) Save window trtmrt to memo mrttrt... a posle sam restore i getovi - ostatak crteža se pojavljuje kao puf iz oblačka.
baze.podataka.451 ndragan, -> #438, peca.st
/ vodu. Recimo, trenutno sam u "pohodu" za 'Incremental / Search' rutinom. Ako je to ono na šta ja mislim, napisao sam to još za 1.02 i sad sam već negde na verziji 4.92, al' nije šarevare (moram i ja od nečeg da živim). Mogao bih eventualno da bačim ovamo par principa kako bi to moglo da se napravi, pa se dalje snalazite sami. BTNJ, jel' zna neko neki trik da tekući slog ostane ofarban kad se da Browse NoWait? Jednostavno mu se ofarba bojom za ostale slogove čim to više nije aktivan prozor (a nowait upravo to uradi - deaktivira prozor).
baze.podataka.452 ndragan, -> #439, max.headroom
/ VEZA: C => FOXPRO for WIN (1/4) Štos za DOS verziju je da se prave .PLB umesto .FLL bibliotetaka, inače je mehanizam isti i strukture parametarskih blokova bi trebalo da su iste. Jedino se, valjda, format dobijene bibliotetke razlikuje, a C sors treba da može da je isti. Nisam se nešto udubljivao u to - i ja sam isto C-read-only debil. Svejedno, preporučujem da se koristi FPATH.PLB odnosno FoxTools.fll - ima zgodnih stvari koje dosta skraćuju posao (mada bi ista stvar mogla da se izvede i iz samog foksa, ovako radi brže a i ima manje da se piše). Funkcije koje redovno koristim: JustStem(fname) - daje samo ime fajla (bez nastavka) JustExt(fname) - obratno JustFname(fname) - celo ime fajla bez staze JustPath(fname) - samo staza bez imena fajla AddBs(dirname) - ime direktorija sa forsiranim bekslešom na kraju ForceExt(fname,ext) - onaj fajl samo sa novom ekstenzijom DefaultExt(fname, ext) - onaj fajl samo sa novom ekstenzijom ako je već nema Words(string,/graničnik/) broj reči u stringu. difolt graničnik je chr(32), al može i bilo koji drugi string WordNum(string, rbr, /graničnik/) - iz stringa vadi reč broj rbr (graničnik kao malopre). Ne broje se prazne reči, tj kad između dva graničnika nema ničega to ne računa kao reč. Strfilter(string,filter) - iz stringa izbacuje sve znakove koji se ne sadrže u stringu filter. Tako recimo sa StrFilter("lk jlkjou 4oi3214","0123456789") izbacujem sve što nisu cifre i dobijam "43214".
baze.podataka.453 max.headroom, -> #445, spantic
> Sećate se Maxovog obećanja da će sve svoje zanimljive > poruke o Fox-u da sredi u fajl? ;) Jao :), u pravu si. Nezgoda je u tome što, kada završim jedan deo, nemam srca a da ga odmah ne spustim na Sezam (sve mislim - nekome će zatrebati, a zašto bi čovek čekao sledeću godinu da pročita zanimljivost). A još je veća nezgoda što će Microsoft izbaciti neki sledeći Fox :) pa će napisano, dotle, izgubiti na vrednosti. Ma i ovako imamo (uslovno rečeno) sve na jednom mestu, pa ako se ipak ispostavi da previše tekstualnih poruka nekome smeta - pakovaću tekst u fajlove.
baze.podataka.454 max.headroom, -> #450, ndragan
> Save window trtmrt to memo mrttrt... a posle sam restore i > getovi - ostatak crteža se pojavljuje kao puf iz oblačka. Vidiš, zanimljivo :) Probaću obe varijante (486/66) pa ću ostaviti brojčani utisak.
baze.podataka.455 max.headroom, -> #452, ndragan
> Svejedno, preporučujem da se koristi FPATH.PLB odnosno > FoxTools.fll - Manimo se toga, pogledaj moju poruku pod 11.449 i - plačimo :) Znam, niko od C-developera za Windows-e neće da kaže ništa konstruktivno... a jedino oni imaju brda literature neophodne za neke interesantne zahvate.
baze.podataka.456 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 1. (Inkrementirano pretraživanje) (Upotreba Windows .DLL biblioteka) Kao što sam ranije napomenuo, API može poslužiti da bi se poboljšale performanse FoxPro rutina. Ali, pre svega, treba objasniti nešto i o samoj mehanici Fox-a: Prvo, to je hibrid između kompajliranih (compiled) i interpretiranih (interpreted) jezika. Kod, koji se prvobitno u njega unese (.PRG) mora prvo biti kompajliran u .FXP oblik. .FXP oblik programa je vrlo kompa- ktni set instrukcija nazvan "p-code"; FoxPro učitava i interpretira svaku (odn. onu do koje je izvođenje došlo) liniju takvog koda. Između dva izvođenja linija koda, Fox proverava i razna druga zbivanja ("events", što bi se narodski reklo), kao što su kliktanje miša i pritisak na neki od tastera. Glavna kontrolna petlja koja kontroliše izvođenje programa i eksterna zbivanja (events) naziva se "event loop", dok deo programa koji učitava i izvršava source nosi naziv "inner loop interpreter". Koristeći API, moguće je uneti vlastite procese u pomenutu Fox-ovu "event loop". Takvi procesi najčešće vrše skeniranje nekog od tastera, praćenje klika tastera miša, kontrolu serijskog porta, kao i razne druge lepote. Moguće je navesti Fox da pokreće vaš proces pri svakoj iteraciji "inner loop interpreter"-a, ili ga navesti da proces startuje samo za vreme "idle time" perioda - tj. za vreme kada Fox očekuje neki unos sa tastature. Tekst koji sledi je detaljnija razrada navedenog... DODAVANJE PROCESA U "EVENT LOOP" Fox-ov Browser je vrlo moćno oružje - on može poslužiti i kao tabela za unos podataka, i kao alat za prikazivanje istih. Ako je baza velika, humano je korisniku obezbediti metod (ako zanemarimo zamorni PageDn) kojim će stizati do željenog zapisa. Najjednostavnija metoda je programirati 26 ON KEY LABEL tastera koji će čekati da korisnik pritisne jednog od njih i skočiti na zapis koji počinje željenim slovom. Metoda je OK, ali je delimično neprecizna. Bolje rešenje je takozvano inkrementirano pretraživanje, što podrazu- meva sledeći sistem: što se unese više slova, pointer na traženi zapis je sve bliže cilju (eno ga živi primer u NCD-u). Šta bi bilo zanimljivo za razmatranje? Pa, možda da se jednostavno omogući nekoliko GET polja za slova, poređana jedno do drugog - pa svako GET polje poseduje odgovarajuću VALID funkciju koja vrši SEEK. Kursore je moguće naštelovati (ON KEY LABEL) tako da, ako je korisnik blizu traženog polja, oni dobijaju svoju prvobitnu funkciju u Browse- ru, da bi mogla da se uradi brža korekcija položaja u bazi. Pošto je moguće koristiti i miša, dovoljno je pritisnuti Enter ili desni klik i pretraga se obustavlja, a Browse se gasi. Sledeća mogućnost je upotrebiti INKEY() f-ju da bi se "hvatale" vre- dnosti pritisnutih tastera, što radi brže od pomenute GET metode. Jedini je problem što se preko INKEY() ne može registrovati desni klik, ali je moguće napisati API rutinu koja proverava status miša i vraća logičku vrednost. Medžutim ;) tuj stajem sa razmatranjima i šaljem biblioteku L3INCR.FLL koja koristi API da bi dodala novi proces u "event loop" za vreme Browse-a. Dakle, vidi se normalni Browse, ali se skeniraju tasteri od A do Z i od 0 do 9, vrši se SEEK i radi se radnja. Da bi se skeniralo desno dugme miša, koristi se f-ja RMDOWN(). Evo, u neku ruku skraćene verzije L3INCR.FLL l3srch.fll
baze.podataka.457 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 2. /* L3INCR.C Rutinice: skeyinit - start skeniranja tastera i SEEK-a skeykill - zaustavljanje skeniranja */ #include <dos.h> #include <pro_ext.h> /* Globalne promenljive */ int skeyid; Value val; MHANDLE mh; char *cp; Point pt; WHANDLE wh; /* Predefinicija funkcija */ void dbback(); void dbseek(char); FAR SKHandler (WHandle, EventRec FAR *); /* Inicijalizacija rutine */ void FAR skeyinit(ParamBlk FAR *parm) š wh = _WOnTop(); /* Pointer na prozor na vrhu */ mh = _AllocHand(100); /* Rezerviši nešto memorije */ _HLock(mh); /* Zaključaj rezervisanu memoriju */ val.ev_type = 'C'; /* Definisanje stringa koji se traži */ val.ev_length = 0; /* ...i to kao string dužine 0 */ val.ev_handle = mh; /* Pointer na memoriju */ cp = _HandToPtr(mh); /* Određivanje stvarnog pointera */ /* Sada kačimo naš novi "event-nadler" */ skeyid = _ActivateHandler(SKHandler); ć /* Rutina koja završava sa pretraživanjem */ void FAR skeykill(ParamBlk FAR *parm) š _HUnlock(mh); /* Otključaj... */ _FreeHand(mh); /* ...i oslobodi memoriju */ /* Uklanjanje "event-handler"-a */ _DeActivateHandler(skeyid); ć /* Evo i pravog "event-handler"-a... */ /* ...a koji, trenutno, prati samo pritisak na određene tastere */ FAR SKHandler(WHandle SWin, EventRec FAR *ev) š /* Ako je rezultat YES, FoxPro će znati da je došlo do pritiska... */ /* ...ili, ako je NO, treba obraditi tekući event */ int retval = NO; if (ev->what == keyDownEvent ) š /* Proveri da li je to jedan od "legalnih" karaktera; velika slova */ if ((ev->message >= ' ' && ev->message < 'a') đđ (ev->message > 'z' && ev->message <= 0x7E)) š dbseek(ev->message); retval = YES; ć else š /* Proveri jesu li mala slova */ if (ev->message >= 'a' && ev->message <= 'z')) š dbseek(ev->message & 0xDF); /* Konvertuj u velika slova */ retval = YES; ć else š /* Takođe, izvrši proveru BS-a */ if (ev->message == 'Đb') š dbback(); retval = YES; ć ć ć ć return retval; ć /* Ova rutina sastavlja SEEK string konkatenacijom i vrši ispis */ /* istog u prozoru na vrhu. */ void dbseek(char chr) š val.ev_length += 1; cpŠval.ev_length-1Ć = chr; /* Dodaj karakter stringu */ _DBSeek(&val); pt.h = val.ev_length; pt.v = 0; _WPosCursor(wh,pt); /* Pozicija kursora u prozoru */ _WPutChr(wh,chr); /* Ispis karaktera u prozoru */ ć /* Sledeća rutina briše, ako je potrebno, 1 karakter skraćujući */ /* SEEK string i ponovno aktivirajući pretragu. */ void dbback() š if (val.ev_length > 0) š pt.h = val.ev_length; pt.v = 0; _WPutCursor(wh,pt); _WPutChr(wh,' '); /* Briše poslednji uneti karakter*/ val.ev_length -= 1; _DBSeek(&val); /* Ponovni SEEK stringa */ ć else /* Nema karaktera za brisanje... */ _PutChr(7); /* ...pa zvrcni jedared */ ć FoxInfo myFoxInfoŠ Ć = š š"SKEYINIT", skeyinit, 0, ""ć, š"SKEYKILL", skeykill, 0, ""ć, ć; FoxTable _FoxTable = š (FoxTable FAR *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo ć;
baze.podataka.458 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 3. Da bi se ovaj program koristio, potrebno je definisati i aktivirati prozor u kome će se ispisivati sve što se unosi sa tastature. Tada se poziva SKEYINIT() koji uključuje detektor, a potom se aktivira normalni BROWSE. Posle korištenja nije na odmet :) rutinu isključiti pomoću SKEYKILL(). Primer: č 23,1 SAY PADC(" Pritisni <ENTER> za izbor",80) COLOR GB+/B SET LIBRARY TO l3incr && Kačenje API rutine USE laser ORDER utitle && Pažnja: tag je UPPER(title) DEFINE WINDOW test FROM 4,15 TO 6,60 ; SYSTEM TITLE "Pretraživanje po naslovu" ACTIVATE WINDOW test =skeyinit() && Inicijalizacija detekcije DEFINE WINDOW brow FROM 6,15 TO 20,60 SYSTEM ON KEY LABEL ENTER KEYBOARD CHR(23) ON KEY LABEL RIGHTMOUSE KEYBOARD CHR(23) BROWSE FIELDS title:42 WINDOW brow ON KEY STORE LASTKEY TO lk =skeykill() && Isključivanje detekcije RELEASE WINDOW test CLEAR IF lk = 27 RETURN "Pritisnut ESCAPE" ELSE RETURN title ENDIF *---------------------------------------------- PETLJE KOJE PODRAZUMEVAJU "čEŠĆA" IZRAžUNAVANJA Kao što je prethodno napomenuto, FoxPro koristi "inner loop interpre- ter" za čitanje i izvršavanje koda. Zbog toga, nezavisno od instrukci- je, svaka izvršna komanda poseduje određeno "zaglavlje" - to podrazumeva i konstrukcije petlji tipa SCAN/ENDSCAN i FOR/ENDFOR. Takvo "zaglavlje" postaje izuzetno važno kod petlji koje zahtevaju česta matematička izračunavanja. Sa druge strane, "zaglavlja" konstrukcija petlji u C-u su najčešće zanemarljive kompleksnosti, pa su rutine koje pretpostavlja FoxPro česti kandidati kod C-a. U većini slučajeva API rutina se izvršava znatno brže (često - znatno ZNATNO brže) od njenog ekvivalenta u Fox-u. Da bi se ovo demonstriralo, sledeći program je napisan u FoxPro-u i izračunata mu je brzina, a potom je napisana u C-u i, koristeći API, ponovo izvršena pod Fox-om. Program, nazvan KAMATA.PRG, izračunava totalnu akumuliranu kamatu za 1000 DIN uplaćenih na račun banke koja dnevno isplaćuje kamatu u vrednosti od 10% od uplaćene sume, oročene na 100 godina. Evo FoxPro koda: rezultat = 1000 && Početni bilans dnrata = (10/100) / 365 && Dnevna kamata FOR godina = 1 TO 100 FOR dan = 1 TO 365 rezultat = rezultat + dnrata * rezultat && Dodaj kamatu ENDFOR ENDFOR Program je pokrenut i brzina mu je izmerena na 486/33 mašini sa podo- sta RAM-a. Izvršen je za 2.13 sekundi. Zatim je unutrašnja petlja napisana u C-u i pozvana 100 puta. To izvršenje je trajalo 0.309 sekundi, pa je povećanje faktora brzine iznosilo 6.89. Zatim je i spoljnja petlja napisana u C-u, pa se čitava API rutina pozivala samo jednom. To je trajalo čitave 0.283 sekunde, što je donelo povećanje brzine od 7.53. To bi značilo uštedu od skoro 52 minute računanja koje bi, normalno, trajalo sat vremena! Međutim, postoji i sistem u kome API usporava rad, jer sam poziv API rutine pretpostavlja čitanje određenog "zaglavlja", jer je FoxPro 32-bitni, extended mode program, dok se API rutine izvršavaju u 16-bitnom ili standardnom modu. Tako, svaki poziv API-ja natera procesor da pređe iz protected moda u standardni režim, i nazad. Da bih ovo ilustrovao, uzeo sam samo onu unutrašnju komandu petlje ("Dodaj kamatu") koja preračunava dnevnu kamatu, napisao je u C-u, i pozvao 36500 puta. To je trajalo 9.199 sekundi, što je sporije od FoxPro-ovog koda za faktor od 4.3 Evo i tabele:
baze.podataka.459 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 4. Pozivi API-ju ----------------------------------------------------- Tip Puta Izmereno Faktor poziva pozvan vreme ----------------------------------------------------- FoxPro ***** 2.130 1.00 Dnevna kamata 36500 9.199 0.23 Kamata za jednu godinu 100 0.309 6.89 Kamata za 100 godina 1 0.283 7.53 ----------------------------------------------------- Dakle, rešenje za osveženje: koristite API f-ju što je ređe moguće, a u nju strpajte koda što je više u vašoj moći. Nemo' da vas mrzi da pravite uporedne benchmark testove. PRISTUPANJE MATEMATIžKOM KOPROCESORU Da ste probali dati primer (KAMATA.PRG) na vašoj mašini, pogotovo ako je to 386-ica, dobili bi ste čak i bolje rezultate. Kompjuter koji je uradio prikazana izračunavanja, 486-ica, poseduje DX procesor sa ugrađenim numeričkim koprocesorom. FoxPro pristupa numeričkom koproce- soru (kao što to čini i Windows), što mu daje kosmičku brzinu. Ako koristite /fpc svič u WCC komandnoj liniji, sve API rutine neće koristiti matematički koprocesor već pre 80387 softverski emulator. Dakle, korištenjem /fp87 ili /fp387 sviča, preusmeravate rutine za izračunavanje direktno na koprocesor. Paz'te sad: pomenuta rutina je re-kompajlirana sa /fpi387 svičem i potom testirana. Rezultat je neverovatan: vreme izvršavanja je 0.36 sekundi, što daje faktor ubrzanja od 59.17. Iako postoje određene varijabilnosti zbog Windows multitaskinga, faktor ubrzanja se uvek kretao zdravo preko 50. Predlog: ako vaša mašina poseduje numerički koprocesor, a želite da postignete slične rezultate, morate obratiti pažnju na dve začkoljice. Prvo, iako možete mešano koristiti rutine kompajlirane sa /fpc svičem (samo emulator) ili /fpi87 odn. /fpi387 (samo koprocesor), ne možete koristiti /fpi svič. /fpi svič omogućava kodu da odluči, u momentu izvršavanja, koju biblioteku da koristi, i nije kompatibilan sa API-jem. Ako je potrebno da napišete rutinu koja će raditi čas ovako, čas onako, najbolje je da je iskompalirate u dve verzije: jednom sa /fpc, a drugi put sa /fpi87, odn. /fpi387 svičem. Koristite _bios_equiplist() da odredite (ne)postojanje matematičkog koprocesora i, shodno tome, pustite prvu ili drugu verziju u pogon. Druga začkoljica se tiče rezultata dobijenih od koprocesora. Ako ga koristite, nemojte upotrebljavati _RetFloat() f-ju da bi vratili rezultate. Ona ne interpretira izlaz iz koprocesora korektno, pa umesto nje koristite _RetVal(). _RetVal() radi potrebna preračunavanja i time vam vraća ispravan rezultat. ADAPTACIJA POSTOJEĆIH DOS PROGRAMA Adaptacija već postojećeg DOS ili Windows programa, da radi u Fox-u, može biti ili izuzetno jednostavna, ili grozomorno komplikovana za izvesti. Kroz primer ću prikazati jedan jednostavan program koji radi OK preko RUN komande iz DOS-a i WIndows-a, dok sada želimo da mu pristupamo direktno iz FoxPro-a. Zašto, uopšte, praviti izmene? Prvo, nije moguće koristiti standardne funkcije za alociranje memorije (npr. malloc()) da bi se sačuvao memorijski blok. Drugo, FoxPro kontroliše svoj vlastiti I/O. Smatra se gotovo nepristojnim pisanje direktno na konzolu, ili pozivanje "tamo nekih" low-level I/O funkcija tipa fopen() ili fwrite() za manipulaci- ju fajlovima. Treće, što su FoxPro-ove mogućnosti debagovanja više ograničene, to će program manje raditi pod našim budnim okom.
baze.podataka.460 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 5. Ali, nijedan od pomenutih faktora ne bi trebao da predstavlja pretera- nu brigu. Određene f-je nisu dozvoljene kao API rutine. U svakom slučaju, kada god FoxPro "ukrade" f-ju, postoji odgovarajuća zamena. U najvećem broju slučajeva, konvertovanje postojećih C-programa i njiho- vo startovanje pod Fox-om je, jednostavno, stvar pozivanja druge funkcije. U najgorem slučaju, ova konverzija se svodi na dodavanje jedne ili dve linije dodatnog koda... Pa da ispitamo primer jedne funkcije koja je napisana pod DOS-om, tj. da objasnim postupak njenog uvođenja u FoxPro. To će biti WFCOUNT.C, za jedno sa WENGINE.C: /* WFCOUNT.C Funkcija: wcount - vraća broj reči u fajlu */ #include <stdlib.h> #include <dos.h> #include <pro_ext.h> /* FUNKCIJA WCOUNT Poziva se iz FoxPro-a kao: WCOUNT(filevar) filevar može biti konstanta ili karakter var. Vraća: integer - broj reči u fajlu -1 - što znači "File Not Found" -2 - što znači "Insufficient Memory" */ void far wcount(ParamBlk FAR *parm) š /* Definisanje promenljivih */ FCHAN fh; /* Ptr. na fajl (int), tj. "file handle") */ MHANDLE bmh; char far *buff,fnameŠ40Ć; int retval,filen; struct find_t finfo; /* Naziv fajla */ filen = parm->pŠ0Ć.val.ev_lenght; _MemMove(fname,_HandToPtr(parm->pŠ0Ć.val.ev_handle),filen); fnameŠfilenĆ = 0; /* Dodaj null-terminator */ /* Uzmi veličinu fajla */ _dos_findfirst(fname, _A_NORMAL,&finfo); /* Vidi da li fajl postoji */ fh = _FOpen(fname, FO_READONLY); if (fh < 1) š /* Nedozvoljeni naziv fajla */ retval = -1; /* Kaži: "ne mogu ga naći" */ ć else š /* Naziv fajla je OK */ /* Kreiranje bafera */ bmh = _AllocHand(finfo.size); buff = (char far *)_HandToPtr(bmh); if (bmh < 1) retval = -2; /* Nemaš, ba, memorije */ else š /* Popuni bafer fajlom */ _FRead(fh,buff,finfo.size); /* Pozovi "WENGINE" */ retval = nowords(buff,finfo.size-1); /* Vrati sve na svoje mesto */ _FreeHand(bmh); _FClose(fh); ć ć /* Kaži čoveku šta je tražio */ _RetInt(retval,10); ć #include "wengine.c" FoxInfo myFoxInfoŠ Ć = š š"WCOUNT", wcount, 1, "C"ć ć; FoxTable _FoxTable = š (FoxTable FAR *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo ć; /* WENGINE.C Ima dva stanja: inword i !inword. Ono što će uraditi sa narednim karakterom zavisi od ovog stanja. Ako je inword, i sledeći karakter je delimiter, wc se inkrementi- ra, i inword se invertira. Ako je !inword, i sledeći karakter nije delimiter, inword se invertira. */ extern int nowords(char far *bf,long sz) š int inword,ix,wc; wc = 0; inword = !delim(bfŠ0Ć) /* Inicijalizuj stanje */ for (ix=0; ix < szl ix++) š if (inword) š if (delim(bfŠixĆ)) š wc = wc + 1; /* Inkrementiraj brojač reči */ inword = 0; /* Invertiraj inword */ ć ć else š /* !inword if (!delim(bfŠixĆ)) inword = 1; /* Invertiraj inword */ ć ć /* endfor */ if (inword != 0 && sz != 0) wc = wc + 1; return wc; ć /* Šta mu dođe delimiter... */ extern int delim(char ch) š return ((ch == ' ') đđ (ch == '.') đđ (ch == ',') đđ (ch == ';') đđ (ch == '-') đđ (ch == '?') đđ (ch == ':') đđ (ch == 13 ) đđ (ch == 10 ) đđ (ch == '!')); ć *---------------------------------------------------
baze.podataka.461 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 6. Ovaj primer, tj. brojač reči prvobitno napisan za DOS, podeljen je u dva dela. Prvi deo, koji učitava fajl u memoriju, poziva brojač reči (WENGINE) koji vraća rezultat na konzolu. Pomenuti WENGINE radi i pod DOS-om i pod FoxPro-om. To je nešto kao šablon za pisanje programa koji će raditi pod API-jem, iako se ova tehnika ne primenjuje ako su u problematiku umešane baze ili "event-loop" procesi. Da malo proanali- ziramo program. "DEFINISANJE PROMENLJIVIH" Kao i većina C-programa napisanih za DOS, brojač reči počinje proce- durom main: int main(int argc,char *argvŠ Ć) š FILE *fp; /* Pointer na fajl (struktura) */ Promenljiva argc sadrži broj argumenata, a argv je lista pointera na argumente. Tipično, argvŠ0Ć je pointer na ime programa, a argvŠ1Ć je pointer na prvi argument - u ovom slučaju, na fajl koji nas interesuje. Unutar API-ja, mi pozivamo naše funkcije direktno, koristeći FoxInfo strukturu. Međutim, u FoxPro verziji ovog programa moramo koristiti ParamBlk strukturu da prosledimo naziv fajla u kome će reči biti prebrojane. Kod koji sledi prikazuje kako koristiti ParamBlk strukturu da bi se argument konvertovao u standardni, tzv. "null-terminated" string: void far wcount(ParamBlk FAR *parm) š char fnameŠ40Ć; int filen; filen = parm->pŠ0Ć.val.ev_length; _MemMove(fname,_HandToPtr(parm->pŠ0Ć.val.ev_handle),filen); fnameŠfilenĆ = 0; /* Dodaj null-terminator */ Uočite da ParamBlk struktura NE sadrži string, već samo mem. pointer (u stvari indeks na tabelu sa pointerima). Kao rezultat, potrebne su nam i _HandToPtr() i _MemMove() funkcije da bi konvertovali argument u null-terminated string. Funkcija _HandToPtr() (Handle To Pointer) konvertuje "handle" ('ebem li ga, dođe mi da kažem pointer, a reći ću referenca) u pointer. Funkcija _MemMove() se koristi da bi se iskopirao broj bajtova određen u ev_length elementu u vname promenljivu. FoxPro ne garantuje da će stringovi biti null-terminated (tj. da se završavaju null-bajtom), pa tako moramo da uradimo eksplicitnu null-terminaciju fname stringa. Preporučljivo je (iz zdravstvenih razloga) koristiti _MemMove(), StrCpy() i slične funkcije umesto njihovih DOS ekvivalenata. Te API rutine omogućavaju bolju kontrolu nad memorijom i sređuju još neke "sitne" gadosti. Ako neke vaše rutine koriste pomenute f-je, jednosta- vno ubacite sledeće #define-e na početak vašeg DOS programa, edabi smanjili broj daljih izmena: #define _MemMove memmove #define _MemCmp memcmp #define _MemFill memfill #define _StrCpy strcpy #define _StrCmp strcmp #define _StrLen strlen "LOW-LEVEL I/O PRISTUP FAJLOVIMA" Da bi otvorili fajl u programu napisanom za DOS, definišete pointer na fajl i zatim koristite fopen() da bi mu pristupili. Na primer: FILE *fp /* Pointer na fajl (struktura) */ fp = fopen(argvŠ1Ć, "r"); U API rutini koriste se kanali (FCHAN), koji su ekvivalenti "file handle"-ima, a potom se koristi f-ja _FOpen(). To izgleda ovako: FCHAN fh; /* File Handle (int) */ fh = _FOpen(fname,FO_READONLY) Za svaku low-level I/O rutinu, kao što je fread() ili fwrite(), postoje API ekvivalenti koje bi trebalo koristiti. Može se koristiti i serija #define-a da bi se izvela translacija funkcija za low-level I/O rutine. Funkcije _FOpen() i _FWrite() su identične onima koje se nalaze u samom Fox-u, te, u suštini, file handle brojevi koji se kori- ste pod FoxPro-om su kompatibilni sa onima koje koristi API.
baze.podataka.462 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 7. "MEMORIJA" Kao što je ranije napomenuto, ne možete koristiti malloc() da bi reze- rvisali memorijski blok. Umesto toga, koristite sledeći sistem za kreiranje pointera na blok: MHANDLE bmh; char far *buff; bmh = _AllocHand(finfo.size); buff = (char far *)_HandToPtr(bmh); Ako navedeno može garantovati zahtevanu količinu bajtova, _AllocHand() funkcija vraća mem. handle, što je u stvari int. pointer na tabelu. _HandToPtr() funkcija konvertuje mem. handle u pointer. Bitno je zapaziti da FoxPro može da reorganizuje memoriju između dva API poziva, pa je zato potrebno uvek nanovo izdvajati pointer pri svakom takvom pozivu, ili koristiti _HLock() funkciju koja zaključava blok memorije. Kada se završi njegova obrada, upotrebite _FreeHand() f-ju (zajedno sa _HUnlock(), ako je potrebno) da ne bi došlo do "iznenadnog" nestanka preko potrebne memorije. "POZIVANJE WENGINE" Ako su stvari prošle dobro, tj. ako nije nešto palo, puklo, iskočilo gde ne treba, etc, etc, etc, može se pozvati deo programa koji broji reči, i koji je isti i za DOS i za FoxPro. Priznajem, to će raditi samo pod optimalnim uslovima (optimalno: čitaj - zvezde se namestile baš onako kako programer zahteva). Navedeni brojač reči podrazumeva da se fajl, nad kojim se vrši pretraživanje, uvek može držati u memoriji. Ako to ne upali, morate ispitati ulazni stream korištenjem low-level I/O fajl pristupa. U tom slučaju, #define tehnika i dalje može pratiti kod. Poenta je u tome što radimo isključivo testiranje pod DOS-om, gde su nam pri ruci daleko bolji alati za debagovanje nego oni ponuđeni u Fox-u. Možda bi pomogla upotreba f-je _BreakPoint() koja se kači na INT3, i potom manuelno menjanje segmenta i ofseta simbol-tabele iz debagera... Ovde, očigledno, nema tate. "REZULTUJUĆE VREDNOSTI" Veliki broj DOS programa koristi funkcije kao što su printf() da pošalje rezultat(e) na konzolu. Pod FoxPro-om, potrebno je sumirati rezultate u brojeve, stringove, ili kodove, pa ih potom vratiti u Fox koristeću jednu od _RetXXXX() funkcija. Fox ekskluzivno obrađuje ekran i pojma nema šta je gde ispisano. Ako je potrebno vratiti više vredno- sti, jedina tehnika koju bi vredelo primeniti je da se pošalje matrica koristeći call-by-reference pristup, pa da se unesu rezultati upo- trebom _Store() f-je. Ako je rezultat potrebno poslati na ekran, najbolje je koristiti f-je poput _PutChr() i _PutStr(), da bi se štampalo u trenutno aktivni prozor ili na ekran. Takođe, API sadrži sve funkcije neophodne da bi se kreirali, birali, održavali i zatvarali prozori. Imate kompletnu kontrolu nad njihovom veličinom i izgledom. DAKLE... Koristeći FoxPro API, imate odrešene ruke (a šta s njima, pitate se) :) Sa relativno jednostavnim dodacima možete kreirati aplikacije za vaše instrumentalije: raznorazna logovanja putem dodira dlana, kontrolu procesa, robotiku, muziku, čitanje i generisanje bar-koda, spell-checking, pretraživanje teksta, itd. Ako je vašoj API rutini potrebna funkcija već implementirana u FoxPro, možete je dobiti jednostavnim korištenjem f-je _Execute(), odn. _Evaluate() da valida- ciju nekog izraza, pa čak i UDF-e. Sledeće programče kreira prozor, koristi API da ga aktivira i potom koristi INKEY() da sačeka na neki od tastera:
baze.podataka.463 max.headroom,
VEZA: C -> FOXPRO FOR WIN Deo 8. Value Val; _Execute("DEFINE WINDOW t1 FROM 0,0 TO 10,10 DOUBLE SHADOW "); _Execute("ACTIVATE WINDOW t1"); _Evaluate(&Val, "INKEY(1)"); Postoje i specijalni kodovi koje možete koristiti za učitavanje i pozivanje inicijalizacionih i cleanup procedura. Takođe, može se kreirati API rutina koja se poziva i koja se nikada ne vraća u FoxPro, pa se Fox može koristiti kao jedna gigantska biblioteka (koristeći _Execute() i _Evaluate()). Možete i na Mesec, samo da imate krilca :) PRISTUPANJE WINDOWS API-JU Koristeći FoxPro-ov API možete pristupiti i Windows API-ju, koji sadrži preko 700 funkcija za manipulaciju fontovima, grafikom, itd. Windows omogućava specifičnu upotrebu rutina iz biblioteka nazvanu Dynamic Link Libraries (.DLL fajlovi), i njih je potrebno učitati samo jednom. Potom možete odlučiti da li pojedini delovi odgovarajuće biblioteke zahtevaju odvajanje dela memorije, odn. da li takva me- morija može da se deli. FoxPro for Win koristi .FLL fajlove, koji su, jednostavno, specifičan oblik .DLL fajlova. Koristeći .DLL mehanizam, .FLL fajlovi se mogu učitati i prikačiti na druge biblioteke. Mogućnošću da pristupite Windows API-ju, automatski dobijate odrešene ruke za promenu MessageBox-a i ChangePrinter dijaloga. Uz to idu i grafika, fontovi, multimedia, usluge printera, itd. Postoje dva načina da pristupite Windows API-ju. Prvi je da koristite .FLL nazvan FOXTOOLS.FLL koji stiže uz FoxPro for Win. Drugi je da napišete vlastiti ekvivalent FOXTOOLS.FLL-a u C-u. FOXTOOLS.FLL se nalazi u ĐGOODIES pod-direktorijumu, koji se kreira kada se pokrene ALLUNPAK.BAT (ili kako se već zove ona gomila upako- vanih bitnih mapa i ostalih sitnih zezalica). Sa učitanom bibliotekom, koristeći funkcije RegFn() i CallFn() pristupate Windows API f-jama. Jedina zabrana koja važi je da pozivane funkcije moraju imati parame- tre integer, long, float, double, char ili string tipa, a mogu se predavati bilo call-by-value, bilo call-by-reference motodom. Evo primera pristupanju MessageBox-a: SET LIBRARY TO foxtools tralala = RegFn("MessageBox", "ICCI", "I") Lista parametara se interpretira na sledeći način: funkcija MessageBox koja ima četiri argumenta: integer, string, string i integer. Rezultat je integer tipa. Funkcija se poziva korištenjem CallFn() f-je: odgovor = CallFn(tralala,0,"Brisanje svih fajlova?","Pažnja",36) Onaj 36 bit-kodirani parametar govori MessageBox-u da ponudi samo odgovore Yes i No, i da prikaže ikonicu sa znakom pitanja. FOXTOOLS može poslužiti i za menjanje izgleda kursora, iznalaženje tekućeg direktorijuma, manipulaciju nad WIN.INI fajlom, promenu default printera i štošta drugo. NESTANDARDNI POZIVI Ako ste željni pisanja potrebnog koda, možete koristiti bilo koju funkciju iz bilo koje .DLL biblioteke, ali to, naravno, važi samo za one funkcije koje ne odgovaraju zahtevima FOXTOOLS.FLL. Dakle, prvo je potrebno napisati neophodni pomoćni kod u C-u, da bi se pristupilo .DLL fajlu. Potom se poziva C Windows funkcija LoadLibrary() koja proverava da li je željena .DLL već učitana i, ako nije, učitava je sa diska. Potom se poziva Windows funkcija GetProcAddress() da bi se pronašla i adresa željene funkcije. Odatle je sve lako. Na primer, možete pozvati ChangeFont dijalog na sledeći način: LOGFONT lf; CHOOSEFONT cf; void NewFont(ParamBlk FAR *parm) š HANDLE hLibrary; FARPROC fnCM; char szCommNameŠ40Ć; /* Postavi sva polja strukture na nulu */ memset(&cf, 0, sizeof(CHOOSEFONT)); cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = 0; cf.lpLogFont = &lf; cf.Flags = CF_SCREENFONTS đ CF_EFFECTS; cf.rgbColors = RGB(0,255,255); /* Svetlo-plava */ cf.nFontType = SCREEN_FONTTYPE; _StrCpy(szCommName,"COMMDLG.DLL"); hLibrary = LoadLibrary(szCommName); if (hLibrary >= 32) š fnCM = GetProcAddress(hLibrary,"CHOOSEFONT"); (fnCM)(&cf); ć return; ć Tako možete koristiti i vlastite .DLL fajlove, koristeći sličan meha- nizam. U narednom jednostavnom primeru šaljemo podatke iz FoxPro pro- grama u Windows "scrolling graph" program. Prvo, kreirate .FLL sa me- morijskim baferom koji ćete puniti iz FoxPro-a koristeći API pozive. "Scrolling graph" program poziva isti .FLL fajl koristeći LoadLibra- ry() funkciju, i potom čita sadržaj bafera u svoju vlastitu memoriju (ond. rezervisani blok). Evo source-a: /* DATAPROC.C Funkcija: dataproc() */ #include <windows.h> #include "pro_ext.h" int idatŠ500ĆŠ4Ć; /* Bafer za transfer */ void far dloader(ParamBlk FAR parm*) /* Učitava bafer u FoxPro */ š int i = parm->pŠ0Ć.val.ev_long; int j = parm->pŠ1Ć.val.ev_long; idatŠiĆŠjĆ = parm->pŠ2Ć.val.ev_long; ć int FAR _ _export PASCAL uldr(int i, int j) /* Prazni bafer */ š return idatŠiĆŠjĆ; ć FoxInfo myFoxInfoŠĆ = š š"DLOADER", dloader, 3, "I,I,I"ć, ć; FoxTable _FoxTable = š (FoxTable FAR *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo ć; *-------------------------------------------------------------- Kod potreban da se učita u ovu biblioteku iz Windows funkcije je sli- čan prethodnom: dll = LoadLibrary("DATAPROC.FLL"); if (dll >= 32) š DataProc = GetProcAddress(dll,"uldr"); /* F-ja za transfer */ if (DataProc == NULL) MessageBox(NULL,"Dobili ste NULL","DataProc Address",MB_OK); else š for (i=0; i<500; i++) for (j=0; j<4; j++) idatŠiĆŠjĆ = (DataProc)(i,j); ć FreeLibrary(dll); ć *--------------------------------------------------------------- Nadam se da niste propustili da shvatite da FoxPro for Win omogućava kreiranje Win-funkcijski dobro podržanih aplikacija (ako ništa drugo, tj. ako u posedu nemate LCK, zadajte SET LIBRARY TO FOXTOOLS i kopajte po literaturi. Najzad, sedamstotinak funkcija Windows .DLL-a nije za bacanje) :)
baze.podataka.464 dr.grba,
Pitanje za foksovce, stvar koja me je totalno zbunila i zapanjila: Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad FoxBase+ programa? Kakva glupost u programu mora postojati, pa da se program pobuni? BTW, nema nikakve mreže. Share je instaliran zbog testiranja OLE 2.0 podrške u WIN programima.
baze.podataka.465 mdrazic, -> #464, dr.grba
> Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad > FoxBase+ programa? Kakva glupost u programu mora postojati, pa da se > program pobuni? Otvaraš li istu tabelu u dve radne oblasti? Ako je to, onda pada ako otvaraš ekskluzivno. To prolazi bez share, a sa njim neće jer to ovaj program zabranjuje (kao što ni na mreži iz istih razliga neće raditi). Izlaz iz ove situacije je da otvaraš tabele u shared modu i tražiš dozvole pisanja (lock) kada išta menjaš. Takođe je ovo zgodno ako ne želite da neko koristi vaš program na mreži ali ćete imati muke sa korisnicima kojima kojekakvi instalacioni programi 'poture' share u sistemske fajlove. Milan
baze.podataka.466 misa.m,
FoxPro 2.6 for UNIX. Izgleda da je MS napravio zaista lep paket za rad pod UNIX-om. Ima se utisak da radite pod DOSom, sve radi identično, boje, miš, tastatura,... Normalno sve ovo važi za rad na konzoli. Za terminale je već malo komplikovanije. Instalacijom dobijate i nekoliko emulacija: wy60fox,wy60-25fox,wy60fox-pc, wy325fox,wy325-25fox,wy325-25wfox (132*25). Fox pored TERM varijable čita i FOXTERM tako da dozvoljava da simultano koristite dve emulacije, jednu u foxu i drugu nakon poziva nekog drugog unix programa (RUN program). Fox for DOS aplikacije rade direktno ako u sebi nemaju DOS specifičnih komandi, izgleda da je kod binarno kompatibilan. Postoji i posebna komanda "proget" (instalira se u /usr/bin), koja se može pozvati nezavisno ili sa RUN, za transfer DOS aplikacije. Zadajete samo direktrijum a komanda na osnovu pronađenih ekstenzija obavi odgovarajući transfer (ASCII ili binary). Uz poruku je prikačena readme datoteka. fpu26.arj
baze.podataka.467 ndragan, -> #449, max.headroom
/ s = "ATDP 648422" + CHR(13) Za čitaoce sa crnobelim televizorima, linija glasi / s = "ATDP ,,,011648422" + CHR(13)
baze.podataka.468 ndragan,
Evo, da odužim reda, ono što sam obećao (jesam li, zaista, nešto se ne sećam... mora da sam bio slabo koncentrisan, tako reći razblažen): - Struktura zaglavlja .dbf fajla - Struktura .fpt fajla - Struktura .idx fajla (nekompaktnog) Prekucato iz Razvijačkih Gajdi od Fp2.6. Tekst je rađet u 852, mrzelo me da butiram rodni mi juski/b015 koktel (besplatna reklama za NkBoga, ¸ß˛ ň˘°ńߢ), pošto je tog trenutka TArva za drugom makinom nešto radio, a mi smo jedan drugom serveri (jel' to neki rod, sinko?), te - ili iskonjvertujte, ili se oslonite na to da je skoro sve na engleskom (ima 6 naših slova u texsztu). Eh, da - u prvoj tabeli brojke sam prevodio na heks (real programmers...) ali me posle mrzelo da pretvaram 235 i slično iz glave, a baška još da tražim heks kalkulator, tako da su brojke u ostalim tabelama dekadne. dbfstru.zip
baze.podataka.469 zzk., -> #464, dr.grba
> Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad > FoxBase+ programa? Kakva glupost u programu mora postojati, pa da se > program pobuni? BTW, nema nikakve mreže. Share je instaliran zbog > testiranja OLE 2.0 podrške u WIN programima. Nisi opisao kog tipa je ispad pa nisam siguran da ce ovaj odgovor pogoditi u metu, ali mozda posluzi onima kojima se desi ono sto je mene jednom namucilo: U config.sys stavljamo ono cuveno FILES da bi nase aplikacije radile sa odredjenim brojem fajlova vecim od podrazumjevajuceg. Za dalje razmatranje je bitno da se za svaku datoteku trosi 48 bajta RAM-a. Programi koji pri instalaciji automatski ubace SHARE u autoexec, ubace ga bez parametara, tako da on obezbjedjuje 20 zakljucanih slogova i 2048 bajta RAM-a za datoteke. (e tu klopara :) ) Dakle, ako tvoja aplikacija radi sa vecim brojem fajlova moras u autoexecu SHARE pokrenuti sa parametrom /F:broj bajtova. Inace, SHARE bez parametara (znaci sa nedovoljno odvojene memorije) ne smeta kada se masina loguje na mrezu.
baze.podataka.470 max.headroom,
Mhm, radim jednu aplikaciju u Fox-u za Win, pa mi neki zlonamerni čika kaže da želi da vidi naša slova u menijima (a ja lepo isplanirao nazive barova tako da naša slova niti ne vidi, ali, eto - on hoće da se jedna stavka zove tako i nikako drugačije). Stoga, ima li neko ideju gde naći system font sa našim slovcima po XY rasporedu? (poželjno - na Sezamu)
baze.podataka.471 mzdravkovic,
Da li se neko sretao sa sledecim problemom. U radu sa bazama pod windows-om (DBASE for win i DB-fast), slike koje su ubacene kao neko polje u bazi, nemogu kasnije da se prikazu u svojim normalnim bojama. Naime, pri kasnijem pozivu slike, ona ima neku svoju paletu boja ili jednostavno smanji broj boja. U svakom slucaju kvalitet slike je nikakav. Zasto baze pod windows-om gube informacije o bojama u slici ?
baze.podataka.472 dr.grba, -> #469, zzk.
>> Dakle, ako tvoja aplikacija radi sa vecim brojem fajlova moras u >> autoexecu SHARE pokrenuti sa parametrom /F:broj bajtova. Aplikacija nije moja, ali hvala na odgovorima.
baze.podataka.473 stosic, -> #471, mzdravkovic
> Da li se neko sretao sa sledecim problemom. > U radu sa bazama pod windows-om (DBASE for win i DB-fast), slike koje su > ubacene kao neko polje u bazi, nemogu kasnije da se prikazu u svojim > normalnim bojama. Naime, pri kasnijem pozivu slike, ona ima neku svoju > paletu boja ili jednostavno smanji broj boja. U svakom slucaju kvalitet > slike je nikakav. Zasto baze pod windows-om gube informacije o bojama u U koliko boja su slike snimljene? Skoro sam pravio jednu aplikaciju u Visual Basic Proffesional v3.0. BMP slike (snimljene u 16 boja) su citane iz baze Access v1.1 i bile su, blago receno, ocajne. Kada sam ih ponovo snimio u 256 boja sve je bilo OK.
baze.podataka.474 djelovic, -> #473, stosic
> BMP slike (snimljene u 16 boja) su citane iz baze Access v1.1 i bile su, > blago receno, ocajne. Kada sam ih ponovo snimio u 256 boja sve je bilo > OK. Razlicite palete.
baze.podataka.476 mzdravkovic, -> #473, stosic
>>> normalnim bojama. Naime, pri kasnijem pozivu slike, ona ima neku >>> svoju paletu boja ili jednostavno smanji broj boja. U svakom >>> slucaju kvalitet slike je nikakav. Zasto baze pod windows-om >> gube informacije o bojama u >> >> U koliko boja su slike snimljene? >> Skoro sam pravio jednu aplikaciju u Visual Basic Proffesional >> v3.0. BMP slike (snimljene u 16 boja) su citane iz baze Access >> v1.1 i bile su, blago receno, ocajne. Kada sam ih ponovo snimio u >> 256 boja sve je bilo OK. Slike sa kojima sam radio su u 256 boja, i normalno je da svaka od njih ima svoju paletu. Od windows-a ocekujem da procita paletu slike koje ce da prikaze, a ne da prikazuje sliku u nekoj svojoj paleti boja. Isti problem sam bojama mi se javljao i kada je windows bio u nekom od hi-color rezima.
baze.podataka.477 tolja,
Ima li neko informacije o problemu koriscenja SPOOL-era pod FoxPro 2.0KKkada radi pod Novell 4.01. Komanda SET PRINTER TO ĐĐSPOOLERĐ... ne vrsi posao jer ne postuje oznaku forme, broj kopija itd. Dakle, kako u FoxPro 2.0 resiti problem stampe na mreznom stampacu pod Novel 4.ll 4.01 ??
baze.podataka.478 max.headroom, -> #477, tolja
> Ima li neko informacije o problemu koriscenja SPOOL-era > pod FoxPro 2.0KKkada radi pod Novell 4.01. Komanda SET > PRINTER TO ĐĐSPOOLERĐ... ne vrsi Primetio sam isti problem, i pošto sam bio prinuđen da stvar rešim brzo, napisao sam sitnu funkciju koja je sve to radila jednostavnim štampanjem u fajl (REPORT FORM TO file) i potom slanje istog na LPT2. Bez veze :)
baze.podataka.479 smarkov, -> #476, mzdravkovic
> Slike sa kojima sam radio su u 256 boja, i normalno je da svaka od njih ima > svoju paletu. Od windows-a ocekujem da procita paletu slike koje ce da > prikaze, a ne da prikazuje sliku u nekoj svojoj paleti boja. Isti problem > sam bojama mi se javljao i kada je windows bio u nekom od hi-color rezima. Sam po sebi WIN to naravno omogućuje. Pitanje je samo da li softver koji prikazuje sliku koristi tu mogućnost (CreatePalette, RealizePalette sa lokalnom paletom). Lako je napraviti WIN programče ili DLL koje će da korektno prikaže BMP. HINT : Postoji primer u WIN3.1 SDK-u, (zove se DIBVIEW) gde su demonstrirane mnoge tehnike u vezi sa BMP-ovima. pozdrav, smarkov
baze.podataka.480 ssava,
Moli se siroki Sezamov auditorijum da po mogucstvu izadje u susret jednom mom drugaru koji radi u DBASE III (jel radi neko jos u ovome) :)))). Da ne 'duljim' evo dole original pitanja, pa saljite savete, mogu i primeri. Opcija RANGE iz naredbe GET u DBASE III, po primeru iz knjige javlja sintaksnu gresku kada se koristi sledeci nacin: @ 12,10 SAY ' poruka ' PICTURE (zeljeni oblik) @ 12,10 GET promenljiva PICTURE (zeljeni oblik) RANGE (low,high) Pozdrav, Sava.
baze.podataka.481 ndragan, -> #464, dr.grba
/ Šta bi mogao biti razlog da instalirani SHARE na mašini izaziva pad / FoxBase+ U kom smislu pad? Ono što se može očekivati je da je to čudo pisano kao da je na solo makini, a neke naredbe neće da rade pod mrežom dok se malo ne premundure. Naprimer Select prva Replace druga->polje with trt.mrt neće raditi pod mrežom, jer je, prvo, sintaksa za mrežu 'replace next 1', što izaziva automatsko zaključavanje sloga i otključavanje nakon upisa. Međutim, nikako neće raditi u prethodnom primeru, jer odbija da piše u slogove osim u selektovanoj bazi. Rešenje (ako se radi o ovom što sam napisao) bi bilo 'Exclusive=on' u config.fx (odnosno u config.fp za FoxPro), ili Set Exclusive On negde pre otvaranja bilo kakve baze. Foks inače smatra da je u mreži čim je učitan Share.exe. Simptom: jel' poruka bila 'record is not locked'?
baze.podataka.482 ndragan, -> #466, misa.m
/ Izgleda da je MS napravio zaista lep paket za rad pod UNIX-om. Ima se Jel' šljaka i na divljega zeniksa, linuksa itd? Na šta je sve instalirljiv? žuo sam da se vari samo sa Svetim Krstom (Santa Cruz), pošto je i to čudo vlasništvo malog mekanog, a da se sa ostalima nalazi u stanju blažeg krstaškog rata. Pričaj bre još, ovo čekam već tri godine.
baze.podataka.483 ndragan, -> #470, max.headroom
/ ideju gde naći system font sa našim slovcima po XY rasporedu? Skini sa sezama sysfon.zip, on od bilo kojeg .ttf pravi .fot. Naravno, moraš sam da ga instaliraš gde treba. Ja turio Arial CE (ili EE?) i fino radi.
baze.podataka.484 ndragan, -> #471, mzdravkovic
/ je nikakav. Zasto baze pod windows-om gube informacije o bojama u / slici ? Fox4w: vidi help za "set palette" - on ili off zadržava sistemsku paletu odnosno preuzima paletu sa slike (ne znam koje je za on a koje za off).
baze.podataka.485 ndragan, -> #478, max.headroom
/ štampanjem u fajl (REPORT FORM TO file) i potom slanje istog na LPT2. Btw, slanje fajla na štampač sam rešavao tako što sam ga slao red po red (kasnije u komadima od 4K) proveravajući printstatus() pre svakog komada. Kasnije, da bih ubrzao posao, otvarao sam štampač sa y=fopen("lpt1",12) tj bez bafera i sa pravom upisa. E, to neće da radi pod novelom 4.01, morao sam da šaljem sa ???.
baze.podataka.486 dr.grba, -> #481, ndragan
>> Rešenje (ako se radi o ovom što sam napisao) bi bilo 'Exclusive=on' u >> config.fx (odnosno u config.fp za FoxPro), ili Set Exclusive On negde >> pre otvaranja bilo kakve baze. Foks inače smatra da je u mreži čim je Videću da li može da pomogne. >> učitan Share.exe. Simptom: jel' poruka bila 'record is not locked'? Mašina je trenutno isključena, pa ne mogu da proverim.
baze.podataka.487 max.headroom, -> #483, ndragan
> Skini sa sezama sysfon.zip, on od bilo kojeg .ttf pravi > .fot. Naravno, moraš sam da ga instaliraš gde treba. Ja > turio Arial CE (ili EE?) i fino radi. Selbstverstaendlich :) Dojurio sam SYSFON.ZIP i nekako doakao fontovi- ma, ali me je "zveknula" ona .obj-ova izvedba internog (programskog) prebacivanja sa jednog sistemskog fonta na drugi :) (u njegovom Sezam Offline Reader-u za Win, SDW-u). Pošto nisam C for Windows programer, tražio sam reference na Windows funkcije koje bi tako nešto omogućile, jer - ne želim da SVAKA aplikacija koristi izabrani YU-system font, već samo moja :) Hmh... mislim da ćemo morati da organizujemo bližu saradnju sa koleza- ma iz PC.PROG/windows. DJelovicu, naš si čovek :)
baze.podataka.488 max.headroom, -> #484, ndragan
> Fox4w: vidi help za "set palette" - on ili off zadržava > sistemsku paletu odnosno preuzima paletu sa slike (ne znam > koje je za on a koje za off). To se i ja spremih da mu kažem, ali mislim da čovek ni ne koristi Fox4Win :) BTW, SET PALETTE ON - uključuje Fox-vu default paletu, dok OFF svič koristi paletu .BMP-a (sve ovo važi i za OLE objekte).
baze.podataka.489 max.headroom, -> #480, ssava
> č 12,10 SAY ' poruka ' PICTURE (zeljeni oblik) :) Zašto bi karakter poruku formatirao kroz PICTURE opciju? Možda ne navodi dobre template kodove u samoj PICTURE opciji, tj. navodi one koji se ne slažu sa odgovarajućim RANGE vrednostima (različiti tipovi podataka)...
baze.podataka.490 max.headroom, -> #485, ndragan
> E, to neće da radi pod novelom 4.01, morao sam da šaljem > sa ???. Da ga ne bi tako "gnjavio" :), spusti samo gomilu temporary fajlova sa jedinstvenim nazivima u dir (REPORT FORM TO file), pa ih kokni na LPT2 (ili jedan po jedan), sa tim da se brišu posle uspešne štampe. REPORT komanda poštuje definisane printer-kodove i onda kada ih šalje u fajl, i meni do sada nije pravila nikakav karambol (mrežni štampač je HPLJ4). Do skoro sam koristio biblioteku sa f-jama koje proveravaju priner-queue, ali, na žalost, biblioteku pisanu za Win3.1... Posle prelaska na Win4WG, ista je postala delimično neupotrebljiva, plus što mi je ispisivala neku warning poruku pri SET LIBRARY TO tipa "Ova Windows verzija mi je nekako sumnjiva" :( Pošto nemam stalan pristup jedinoj viđenoj verziji Lib. Constr. Kit-a, nisam u stanju da je valjano prekompajliram. P.S. Windows ima onol'ko (500 Fox-u dostupnih) f-ja, a mi se akamo sa ponuđenim polu-rešenjima :) Uskoro nameravam da uzmem kopiju PETZOLD-a sa jednog CD-a, pa da prenesem zanimljivi summary :) Hint: SET LIBRARY TO FOXTOOLS, REGFN(), CALLFN()...
baze.podataka.491 djelovic, -> #487, max.headroom
> Hmh... mislim da ćemo morati da organizujemo bližu saradnju sa koleza- > ma iz PC.PROG/windows. Svakako, kolega. Svratite na kahafu :).
baze.podataka.493 gaston,
Hi, ne bih da mnogo smetam, ali imam jedno pitanjce za koje me je, pravo da ti kazem, sramota da ga javno postavim, jer mozda je odgovor ocigledan i pred nosom, ali ja nikako da ga primetim. Kako da otkrijem je li IDX ili TAG u CDX indeksiran po UNIQUE ? Sve sam pokusao, sve funkcije za rad sa indeksima, ali ne ide. To mi treba za jedan mali recnik podataka i program za proveravanje struktura DBF i CDX prilikom otvaranja baze. Pozdrav, Nesa Gaston ş­▄┼]¨÷¨ű ű ű ĆŮřΠ
baze.podataka.494 mdrazic, -> #493, gaston
> Kako da otkrijem je li IDX ili TAG u CDX indeksiran po UNIQUE ? > > Sve sam pokusao, > sve funkcije za rad sa indeksima, ali ne ide. To mi treba za jedan mali > recnik podataka i program za proveravanje struktura DBF i CDX prilikom > otvaranja baze. Metod 1 (bez menjanja sadržine tabele): Napravi dva indeksa po istom ključu, jedan običan, drugi unique. Zatim uporedi hedere indeksnih fajlova. Mora da to tamo negde stoji kao informacija u vidu nekog bajta. Problemi nastaju sa CDX i TAG-ovima jer treba naći heder. Metod 2 (sa promenom sadržaja tabele, čisto softverski): - Nađi neki ključ koji do tada nije korišćen u tabeli. - Dodaj zapis sa tim ključem - Izbriši zapis (delete) - Dodaj OPET zapis sa tim ključem ali ga ne briši - seek ključ će naći zapis (drugi) u slučaju običnog indeksa, ali ga NEĆE naći ako je indeks unique. Objašnjenje: Kod unique indeksa samo prvi ključ (po fizičkom redosledu iz tabele) ide u index, ostali ne. Index se ne obazire na delete flag pri ažuriranju indeksa, ali se obazire pri pretraživanju. Tako seek nađe PRVI zapis sa tim ključem (koji je brisan), proveri flag, vidi da je brisan, i javi da nema zapisa. Bug or feature? U svakom slučaju, zbog ovoga ne treba koristiti unique! Milan
baze.podataka.495 max.headroom,
Database Related Journal dbms9108.zip
baze.podataka.496 misa.m,
Mali uporedni test prfomanci FoxPro-a 2.6 na tri platforme. Za test je korišćena datoteka artikala sa ukupno 39322 slogova indeksirana po sifri C(9) i nazivu C(30). Ceo test je single-user i obavljen je na Zenith-ovoj mašini: - 80486/66Mh/EISA/8MB/SVGA/SCSI-540MB - MSDOS 6.2, WFG 3.11 CEE, SCO UNIX ** Export/Import i Indeksiranje DOS WIN UNIX ------ ------ ------- Append from SDF Size: 2.649KB Time: 11,640 12,930 11.850 Copy to DELIMITED Size: 2.285KB Time: 15,230 13,240 12.850 Copy to SDF Size: 2.649KB Time: 11,480 12,000 9.900 Append pa Index Size: 2.649KB Time: 43,490 33,050 36.340 Append sa CDX Size: 2.649KB Time: 69,240 55,240 134.330 ------------------------------------------------------------- ** Upiti i sumiranje (Uslov za izdvajanje cena > 100 što kao rezultat izdvaja 3373 od 39322 slogova). Testirana je prvo tabela sa dodatim tagom u CDX po ceni a zatim bez njega. Indeksiran po ceni Bez indeksa po ceni -------------------------- -------------------------- DOS WIN UNIX U-SHR DOS WIN UNIX U-SHR ----- ----- ----- ----- ----- ----- ----- ----- Select 0,030 0,110 0.100 0.240 3,590 3,600 2.540 2.540 Select order 2,900 3,180 3.550 3.820 4,650 4,640 4.110 4.520 Browse for 0,110 0,770 0.120 0.140 0,050 0,100 0.030 0.040 Order Brow for 0,520 0,540 0.330 0.330 1,250 0,990 0.980 1.090 Idx for i Brow 2,080 2,820 3.240 3.160 3,410 4,090 3.420 3.480 Select sum all 5,560 4,420 3.360 4.110 5,060 4,570 3.320 3.970 SUM all 3,410 3,790 6.910 9.250 3,490 3,600 6.870 9.280 --------------------------------------------------------------------- - U-SHR je UNIX sa SHARED otvorenim tabelama - Očigledno da je UNIX verzija uglavnom brža kada treba obraditi veću količinu podataka, tj kada rushmore ne nađe indeks. - I očigledna razlika u implementaciji SELECT SUM(arcena) i komande SUM TO m.cena za DOS/WIN i UNIX.
baze.podataka.497 misa.m,
Dodatak prethodnom testu. SCO Open Server 3.0, Memorija nakon startovanja: kernel=3452K, i/o buff=600K, user=4356K ** UNIX sa 6 virtuelnih terminala sa konzole simultano sa datim vremenom startovanja u varijanti sa i bez indeksa po ceni. (zgrada se trenutno kablira pa je mreža u rasturu) Sa indeksom 11:12:32 11:12:43 11:12:44 11:12:49 11:12:59 11:13:26 ------------------------------------------------------------------ Select 0.950 1.180 0.230 1.480 1.180 2.060 Select order 17.830 29.870 34.770 40.040 31.990 43.530 Browse for 2.510 5.270 6.130 3.150 4.280 4.140 order Browse 8.200 2.210 2.010 0.390 4.610 0.520 Select sum 34.820 28.970 28.540 40.830 20.430 38.620 SUM all 57.870 59.980 60.440 44.590 52.590 17.360 ------------------------------------------------------------------ Bez indeksa 11:20:39 11:20:45 11:20:48 11:20:50 11:21:00 11:21:04 ------------------------------------------------------------------ Select 23.600 44.220 52.060 50.860 42.140 39.000 Select order 49.230 37.180 25.740 25.800 27.870 25.810 Browse for 2.090 1.790 2.090 1.880 1.180 1.730 Browse order 8.110 2.940 0.870 11.350 8.790 6.260 Select sum 25.440 37.360 47.180 21.720 22.910 21.820 SUM all 50.120 54.660 46.840 45.100 50.490 61.870 ------------------------------------------------------------------ ** Mnogo realnije za raspolozivu memoriju, 2 usera 11:28:04 11:28:07 ------------------------------ Select 0.540 1.040 Select order 8.840 10.140 Browse 0.310 0.310 Browse order 1.080 0.410 Select sum 7.030 11.560 SUM all 12.640 11.960 ------------------------------
baze.podataka.498 dr.grba, -> #496, misa.m
>> Append pa Index Size: 2.649KB Time: 43,490 33,050 36.340 >> Append sa CDX Size: 2.649KB Time: 69,240 55,240 134.330 WIN najbrži??? (((: Alo, mrzioci Wina! Videste li? (:
baze.podataka.499 bulaja,
========== newsbytes/general #3115, from newsbytes, 3105 chars, Tue Dec 6 17:00:10 1994 ---------- CA Beefing Up Ingres Marketing 12/06/94 NEW YORK, NEW YORK, U.S.A., 1994 DEC 6 (NB) -- A report card on Computer Associates International Inc.'s (NYSE:CA) handling of the Ingres database software it acquired last spring gives the firm an A. That's not surprising, being as the report card came from CA itself. In justifying this pat on its own back, though, CA gave the impression it is working to correct Ingres' traditional weaknesses. At a press conference during the DB/Expo trade show and conference, and transmitted via telephone to other industry media and analysts, CA pointed to increased spending on marketing and incentives for resellers and hardware and software partners. Also at the press conference, several Ingres users chosen by CA praised improved technical support and the added visibility of the product since CA took over The Ask Group Inc., which formerly sold Ingres. Sanjay Kumar, president and chief operating officer of CA, started the conference by saying there are three major trends in the database market at the moment. Customers are moving toward enterprise computing, away from relying on a single database vendor, and from centralized to distributed database systems, he said. Kumar argued that CA is well placed to capitalize on these trends because it is a major vendor of mainframe database software but also, with the acquisition of Ingres, has prepared itself to offer customers "a seamless migration path to client/server." Computer Associates said it will absorb porting and certification fees for vendors of hardware and operating systems that want to bring CA-OpenIngres, the cross-platform version of the database software, to their systems. Computer Associates will also work closely with those firms to port the software. Sun Microsystems Inc. will be the first to take part in this program, the company announced. The company will also reward value-added resellers (VARs) for pushing Ingres by returning to them as much as 10 percent of the license fees it receives for licenses they help to sell, plus quarterly bonuses based on volume. The resellers can also get as much as 75 percent of Ingres marketing costs paid by CA, and those certified as Ingres VARs can now become VARs for CA's Unicenter systems management software without paying initiation and training fees. All this is part of an effort to improve on Ask Group marketing that Computer Associates officials described as "anemic." Predrag Dizdarevic, senior vice-president for research and development at CA, also announced that the new Unix version of CA-OpenRoad, the company's object-oriented application development software, is ahead of schedule and will enter beta testing this month instead of in the first quarter of 1995 as planned. It will ship at the end of March, CA said. OpenRoad for Microsoft Corp.'s Windows 3.1 and Windows NT is to be available by Christmas, Dizdarevic said. (Grant Buckler/19941206/Press Contact: Bob Gordon, Computer Associates, 516-342-2391; Public Contact: Computer Associates, tel 516-342-5224, fax 516-342-5329)
baze.podataka.500 fancy, -> #495, max.headroom
ŮŢ> Database Related Journal Da li si _baš_ siguran da si poslao to što si napisao..?
baze.podataka.501 mdrazic,
I ove godine je održan u USA "1994 Developers Competition & Advisor Developers Conference" takmičenje u brzini pravljenja aplikacija iz oblasti baza podataka. Prijavljeno je bilo na stotine dvočlanih timova koji su koristili razne alate: client/server, UNIX, Windows, Clipper, Fox, Magic, Progress, Oracle,... Prva dva mesta su osvojili timovi koji su koristili Clipper sa "UltimADE application development environment" paketom koji proizvodi neka Belgijska firma sa sedištem (i) u USA. Trećeplasirani su koristili Progress, a četvrti, peti i šesti su radili u Magic-u (prošle godine je Magic bio prvi). Procentualno je više timova koristilo Windows alate nego DOS alate, ali sedam od prvih deset mesta zauzele su DOS aplikacije Milan
baze.podataka.502 mdrazic,
U oktobarskom broju "Data Based Advisor" časopisa koji se bavi bazama na PC opremi podelili su nagrade i pohvale. Ukratko ću navesti pobednike i pohvaljene (u zagradi) u kategorijama (na engleskom, da ne prevodim i bez punog naziva proizvoda ako je poznat): BEST: NEW: new product: Access (BandIt, FoxPro) new database manager: Access (FoxPro) new development product: PowerBuilder (FoxPro) DOS: database manager: FoxPro (Clipper) application development tool: Clipper (FoxPro) database publishing tool: R&R, Ventura text/program editor: Multi-Edit (Brief, QEdit) WINDOWS: database manager: FoxPro (Access, Paradox) application development tool: FoxPro (Visual Basic) database publishing tool: Ventura (Crystal Reports) text/program editor: MS Word add-on: FoxFire CLIENT/SERVER: front end development tool: PowerBuilder (Visual Basic, Gupta SQLWindows) back end/database server: Oracle, Sybase SQL Server, Microsoft SQL Server network operating system: Novell NetWare server operating server: Windows NT (Novell NetWare) application development tool: PowerBuilder (Visual Basic, Clipper) THIRD PARTY TOOLS AND UTILITIES: access add-on: (Code.Print Pro for Access, Intersolv Database Library, Total Access Analyser) C/C++ database library: CodeBase Clipper-add-on: Telepathy code/function library: FUNCky (Grumpfish Library) database recovery tool: dSalvage Professional, Norton Utilities dBASE add-on: R&R Report Writer documentation tool: TechWriter FoxPro add-on: Foxfire! graphics tool for a database manager: dGE (Flipper) linker: Blinker lotus notes add-on: (PowerBuilder for Lotus Notes, VB/Link for Lotus Notes) network library: NovLib (NetLib) paradox add-on: ObjectSpy powerbuilder add-on: PowerTOOL report writer: R&R Report Writer (BandIt, Crystal Reports) telecommunications tool for a database manager: Telepathy user interface/screen design tool: Stage visual basic add-on: VBAssist (SIxBase/VB) BEST OF BREED: (ono što nije klasifikovano pod gornjim klasama) database driver: Comix (SIx Driver) cross platform development tool: FoxPro query tool: Access (Grumpfish Reporter) C/C++ compiler: Borland C++ (MS Visual C++) CASE/design tool: ERWin (EasyCASE) UNIX database manager: Oracle (Sybase SQL Server, Informix-OnLine) object-oriented programming language: Clipper with Class(y) (Borland C++, SmallTalk/V) database accounting software: SBT Professional Series (AccountMate) on-line help: Expert help technical support: Telepathy developer program: Microsoft Developer Network Eto toliko. Nadam se da ovo neće započeti rasprave tipa: moj ... je bolji od tvog ... tri puta. Milan
baze.podataka.503 mdrazic,
Još nešto korisno i interesantno za one koji razmišljaju o moćnijim sistemima od jedne PC mašine. Choosing a databased server (decision tree): Y Y Single-user ─────────── Upsizing soon ────────── (2) │ │N │N (1) │ N Y >16 users ─────────── Multiple concurent ───── (2) │ updates │Y │N │ (1) │ N Y >200 users ─────────── High availability ───── (3) │ required │Y │N │ (2) │ Y Need to preserve ─────── (5) mainframe │ │N │ N High performance ─────── (3) required │ │Y │ N Willing to be on ─────── (3) cutting edge │ │Y │ (4) Legend: (1) Intel-based, single-user with LAN filesharing option Pros: Inexpensive, easy-to-use Cons: Non scalable (2) Intel-based, uni-processor, workgroup server Pros: Scalable Cons: Moderate robustness (3) RISC-based, uni-processor, UNIX departmental server Pros: Robust, scalable Cons: Learning curve for UNIX (4) Multi-processor, parrallel execution, departmental/enterprise server Pros: Optimum performance Cons: Newest technology (5) Mainframe enterprise server Pros: Preserves mainframe investment Cons: Difficult to scale Zaključak: mainframe kompjuteri se koriste samo ako ih već imate, niko pametan ne nabavlja mainframe radi baza podataka OSIM u vrlo malom broju izuzetnih slučajeva sa OGROMNIM bazama (a i to je pitanje). Milan
baze.podataka.504 misa.m, -> #493, gaston
>> Kako da otkrijem je li IDX ili TAG u CDX indeksiran po UNIQUE ? Mislim da je jedini način LIST STAT u file pa dalje sa Low-lewel funkcijama.
baze.podataka.505 ndragan, -> #488, max.headroom
/ To se i ja spremih da mu kažem, ali mislim da čovek ni ne koristi / Fox4Win :) To nešto drugo što on koristi valjda ima neku sintaksu za istu stvar, pošto pretpostavljam da se u stvari radi o maskiranom pozivu nečega iz system.dll ili sličnog, a i da iskoristim priliku da (pozdravim čiku) kažem našima kako se to u foksu rešava.
baze.podataka.506 ndragan, -> #490, max.headroom
/ jedinstvenim nazivima u dir (REPORT FORM TO file), pa ih kokni na LPT2 Malo lepše od ovoga: mreža mi nema mrežni štampač, pošto je server negde u podrumu, nego se koriste mali oki320 lokalni štampači. Od spulera se nigde ne spominje ni q, a novel mi opet ne da da otvorim lokalni lpt1 na radnoj stanici kao fajl za lele i/o. Nije bitno, radi ovako, jedino se meni više sviđalo _onako_.
baze.podataka.507 ndragan, -> #493, gaston
/ sve funkcije za rad sa indeksima, ali ne ide. To mi treba za jedan / mali recnik Imaš uz moju poruku #468 strukturu .idx fajla, čini mi se da se tamo spominje neki bajt u zaglavlju (ne sećam se tačno). Sam fajl nemam kod sebe, a knjiga će mi ponovo biti pri ruci dogodine.
baze.podataka.508 ppekovic, -> #496, misa.m
>> Mali uporedni test prfomanci FoxPro-a 2.6 na tri platforme. Za test >> je korišćena datoteka artikala sa ukupno 39322 slogova indeksirana >> po sifri C(9) i nazivu C(30). Pošto se kod nas prenose SCO news grupe, ovih dana pratim diskusiju o FoxPro-u za Unix. Ima mnogo pritužbi na račun implementacije na Unix-u. Pre svega, primedba se odnosi na brzinu rada sa terminalima, kao i neke probleme sa flow kontrolom. Dalje, nekoliko korisnika se žalilo da je stari FoxBase+ brži u odnosu na novi FoxPro. Paya
baze.podataka.509 max.headroom, -> #494, mdrazic
> Bug or feature? U svakom slučaju, zbog ovoga ne treba > koristiti unique! Gastone, i ja sam istog mišljenja. Za ono što ti je potrebno (znam iz mail-a) nemaš preke potrebe za UNIQUE poljima. Jednostavno traženi po- datak "proveri" sa SEEK, pa ako postoji - nemoj raditi APPEND ili šta ti je već potrebno. Na primer: IF .NOT. SEEK(ključ) APPEND BLANK .... ENDIF Pretraživanja sa SEEK su izuzetno brza (pogledaj par mojih poruka u temi vezane za pretraživanja), tako da i u bazi od nekih 100.000 zapi- sa podatak pronalaziš u trenutku.
baze.podataka.510 mzdravkovic, -> #488, max.headroom
>>> Fox4w: vidi help za "set palette" - on ili off zadrzava >>> sistemsku paletu odnosno preuzima paletu sa slike (ne znam >>> koje je za on a koje za off). >> >> To se i ja spremih da mu kazem, ali mislim da covek ni ne >> koristi Fox4Win :) BTW, SET PALETTE ON - ukljucuje Fox-vu >> default paletu, dok Tacno. Ne koristim Fox4Win, vec DBase for Windows. Glavni problem je sto pri prikazu slike, broj boja je smanjen i time je slika osakacena. Ovo se desava sa slikama koje imaju 256 i 128 boja, a svi primeri koji su dosli uz program su u 16 (ili manje boja) pa kod njihovog prikazivanja nema problema. Da li je moguce da ova prva verzija DBase-a za Windows jos ne moze da podrzi 256 boja ?
baze.podataka.511 ndragan, -> #498, dr.grba
/>> Append sa CDX Size: 2.649KB Time: 69,240 55,240 134.330 / WIN najbrži??? (((: Win je u ovom testu najbolje prošao jer: - ga je pisao gazda Bidža i dao mu da gazduje memorijom kako hoće, tako da se cela priča događa negde na tavanu, u gornjim megabajtima. Za bilo kakvo testiranje produžene verzije foksa (dakle FoxproX, FoxproW) je od bitnog značaja da li je sa rečenom bazom bilo šta rađeno pre testa - ne bih se čudio da gomilu stvari odrade interni keševi samog foksa itd, te da cela baza ostane u memoriji. - Dos verzija ima da mulja sa ekstenderom (ili sa EMS drajverom), juniks ima i druga posla oko operativnog sistema (nikad ne spava), jedino pod prozorom može pošteno da zajaši gornje megabajte i da se ljudski razbaškari. - ovde nema šta da radi sa ekranom, te mu osnovni maniri nisu došli do izražaja ;> --: ceterum censeo, dos mašinama bi trebalo dati memoriju
baze.podataka.512 ndragan, -> #502, mdrazic
/ FoxPro add-on: Foxfire! A jel' neko video to čudo? Šta je to?
baze.podataka.513 nbatocanin, -> #512, ndragan
> / FoxPro add-on: Foxfire! > > A jel' neko video to čudo? Šta je to? "FF is a report generator designed for people who need FoxPro queries or reports fast - without the complexites of programming. FF enables you to work from multiple xBase databases using familiar 'natural language' names for data. FF seamlessly integrates into existing applications. FF's data dictionary lets you store join expressions, field definitions, privileges and printer information in a set of DBF files. Storing join conditions means users are freed from setting relations before running each report. Produce detail, summary and cross tab reports, browses, text merges, and data files (ASCII, DBF and several spreadsheet formats). Available in end-user and developer versions for DOS, Win and Mac."
baze.podataka.514 max.headroom, -> #500, fancy
> Da li si _baš_ siguran da si poslao to što si napisao..? :) Da se ispravim - nije "Journal", kako sam naveo, već skup rutina pisanih za XBase. Pošto sam stvar skinuo sa MR-Systems-a, bačih pogled na prvih par stvari u arhivi, te rekoh - možda će nekoga zanimati. Kad ono, ispade da od "žurnala" nema ništa. Dakle, samo programski prime- ri. Veliko izvinjenje svima koji su fajl skinuli i ustanovili da nedo- staje i nešto "pisanija". P.S. Videh na MR-Sys-u podosta softvera, što bi se reklo, "database rela- ted", ali me linija nije najbolje poslužila. Ako budem nešto od svega toga skinuo - ostaviću ovde, uz obećanje da, kao file-description, isečam deo originalnog .DOC fajla iz arhive. Izvini još jednom.
baze.podataka.515 mdrazic, -> #512, ndragan
> / FoxPro add-on: Foxfire! > > A jel' neko video to čudo? Šta je to? Baš gledam reklamu pa mi opet nije jasno. Izgleda mi da je to neki data dictionary koji sadrži definicije polja, relacije među tabelama, konfiguracije printera, korisničke privilegije i da se te informacije mogu iskoristiti iz aplikacije pri generisanju izveštaja i slično. Kažu da može da generiše FoxPro SQL kod za upite/izveštaje koji koristi (tj. organizuje kod da koristi) Rushmore. Prodaje se za DOS, Windows i Mac. Cene: Developers Edition (source code & distribution rights) Single Platform $295 Any 2 Platforms $499 All 3 Platforms $699 Compiled version (no distribution rights) Single User $89 10 User LAN $195 25 User LAN $395 Unlimited LAN $795 Demo Disk FREE S&H $25 (valjda za proizvod, ne za demo) Adresa: Micromega Systems, Inc. 832 Baker Street San Francisco, CA 94115 tel: 415-346-1461 fax: 415-346-6804 CompuServe: 73354,174 Dalje vidite, pa javite rezultate. Milan
baze.podataka.516 mdrazic, -> #514, max.headroom
>> Da li si _baš_ siguran da si poslao to što si napisao..? > > :) Da se ispravim - nije "Journal", kako sam naveo, već skup rutina > pisanih za XBase. Pošto sam stvar skinuo sa MR-Systems-a, bačih pogled Izgleda da je to prateći sadržaj za sam žurnal sa primerima i potrebnim tabelama, kao malo bogatiji RSOFT. Primetio sam da su izdavačke kuće prestale da šalju ovakve sadržaje na BBS-ove i da ih za debele pare šalju uz magazin na pratećoj disketi koju još popune raznim demo softverom. Milan
baze.podataka.517 misa.m, -> #508, ppekovic
>> Pošto se kod nas prenose SCO news grupe, ovih dana pratim >> diskusiju o FoxPro-u za Unix. Ima mnogo pritužbi na račun Ima li je na fonu, nisam uspeo da je nađem?