baze.podataka.415djelovic,
-> #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.416moebius,
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.417ndragan,
-> #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.418gaston,
-> #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.419max.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.420mdrazic,
-> #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.421dpredovic,
-> #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.422dpredovic,
-> #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.zipbaze.podataka.423moebius,
-> #422, dpredovic> Jedan source, hiljadu reci... Ovo radi sekvencijalni pregled baze,
> iz c-a.
Pravo u metu!
Hvala
Dragan
baze.podataka.424goxx,
-> #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.425pedjolino,
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.427bulaja,
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.428max.headroom,
-> #421, dpredovic> Inače, pronašao sam fazon: SHOW WINDOW REFRESH :)
Jest, ba! :) (Prozori, prozori, a ja kopao po BROWSE-u...)
baze.podataka.429max.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.arjbaze.podataka.430misa.m,
-> #427, bulaja>> Ima li neko Windows ODBC drajver za FoxPro datoteke?
Ima.
baze.podataka.431szeman,
-> #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.432ndragan,
-> #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.433ndragan,
-> #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.434ndragan,
-> #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.435ndragan,
-> #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.436max.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.437aandrejin,
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.438peca.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.439max.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.440max.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.441max.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.442max.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.443djelovic,
-> #422, dpredovic> VEZA: C => FOXPRO for WIN (4/4)
Hvala na veoma zanimljivom primeru!
baze.podataka.444jasicp,
Postoji li grupa za Paradox Engine ? Ako ne postoji, neka interesenti
posalju mail.
baze.podataka.445spantic,
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.zipbaze.podataka.446ndragan,
-> #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.447ndragan,
-> #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.448ndragan,
-> #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.449max.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.450ndragan,
-> #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.451ndragan,
-> #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.452ndragan,
-> #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.453max.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.454max.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.455max.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.456max.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.fllbaze.podataka.457max.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.458max.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.459max.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.460max.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.461max.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.462max.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.463max.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.464dr.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.465mdrazic,
-> #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.466misa.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.arjbaze.podataka.467ndragan,
-> #449, max.headroom/ s = "ATDP 648422" + CHR(13)
Za čitaoce sa crnobelim televizorima, linija glasi
/ s = "ATDP ,,,011648422" + CHR(13)
baze.podataka.468ndragan,
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.zipbaze.podataka.469zzk.,
-> #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.470max.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.471mzdravkovic,
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.472dr.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.473stosic,
-> #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.474djelovic,
-> #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.476mzdravkovic,
-> #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.477tolja,
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.478max.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.479smarkov,
-> #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.480ssava,
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.481ndragan,
-> #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.482ndragan,
-> #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.483ndragan,
-> #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.484ndragan,
-> #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.485ndragan,
-> #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.486dr.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.487max.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.488max.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.489max.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.490max.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.491djelovic,
-> #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.493gaston,
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.494mdrazic,
-> #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.495max.headroom,
Database Related Journal
dbms9108.zipbaze.podataka.496misa.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.497misa.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.498dr.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.499bulaja,
==========
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.500fancy,
-> #495, max.headroomŮŢ> Database Related Journal
Da li si _baš_ siguran da si poslao to što si napisao..?
baze.podataka.501mdrazic,
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.502mdrazic,
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.503mdrazic,
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.504misa.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.505ndragan,
-> #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.506ndragan,
-> #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.507ndragan,
-> #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.508ppekovic,
-> #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.509max.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.510mzdravkovic,
-> #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.511ndragan,
-> #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.512ndragan,
-> #502, mdrazic/ FoxPro add-on: Foxfire!
A jel' neko video to čudo? Šta je to?
baze.podataka.513nbatocanin,
-> #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.514max.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.515mdrazic,
-> #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.516mdrazic,
-> #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.517misa.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?