pascal.330ssokorac,
-> #325, inesic ─┼┤ dve tehnike, tj kako da kažem programu da malo gleda na miša, a
─┼┤ malo na tastaturu, tj. da očekuje ulaz s obe strane.
Pa, recimo ovako
repeat
if keypressed then
case readkey of
.
. proveravaš tastere koje hoćeš
.
end;
GetMouseXY(x,y); (* ili kako ti se već zove procedura *)
If (x in Š1..120Ć) and (y in Š1..30Ć)
Then blablabla...
until šta_ti_je_već_uslov_za_kraj;
pascal.331skerl,
-> #328, isekulovic Evo malog objasnjenja:
> function xyz (var S:string) : string;
Promenljiva koja se na ovaj nacin prenese nekoj f-ji
ili proc je globalnog karaktera. Svaka promena njene vrednosti,
nakon pozivanja f-je ili proc, ostaje i posle kraja izvrsavanja
te f-je ili proc.
> function xyz (S:string) : string;
U ovom slucaju je promenljiva cisto lokalnog karaktera
(u odnosu na f-ju ili proc) kao i svaka njena promena, sto znaci
da ce nakon izlaska iz te f-je ili proc parametar imati istu
vrednost koju je imalo pre pozivanja te f-je ili proc.
Postoji i treci nacin pozivanja f-je ili proc:
procedure xyz (var X);
Takvi parametri se nazivaju 'netipskim parametrima'.
Prednost je u mogucnosti prenosenja promenljivih bilo kog tipa
podatake, i bilo koji tip podataka je ispravan. Medjutim, kada
se koristi netipski parametar, f-ja ili proc nema informaciju o
tipu podataka koje treba da ocekuje pa prihvata sve sto joj se
prenese i ocekuje od programera da zna sta radi! Posto je X netipska
prom, ona se ne moze direktno koristiti vec se mora deklarisati prom
koja mora biti oznacena kao absolute X. Ta nova prom ce biti na
istoj adresi kao X.
procedure Primer (var X);
var Y : integer absolute X;
begin
writeln (y); (* ispravno; Y je tipa integer *)
writeln (x); (* neispravno; X nema tipa *)
end;
U ovom primeru ce Y biti locirano na istom mestu u memoriji
kao X. Tada je moguce koristiti Y umesto X.
Izvin'te ako sam oduzio bez potrebe.
Pozdrav,
Skerl.
pascal.332peca.st,
-> #319, pedjak!-> Evo ga NDX.PAS
žemu služi taj NDX, mrzi me da potrošim 10 sec na skidanje istog!
Ozbiljno, čemu služi?
P e C a
pascal.333peca.st,
-> #321, inesic!-> Štad da mu radim?
Instaliraj TP6.0 ili još bolje ako nabaviš TP7.0
Jednostavno!
P e C a
pascal.334peca.st,
-> #325, inesic!-> Međutim ono što mi nikako ne dolazi to
!-> je kako da kombinujem ove dve tehnike, tj
!-> kako da kažem programu da malo gleda na
!-> miša, a malo na tastaturu, tj. da očekuje
!-> ulaz s obe strane.
Pa to je lako.
Ne znam kako se zovu procedure iz tog unita ali recimo da se pritisak na levo
dugme ošitava sa leftclick (boolean) a za desno rightclick.
Onda ti lepo napišeš:
repeat
... šovde ne mora nista da stoji, ali mozeć
until leftclick or rightclick or keypressed;
if (not leftclick) and (not rightclick) then begin
ch:=readkey;
case ch of
#27: ....
#13: ....
.
.
.
end
end else begin
if leftclick then ....
if rightclick then ....
end;
Valjda bi ovako trebalo da radi! (tako sam ja koristio
sa onim unitom iz Računara)
CU P e C a
pascal.335pedjak,
-> #325, inesic> ono što me je posebno oduševilo je dokumentacija. Ja još nisam
> video da neko uloži toliki rad u kreiranje dokumentacije za PD
> softver. Ne znam kako bih ja sebe naterao da toliko uradim, a da
> mi za to niko ne plati.
Hvala... Unit sam prvo uradio za sopstvenu upotrebu, a i
dokumentaciju sam uradio čisto zbog sebe, jer dešava mi se da posle
mesec dana od pisanja nekog unita, pomalo zaboravim šta sam sve
ugradio u njega, zato ja napisah doc kako bi se i ja lako snalazio
:)
> Međutim ono što mi nikako ne dolazi to je kako da kombinujem ove
> dve tehnike, tj kako da kažem programu da malo gleda na miša, a
> malo na tastaturu, tj. da očekuje ulaz s obe strane.
E, pošto hoćeš da koristiš moj unit, ondak ću ti ja pomognem :)
Dakle, provera selektovanja opcija bi mogla da izgleda ovako:
.
.
.
repeat
repeat
levi:=buttonpressed(left);
desni:=button(right);
until keypressed or levi or desni;
if levi and (xpress= nešto ) and (ypress= nešto ) then uradi_to;
if desni and (xpress= nešto ) and (ypress= nešto ) then uradi_ovo;
if keypressed then
begin
c:=readkey;
if c=#13 then odabrano:=true;
if c=bla_bla...
.
.
end;
until odabrano;
.
.
.
Eto to bi bila prva mogućnost ( to mi je prvo palo na pamet :)
pedja
pascal.336isekulovic,
-> #325, inesic>> Međutim ono što mi nikako ne dolazi to je kako da kombinujem ove
>> dve tehnike, tj kako da kažem programu da malo gleda na miša, a
>> malo na tastaturu, tj. da očekuje ulaz s obe strane.
Ja to radim ovako:
repeat until keypressed or buttonpressed(Anybutton);
if buttonpressed(Anybutton)
then
begin
repeat until buttonreleased(left+middle+right);
.....
end
else
begin
Ch:readkey;
........
end;
Ivan
ps da iskoristim priliku da se pridružim čestitkama za izvanredan unit,
kad videh strelicu u grafičkom modu na hercu oduševih se
pascal.337dzakic,
-> #328, isekulovicNešto mi se čini da ti je tu paskal javio ono upozorenje da se ne slaže
tip promenljive, jer si u funkciji za parametar stavio string, a pozivaš
sa promenljivom koja je tipa string[10]. To se, priznaćeš, razlikuje.
Paskal ti ne dozvoljava takvu kombinaciju jer ne zna da li funkcija
recimo produžava string ili menja neke znake na poziciji većoj od 10
(koliko je stvarno dug string koji se obrađuje), i zato ti daje
upozorenje. Iza string[10] u data segment su smeštene druge promenljive
pa to može da napravi svakakve probleme.
Kada skloniš var, paskal da bi pozvao funkciju generiše kod koji čitav
string kopira na stek. U ovom slučaju se 11 bajtova kopira na stek na
kome je predviđeno 256 bajtova i sve lepo radi a i funkcija se ne buni.
Ako si ti siguran da tvoja xyz funkcija neće da petlja sa znacima na
pozicijama većim od njegove stvarne dužine (odnosno, da neće produžavati
string), onda možeš da isključiš 'Strict VAR checking' sa {$V-} i paskal
će ti dozvoliti ovakvo prenošenje parametara, na tvoju odgovornost.
Samo, nemoj posle da kukaš kad negde zapne i ispostavi da je to problem :)
pascal.338dzakic,
-> #329, dejanr>> Isto je ako ta konstanta nije navedena "na licinom mestu" nego
>> definisana u const sekciji.
Ne uvek. U const sekciji se mogu deklarisati konstante i promenljive sa
početnom vrednoćšu. Kad se stavi
const pi=3.14;
kompajler to primi isto kao i C onu #define direktivu (ili šta je već) i
samo prilikom kompajliranja vrši replace u tekstu. To je prava konstanta
i ne može se pozivati kao argument u funkcijama gde je parametar
deklarisan sa VAR. Dok
const ime:string[3]='zak';
Napravi PROMENLJIVU ime koja ima početnu vrednost. Tako se i ponaša, kao
promenljiva, može da joj se menja vrednost, direktno ili preko procedure.
Paskal se ne buni. Dakle, i nije neka konstanta... Njima se odvoji mesto
u data segmentu, ali su inicijalne vrednosti snimljene u exe.
pascal.339isekulovic,
-> #329, dejanr>> Ako u glavnom programu piše aaa:=xyz('x'); onda ovo ne može da
>> se prevede, jer kako da se promeni konstanta 'x'. Isto je ako ta
Ukapirao sam koja je razlika, ali opet ima malih nejasnoća :)
Jasno mi je da ne može da se menja 'x', ali konstanta koja je definisana
u deklaracionom delu može. Nije baš najpravilnije i najlogičnije, ali
može. Takođe nije mi jasno zašto je funkcija onako definisana (sa var) htela
da primi kao ulaz konstantu definisanu kao string, a nije htela definisanu
kao string[n].
pascal.340isekulovic,
-> #336, isekulovic>> repeat until keypressed or buttonpressed(Anybutton);
>> if buttonpressed(Anybutton)
>> then
>> begin
>> repeat until buttonreleased(left+middle+right);
>> .....
>> end
>> else
>> begin
>> Ch:readkey;
>> ........
>> end;
Mala ispravka samoga sebe:
repeat until keypressed or buttonpressed(Anybutton);
if buttonpressed(Anybutton)
then
begin
......
repeat until buttonreleased(left+middle+right);
end
else
begin
Ch:readkey;
............
end;
pascal.341skerl,
Mali bug u mouse.pas unit-u iz paketa WCTUNITS.ZIP.
Funkcija ButtonPressed ne razlikuje ButtonPressed(LeftButton) od
ButtonPressed(RightButton). Vraca vrednost kao da je trazeno
ButtonPressed(AnyButton).
Prilozen je mali demo programcic koji to lepo prikaze
(putem cula sluha :). Prvo ga pustite sa starom funkcijom a zatim
zamenite staru sa novom pa probajte ponovo. Pojenta demo prog
je da kada se pritisne levi taster comp pisti jednom visinom
a kada se pritisne desni drugom :) (u kvadratu 72, 0 do 158, 72
sto mu u karakterima dodje 10, 1 do 20, 10)
Stara f-ja:
FUNCTION ButtonPressed(Mask : word) : boolean;
BEGIN
Reg.AX := 3;
intr(MouseInt, Reg);
IF (Reg.BX > 0) THEN
ButtonPressed := true
ELSE
ButtonPressed := false;
END;
Ovako treba :)
FUNCTION ButtonPressed(Mask : word) : boolean;
BEGIN
Reg.AX := 3;
intr(MouseInt, Reg);
IF (Mask = 7) AND (Reg.BX > 0) THEN
ButtonPressed := true
ELSE
IF (Reg.BX = Mask) THEN
ButtonPressed := true
ELSE
ButtonPressed := false;
END;
Pozdrav,
Skerl.
mousebug.zippascal.342pedjak,
-> #332, peca.st> žemu služi taj NDX, mrzi me da potrošim 10 sec na skidanje istog!
Unit za manipulaciju ( čitanje, pretraživanje ... ) dBASE III
indeksnih datoteka.
pedja
pascal.343pedjak,
-> #328, isekulovic> Rešio sam, mada mi nije jasno kako. Probelm je bilo što funkcija nije
> htela da prihvati onako definisan string, kao 'ulazni'. Rešio sam
> tako što sam umesto
>
> function xyz (var s:string) : string;
>
> stavio
>
> function xyz (s:string) : string;
> i sve je ok. Sad kad bi mi još neko objasnio razliku. Ja sam živeo u
> zabludi
E, pa ovako:
Prilikom pozivanja funkcija i procedura, koje među listom
parametara sadrže i stringove i to takve da se njihove vrednosti
prenose po imenu znači
procedure xyz(var s:string)
onda se prilikom pozivanja procedure negde u programu moraju
slagati tip stringa koji učestvuje kao parametar sa opisom parametra
u zaglavlju procedure, znači ako u zaglavlju procedure stoji
procedure xyz(var s:string)
onda pri pozivanju procedure sa recimo
xyz(AA);
i promenljiva AA mora biti deklarisana kao
var AA:string
Takođe, mora se paziti na to da promenljive kao što su string,
stringŠ10Ć ili stringŠ49Ć nisu istog tipa. Prilikom kompajliranja
programa sam kopajler proverava sva takva mesta u programu i ako
pronađe da se ne slažu tipovi tekstualnih paramatara sa samim opisom
parametara u zaglavljima javlja 'Type mismatch'.
Kompajlerskom direktivom š$V-ć se ukida provera tipova tekstualnih
promenljivih koje se u funkcije i procedure prenose kao parametri
tipa VAR.
Znači negde na početku programa staviš š$V-ć i problem je rešen.
-------------------
Nevezano za ovu raspravu, moram da naglasim da ako na početku
programa napišete nešto poput
const s:stringŠ10Ć='blabla'
ne dobijate konstantu s. Ovom deklaracijom dobija se promenljiva
tipa string maksimalne dužine 10 znakova, kojoj je na samom početku
programa postavljena vrednost na 'blabla' i ta vrednost se kasnije u
programu može i menjati.
Uh završih :))
pedja
pascal.344ssokorac,
-> #331, skerl ─┼┤ Izvin'te ako sam oduzio bez potrebe.
Ma kakvi samo piši, ovo je mnogo zgodno a nisam znao :).
pascal.345dejanr,
-> #339, isekulovic>> Takođe nije mi jasno zašto je funkcija onako definisana (sa var) htela
>> da primi kao ulaz konstantu definisanu kao string, a nije htela definisanu
>> kao string[n].
Stavi u OPTIONS/Compiler String check relaxed (ili tako nešto) pa će
hteti.
pascal.346skerl,
Da se ne kaze da smo bas skroz ispali iz zbivanja u svetu :)
Pozdrav,
Skerl.
─────────────────────────────────────────────────────────────────────
BP7BUGS1.LST - Version 1 of BP 7.0 bug list
This is the first edition of my completely *un*official list of bugs in
BP 7.0. It's partly based on bugs in TP 6.0 that weren't fixed in the
new release. If you're interested in TP 6 bugs, look for TP6BUGS7.LST,
the final release of my TP 6 bug list.
There are more limitations to this list than there were to the previous
lists, because BP 7.0 is a lot bigger than TP 6.0. I'm unable to test
most Windows bugs, so they probably won't end up in this list. Most of
my work is in real mode, so there's a definite bias towards bugs there.
Finally, I don't do much in TurboVision, and bugs there are a real pain
to confirm, so they're not so likely to make it in. (However, there are
several TV bugs reported, and I've even included fixes for some.)
I'm sure there are errors in this list, and some things that I call bugs
are "design limitations" or "as designed". Don't rely on any of the
fixes; none of them are official (even if they look like they come from
Borland); only Borland can give you official fixes. If you want a
reliable list, write to Borland (in particular Zack Urlocker, at
Compuserve address 76217,1053 or Internet address
76217.1053@compuserve.com) and complain. Professional tools deserve
professional support; a secret bug list, or one maintained by an
amateur, is not professional support.
The list is very abbreviated; if any of the items are too obscure, ask
and I'll expand on them. One abbreviation I've been asked about:
"BASM" is the built-in assembler used in asm blocks.
The bugs reported here are gleaned from reports from dozens of people.
In particular, Morten Welinder has found several new bugs and supplied
fixes.
Bugs in the list are numbered in order from oldest to newest. However,
bugs 1 to 27 are taken from the last TP 6 list; those are more or less
in newest to oldest order, because I was too lazy to reverse the list.
If you're familiar with an older version of the list, check both the top
for late breaking TP 6 bugs and the bottom for new BP 7 bugs.
pascal.347skerl,
Evo i poslednjeg fajla sa bug-ovima iz TP 6.0 :)
Pozdrav,
Skerl.
P.S. Bulaja, ovo bi moglo da ide upoascal direktorijum
jer se nece vise update-ovati.
────────────────────────────────────────────────────────
TP6BUGS7.LST - Version 7 of TP 6.0 bug list
This is the last edition of my completely *un*official list of bugs in
TP 6.0. TP 7.0 and BP 7.0 were released in November 1992; I'm starting
a bug list for those. The first edition (BP7BUGS1.LST) is being released
at the same time as this last edition. For this list, I've noted which bugs
appear to have been fixed in BP 7.0.
There were (at least) two releases both numbered 6.00: the original one
in October 1990, and another in June 1991. You can identify the later
release by the date or by the file size: TURBO.EXE is 325982 bytes in
the later release. Several bugs were fixed in the second release; some
of those are marked below. I've also heard of a 6.01 release dated July
1991, but haven't tested any of these bugs against it.
The list is very abbreviated; if any of the items are too obscure, ask
and I'll expand on them. One abbreviation I've been asked about:
"BASM" is the built-in assembler used in asm blocks.
Juergen Schlegelmilch sent me a very detailed list of bugs & fixes in TP
6.0 & Turbovision; the file version (TP6BUGSn.ZIP) of this list contains
all of his comments. It also contains a few patches and fixes that I've
collected. The file version will be available on Fidonet on the PDN
Pascal file echo area, and on Internet from garbo.uwasa.fi. It is also
available on the PC Techniques section of CLMFORUM on Compuserve in DL
16, as TPBUGS.ZIP.
Many other people have sent me their bug lists; thanks to all of them.
In particular, some recent additions are from Andy McFarland, Arno
Haket, Hans Schleichert, Norbert Juffa, and Jud McCranie. I know I've
missed a few recent contributors; sorry!
pascal.348almi,
treba mi program za tp-for windows koji crta "bar" sa određenim
fill-stylom.
Puno hvala ALMI.
pascal.349almi,
jel može neko da mi opiše standardni postupak za crtanje nekih figura
u tp for windows
Hvala unapred, ALMI
CONNECT 2400
pascal.350skerl,
Jel' nekom bese trebao ovakav program ili se o njemu
pricalo jer je vec nadjen, ne pamtim bas toliko :)
Ako jeste neka vica da salje.
Pozdrav,
Skerl.
┌───────────────────────────────────────────────────────────────┐
│ │
│ Documentation for │
│ │
│ TPU2ASM.EXE │
│ │
│ A symbolic disassembler for │
│ Turbo Pascal version 5.0 units │
│ │
│ Copyright (C) 1989 by Per Bent Larsen │
│ All rights reserved │
│ │
│ Version 1.0, March 1989 │
│ │
└───────────────────────────────────────────────────────────────┘
pascal.351bulaja,
-> #347, skerl│Evo i poslednjeg fajla sa bug-ovima iz TP 6.0 :)
│Bulaja, ovo bi moglo da ide u pascal direktorijum
│jer se nece vise update-ovati.
└───
Hvala! prebaceno je u Pascal direktorijum, a takodje
i spisak bugova za BP/TP 7.0 koji si poslao.
pascal.352mbulat,
Mozda sam i pogresio conf. ali ne znam kako da HANGUPujem modem
koji je on-line da li neko zna kako da se to izvedee u paskalu? Pokusavao
sam nesto sa obaraŕnjedm DTR-a modema ali neide nesto... :(
pascal.353d.petrovic,
-> #352, mbulatĂ> Mozda sam i pogresio conf. ali ne znam kako da HANGUPujem modem
Možda ti ja odgovaram u pogrešnoj :), (a o paskalu pojma nemam)
ali iz dos-a bi to uradio sa
echo ath1 > com2:
znači vidi koji je com port pa piši na njega, a ako je modam na
vezi upiši prvo "+++" <- (nailazi komanda) a ne text, pa "ččč" <-
(pauza).
pascal.354skerl,
-> #351, bulaja>│ Evo i poslednjeg fajla sa bug-ovima iz TP 6.0 :)
>│ Bulaja, ovo bi moglo da ide u pascal direktorijum
>│ jer se nece vise update-ovati.
>└───
> Hvala! prebaceno je u Pascal direktorijum, a takodje
> i spisak bugova za BP/TP 7.0 koji si poslao.
Nema na cemu.
Uskoro stizu i patch-evi za BC ++ 3.1
Pozdrav,
Skerl.
pascal.355pstojanovic,
Napisao sam rezidentan .COM program koji omogucava koriscenje video
memorije direktnim pucanjem u nju. Program se kaci na korisnicki
prekid 61h i pruza dosta mogucnosti u radu sa video memorijom.
Naravno, moze se koristiti iz svih jezika koji pruzaju mogucnost
poziva prekida. Program inace zauzima 1.3 KB. Uz program sam
prilozio i .NG a evo izvoda svih funkcija koje su za sada
definisane :
INT 61h,00h - Inicijalizacija video moda & Tekuca verzija programa
INT 61h,01h - Crtanje prozora na zadatim koordinatama
INT 61h,02h - Ispunjavanje ekrana sa definisanim karakterom
INT 61h,03h - Stampa stringa direktno u video memoriju.
INT 61h,04h - Setovanje tekuce boje teksta i pozadine
INT 61h,05h - Vraca tekucu boju teksta i pozadine
INT 61h,06h - Snimanje ekrana sa zadatim koordinatama u bafer
INT 61h,07h - Vracanje ekrana na zadate koordinate iz bafera
INT 61h,08h - Promena atributa boje u zadatim koordinatama
INT 61h,09h - Sencenje prozora u zadatim koordinatama
INT 61h,0Ah - Ispunjavanje prozora sa zadatim karakterom
INT 61h,0Bh - Vraca karakter i kolor atribut sa zadatih koordinata
Normalno je da mozete sami izvesti sve ove funkcije iz bilo kog
jezika, ili biblioteke; mislim jednostavno da je ovo jedan od
alternativnih pristupa.
Hvala unapred na svim komentarima.
vmtint61.zippascal.356inesic,
-> #335, pedjak> E, pošto hoćeš da koristiš moj unit, ondak ću ti ja
> pomognem :)
Lepo od tebe :) ali problem nije tako jednostavan :(
> Dakle, provera selektovanja opcija bi mogla da izgleda
> ovako:
> .
> .
> .
>> repeat
> repeat
> levi:=buttonpressed(left);
> desni:=button(right);
> until keypressed or levi or desni;
> if levi and (xpress= nešto ) and (ypress= nešto ) then
> uradi_to; if desni and (xpress= nešto ) and (ypress= nešto
> ) then uradi_ovo; if keypressed then
> begin
> c:=readkey;
> if c=#13 then odabrano:=true;
> if c=bla_bla...
> .
> .
> end;
> until odabrano;
Svi koji su mi replicirali, imali su sličnu ideju, ali to zaista
nije tako jednostavno. Hteo bih to da rešim jednom za svagda i da
mu se više nikad ne vratim.
Prvo, potrebna je procedura (možda još bolje funkcija) koja bi
JEDNOZNAžNO vraćala karakter ili šta već, na pritisak nekog
tastera na tastaturi. Gledao sam funkciju readAllKeys iz unita
xcrt, koji je neko ovde poslao nedavno. Ne zadovoljava, jer daje
isti rezultat kad se pritisnu različite kombinacije tastera, npr.
Ctrl-[ je isto što i Esc i tome slično. Za izlaz ove funkcije,
izgleda, malo je bajt i treba bar dva bajta tj. word. Još uvek
nisam siguran kako da napravim ovakvu funkciju, no to je manji
deo problema.
Problem je što meni nije jasno kako tastatura radi. Kad sam u
radnoj okolini TP, i brzo pritisnem F2, F9 i altX i to tako brzo
da je altX pritisnuto pre nego je računar obradio F2, on sve
jedno lepo uradi što je od njega traženo: snimi editor,
kompajlira i na kraju izađe u DOS. Neko mi je rekao da tastatura
ima svoj bafer u koji stane 15 tastera i sad, kad TP izvršavajući
svoj kod naleti na readKey, on uzme prvi znak sa tastature pa ga
obradi. Hoću da kažem kako pritisak na neki taster NE PREKIDA
proces koji je upravo u toku. Međutim, kako sebi da objasnim kako
rade programi tipa 'sačekajte, upravo se čvari, a ako vas mrzi,
pritisnite Esc', drugim rečima kako ovde pritisak na taster
PREKIDA proces koji je u toku.
Neko mi je objašnjavao da su u pitanju interapti, pa kao postoje
hardverski i softverski i na kraju ništa nisam shvatio. Ostalo mi
je u glavi da pojedini delovi hardvera mogu da traže od cpu da im
hitno obavi neki posao ali i da može da se podesi da se posle
nekog vremenskog perioda tj. svako malo generiše interapt koji
obustavi tekući proces i baci pogled na hardver (recimo neki
merni uređaj).
Da najzad pređem na pitanja. Voleo bih da mi neko kaže da li su
tastatura i miš delovi hardvera koji mogu da generišu interapt
ili se to radi tako što se svako malo veštački generiše neki koji
baci pogled na njih (što bi me razočaralo). Da li je moguće
napraviti program koji radi samo ono što je meni cilj i ne gubi
vreme na tamo neka proveravanja hardvera, sve dok se ovaj sam ne
pobuni? Ako je ovo moguće, bi li neko na brzaka sklepao
programčić koji recimo u jednom u glu ispisuje bajt koji se
inkrementira (tj. broji) i ne radi ništa drugo, a kad pritisnem m
on ispiše m u drugom uglu, a kad pritisnem Esc on se vrati u DOS.
Naravno, posle svega ništa ne treba da ostane rezidentno. Ima li
ko da zna kako da se rešim muke.
Ivica
P.S. E, da bilo bi poželjno da se uradi u TP 5.5 u stvari,
naglasak je na izbegavanju asemblera koliko je to moguće, a ni
objektno programiranje nije oblast kojom dovoljno dobro vladam da
bih sve odmah shvatio iz nekog takvog primera.
pascal.357pedjolino,
Imam jedno pitanje pa ako neko ima vremena da mi odgovori.
Zanima me kako da napisem neki rezidentni program koji ce
nesto raditi kada se pritisne odgovarajuci taster (ili kombinacija).
Koji bi vektor trebalo promeniti i uopste nesto o toj temi,
ako moze i mali primer...(nadam se da ne trazim suvise).
P.S. Kako izbaciti iz memorije program koji je ostavljen u
memoriji sa keep.
pascal.358zolika,
-> #357, pedjolino>> Zanima me kako da napisem neki rezidentni program koji ce
>> nesto raditi kada se pritisne odgovarajuci taster (ili kombinacija).
>> Koji bi vektor trebalo promeniti i uopste nesto o toj temi,
>> ako moze i mali primer...(nadam se da ne trazim suvise).
Najbolje je da uzmeš Modulu-2 i u njoj da radiš. Postoji modul TSR u
kome su procedure za instaliranje i deinstaliranje rezidentnih programa.
Ono što hoćeš da ti tvoj rezidentni program radi napišeš kao proceduru,
izabereš kombinaciju tastera na koju će program da se odaziva i u glavnom
programu samo pozoveš proceduru Install sa odgovarajućim parametrima. Ništa
lakše. Evo i primera... Eh, da: izvinjavam se unapred što su komentari u
programu na engleskom, al' to sam se zafrkavao sa asistentom. Program je
možda malo dugačak, no tu postoji sve što treba, pa ako još nekome treba
nešto slično, nek' analizira:
MODULE SeeNoSee;
(* This program is supposed to be the resident one, and called by pressing *)
(* Alt-Z combination. It writes "Zdravo !" message on the screen and waits *)
(* for SPACE to return to DOS. *)
FROM TSR IMPORT Install, KBFlagSet, Alt;
FROM SYSTEM IMPORT WORD, Registers;
FROM Lib IMPORT Intr, IncFarAddr;
FROM Str IMPORT Length;
CONST ZScan =44;
PROCEDURE Resident; (* OVO JE PROCEDURA KOJA SE INSTALIRA KAO REZIDENTNA *)
CONST
WindowWidth = 20; (* The width and height of the window with the message *)
WindowHeight = 7; (* can be easily changed *)
BlankScreen = 0720H; (* This is for clearing the screen *)
BufferSize = WindowWidth*WindowHeight;
LineNumber = 24;
ColumnNumber = 80;
Message = 'Zdravo !';
AttrScr = 7; (* attribute for the same purpose as BlankScreen *)
TYPE
BufferType = ARRAY[1..BufferSize] OF WORD; (* For putting the contents of
the screen*)
Action = (ToScreen, ToBuffer); (* Which action? *)
VAR
UpperLeftCornerLine, ScrBegin, UpperLeftCornerColumn,
MessLine, MessColumn: CARDINAL; (* Where to write the message *)
Buffer: BufferType;
PROCEDURE TestScr(): CARDINAL; (* This procedure determines (or tries to *)
VAR (* determine) the graphics card *)
R: Registers;
BEGIN
Intr(R,11H);
IF 4 IN BITSET(R.AX) THEN
IF 5 IN BITSET(R.AX) THEN
RETURN 0B000H (* Hercules *)
ELSE
(* Return something I don't know *)
END
ELSE
IF 5 IN BITSET(R.AX) THEN
RETURN 0B800H (* EGA/VGA *)
ELSE
RETURN 0B000H (* Hercules *)
END;
END;
END TestScr;
PROCEDURE WaitForSpace; (* This procedure waits for *)
VAR
R: Registers;
BEGIN (* SPACE from the keyboard *)
REPEAT
R.AH:=0;
Intr(R,16H);
UNTIL CHAR(R.AL)=' ';
END WaitForSpace;
PROCEDURE BufferScreen(ScrBegin,Line,Column:CARDINAL; VAR Buf:BufferType;
Mode:Action);
VAR
i, j: CARDINAL; (* this procedure moves block from video memory *)
BegAddr: FarADDRESS; (* with Line and Column as coordinates of top- *)
BEGIN (* -left-handside corner to Buf or from Buf *)
BegAddr:=[ScrBegin: (* which depends on Action. Segment of screen *)
160*(Line-1)+2*(Column-1)]; (* begin is given in the ScrBegin *)
FOR i:=Line TO Line+WindowHeight-1 DO
FOR j:=Column TO Column+WindowWidth-1 DO
IF Mode=ToBuffer THEN
Buf[(j-Column+1)+WindowWidth*(i-Line)]:=BegAddr^; (* move to
buffer... *)
BegAddr^:=BlankScreen;
ELSE
BegAddr^:=Buf[(j-Column+1)+WindowWidth*(i-Line)]; (* ...or to screen!
*)
END;
IncFarAddr(BegAddr,2);
END;
BegAddr:=[ScrBegin:160*i+2*(Column-1)]; (* new line *)
END;
END BufferScreen;
PROCEDURE SetCursorPos(row,col: CARDINAL); (* With special thanks to ZJB *)
VAR
R: Registers;
BEGIN
R.DH:=BYTE(row);
R.DL:=BYTE(col);
R.BH:=00H;
R.AH:=02H;
Intr(R,10H);
END SetCursorPos;
PROCEDURE WriteAtAttrBIOS(row,col: CARDINAL; ch:CHAR; attr:BYTE);
VAR
R: Registers; (* Special thanks to ZJB again *)
BEGIN
SetCursorPos(row,col);
R.AL:=BYTE(ch);
R.BL:=attr;
R.BH:=00H;
R.CX:=0001H;
R.AH:=09H;
Intr(R,10H);
END WriteAtAttrBIOS;
PROCEDURE WindowBorder(row,col: CARDINAL); (* Put border around the *)
VAR (* window *)
i: CARDINAL;
BEGIN
WriteAtAttrBIOS(row,col,'╔',AttrScr);
WriteAtAttrBIOS(row,col+WindowWidth-1,'╗',AttrScr);
WriteAtAttrBIOS(row+WindowHeight-1,col,'╚',AttrScr);
WriteAtAttrBIOS(row+WindowHeight-1,col+WindowWidth-1,'╝',AttrScr);
FOR i:=col+1 TO col+WindowWidth-2 DO
WriteAtAttrBIOS(row,i,'═',AttrScr);
WriteAtAttrBIOS(row+WindowHeight-1,i,'═',AttrScr);
END;
FOR i:=row+1 TO row+WindowHeight-2 DO
WriteAtAttrBIOS(i,col,'║',AttrScr);
WriteAtAttrBIOS(i,col+WindowWidth-1,'║',AttrScr);
END;
END WindowBorder;
PROCEDURE PrintMessage(row,col: CARDINAL; M: ARRAY OF CHAR);
VAR
i: CARDINAL;
BEGIN
FOR i:=col TO col+HIGH(M)-1 DO
WriteAtAttrBIOS(row,i,M[i-col],AttrScr);
END;
END PrintMessage;
BEGIN (* procedure Resident *)
ScrBegin:=TestScr();
IF ODD(WindowHeight) THEN
UpperLeftCornerLine:=((LineNumber-WindowHeight) DIV 2)+1
ELSE
UpperLeftCornerLine:=((LineNumber-WindowHeight) DIV 2)
END;
UpperLeftCornerColumn:=((ColumnNumber-WindowWidth) DIV 2)+1;
BufferScreen(ScrBegin,UpperLeftCornerLine,UpperLeftCornerColumn,Buffer,ToBuffer
);
WindowBorder(UpperLeftCornerLine-1,UpperLeftCornerColumn-1);
MessLine:=(LineNumber DIV 2)-1;
MessColumn:=(ColumnNumber-Length(Message)) DIV 2;
PrintMessage(MessLine,MessColumn,Message);
WaitForSpace;
BufferScreen(ScrBegin,UpperLeftCornerLine,UpperLeftCornerColumn,Buffer,ToScreen
);
END Resident;
BEGIN (* M a i n *)
Install(Resident,KBFlagSet{Alt},ZScan,500);
END SeeNoSee.
Nadam se da će ovo nekome pomoći...
pascal.360skerl,
-> #357, pedjolino│ Zanima me kako da napisem neki rezidentni program koji ce
│ nesto raditi kada se pritisne odgovarajuci taster (ili
│ kombinacija). Koji bi vektor trebalo promeniti i uopste
│ nesto o toj temi, ako moze i mali primer...(nadam se da ne
│ trazim suvise).
│
│ P.S. Kako izbaciti iz memorije program koji je ostavljen u
│ memoriji sa keep.
└────
Necu da ti pisem program ali evo ti jedna arhiva za
pravljenje TSR-ova. Napisana je za TP4.0 ali radi i na visim
verzijama kada se izbaci {$T+}. Tu ti je dovoljno objasnjeno a
imas i unit za pravljenje istih.
Takodje unutra je i program za uklanjanje iz memorije
postavljenih TST-ova. Naravno, treba da znas koji je potpis
ostavio program.
Pozdrav,
Skerl.
───────────────────────────────────────────────────────────────────
This package contains all of the necessary tools for the creation of
TSR (Terminate and Stay Resident) programs with Turbo Pascal 4.0.
Filename Description
-------- ------------------------------------------------------
DICE.PAS Unit source code for dice rolling
DICE.TPU Compiled unit for dice rolling
NODICE.BAT Batch version of the remove program
NODICE.PAS Source for unload sample
POPDICE.PAS Source code for example
POPUP.DOC Document file
POPUP.PAS Source code for TSR unit
POPUP.TPU Compiled unit for creating TSR programs
REMOVE.PAS Universal unloader source code
TPOP.ASM Low-level assembler code for creating TSR programs
TPOP.OBJ Linkable object module for low-level routines
UNHOOK.PAS High-level code for removing a TSR from memory
UNHOOK.TPU Compiled unit for unloading stuff
UPPRCASE.ASM Assembler routine to convert strings to uppercase
UPPRCASE.OBJ Linkabe object module - used by POPDICE.PAS
WINDOWS.PAS Simple windowing unit source code
WINDOWS.TPU Compiled unit for windowing package
tppop16.arcpascal.361vitez.koja,
-> #357, pedjolino#=> Imam jedno pitanje pa ako neko ima vremena da mi
#=> odgovori. Zanima me kako da napisem neki rezidentni
#=> program koji ce nesto raditi kada se pritisne
#=> odgovarajuci taster (ili kombinacija). Koji bi vektor
#=> trebalo promeniti i uopste nesto o toj temi, ako moze i
#=> mali primer...(nadam se da ne trazim suvise).
Isto pitanje je neko nedavno postavio ovde... Pogledaj malo po ovoj temi
pascal.362ssokorac,
-> #357, pedjolino ─┼┤ Zanima me kako da napisem neki rezidentni program koji ce
─┼┤ nesto raditi kada se pritisne odgovarajuci taster (ili kombinacija).
Stavi jedno
..co find pascal /a (rezident;)
Baš sam i ja to isto pitao i dobio par primera...
pascal.363paki,
-> #356, inesic> proces koji je upravo u toku. Međutim, kako sebi da objasnim
> kako rade programi tipa 'sačekajte, upravo se čvari, a ako
> vas mrzi, pritisnite Esc', drugim rečima kako ovde
> pritisak na taster PREKIDA proces koji je u toku.
Pa, recimo,
repeat
...>
...>>čvarenje
...>
until krajčvarenja or keypressed;
ili slično, u zavisnosti od programa.
Dakle, ideja je da proces koji je upravo u toku proverava
pritisak na taster. Može i preko interapta, ali teže (valjda).
pascal.364ssokorac,
Šta ne valja ovde?
var
font:integer;
Begin
.
.
.
font:=InstallUserFont('font.chr');
If GraphResult<>GrOK then Halt;
SetTextStyle(font,0,5);
OutText('Ne radi.');
.
.
.
end.
Koji god font stavim posle InstallUserFont, GraphResult bude GrOK ali je
font uvek isti, onaj mali, debeli, ružni :) :(.
pascal.365isekulovic,
-> #357, pedjolino>> Zanima me kako da napisem neki rezidentni program koji ce
>> nesto raditi kada se pritisne odgovarajuci taster (ili kombinacija).
Potraži datoteku stay42.arc u prošloj (a možda je ipak i u ovoj) conf
pc.prog. Takođe je bio u Mom mikru članak o tome, ali ja ne mogu sad
da nađem taj broj pošto mi je krš u sobi, ali neko je skoro pitao
slično pitanje, pa potraži moj odgovor na to pitanja tamo ćeš naći
broj MM-a.
pascal.366predragd,
-> #333, peca.st> Instaliraj TP6.0 ili još bolje ako nabaviš TP7.0
Jel se kod nas pojavila komercijalana verzija BP 7.0, na bilo kom
tržištu.
Peđa.
pascal.367predragd,
Zna li neko novi tel. broj CGIS BBS-a (vlasništvo firme "The
Cobb Group", pored ostalih časopisa izdaju i "Inside Turbo Pascal".
Hitno mi je potrebno.
Peđa.
pascal.368pedjak,
-> #356, inesic> Prvo, potrebna je procedura (možda još bolje funkcija) koja bi
> JEDNOZNAžNO vraćala karakter ili šta već, na pritisak nekog
> tastera na tastaturi. Gledao sam funkciju readAllKeys iz unita
Probaj sa ovim
INT 16H funkcija 00H
====================
žitanje znaka sa tastature
Poziv sa: Rezultat:
AH=00H AH=SCAN kod karaktera
AL=ASCII kod karaktera
Tebi je bitan SCAN kod jer on jednoznačno određuje svaki taster na
tastaturi.
> Neko mi je objašnjavao da su u pitanju interapti, pa kao postoje
> hardverski i softverski i na kraju ništa nisam shvatio. Ostalo mi
> je u glavi da pojedini delovi hardvera mogu da traže od cpu da im
> hitno obavi neki posao ali i da može da se podesi da se posle
Ti pojedini delovi hardvera trebali bi da su u stanju da generišu
NMI interapt ( nemaskirani interapt ). NMI interapti trenutno
prekidaju cpu i zahtevaju izvršenje nekog zadatka. Tipičan primer za
NMI je reset cpu-a.
> Da najzad pređem na pitanja. Voleo bih da mi neko kaže da li su
> tastatura i miš delovi hardvera koji mogu da generišu interapt
> ili se to radi tako što se svako malo veštački generiše neki koji
> baci pogled na njih (što bi me razočaralo). Da li je moguće
Da, tastatura i miš generišu interapte. Svaki put kad pritisneš
taster generiše se interapt.
> pobuni? Ako je ovo moguće, bi li neko na brzaka sklepao
> programčić koji recimo u jednom u glu ispisuje bajt koji se
> inkrementira (tj. broji) i ne radi ništa drugo, a kad pritisnem m
> on ispiše m u drugom uglu, a kad pritisnem Esc on se vrati u DOS.
To što ti tražiš baš ne može tako jednostavno da se izvede, a da
se ne prekrše tvoji zahtevi. Mislim da se ovim krše minimalno tvoji
zahtevi:
uses crt,dos;
var
kbd2:procedure;
kraj:boolean;
count:word;
š$F+ć
procedure keyboard;interrupt;
begin
case portŠ$60Ć of
50: begin
gotoxy(79,1);
write('m');
end;
1: kraj:=true;
end;
inline($9C);
kbd2;
end;
š$F-ć
begin
clrscr;
getintvec($9,čkbd2);
setintvec($9,addr(keyboard));
kraj:=false;
count:=0;
repeat
gotoxy(1,1);
write(count);
inc(count);
until kraj;
setintvec($9,čkbd2);
end.
Jel' to što si tražio ? Praktično tvoj program samo odbrojava dok
interapti brinu o tome šta je pritisnuto. Ako te još nešto zanima
pitaj...
pedja
pascal.369pedjak,
-> #357, pedjolino> Zanima me kako da napisem neki rezidentni program koji ce
> nesto raditi kada se pritisne odgovarajuci taster (ili kombinacija).
Bilo je skoro u ovoj temi, ali da ponovimo.
š$m 1024,0,0ć (* postave se minimalni memorijski zahtevi *)
uses crt,dos;
var oldint:procedure;
š$F+ć (* forsiramo daleke pozive za interapt rutinu *)
Procedure brisi;interrupt;
begin
if (portŠ$60Ć=46) (* ako je pritisnuto ALT-C *)
and (memŠ$40:$17Ć and 8 = 8) (* obrisi ekran *)
then clrscr;
inline($9C); (* PUSH AF *)
oldint; (* pozovi stari interapt *)
end;
š$F-ć
Begin
GetIntVec($1c,čoldint); (* sačuvaj stari interapt *)
SetIntVec($1c,čmain); (* postavi novi *)
keep(0); (* program ostaje rezidentan *)
End.
> P.S. Kako izbaciti iz memorije program koji je ostavljen u
> memoriji sa keep.
Pa sad to je malko komplikovanije jer standardni paskal set
procedura i funkcija ne podržava takve stvari, ali postoje uniti
koji rade tako nešto. Najjednostavnije je da pre pozivanja ovakvog
programa startuješ program Mark, koji zapamti sadržaj svih
vektora i još neke druge sistemske informacije, zatim startuješ svoj
program, a kad ti i on dosadi startuješ program Release i time se
memorija i interapti vrate u stanje pre zadnjeg Mark-a.
Mark i Release imaš na SEZAM-u.
pedja
pascal.370janko,
-> #356, inesic> Prvo, potrebna je procedura (možda još bolje funkcija)
> koja bi JEDNOZNAžNO vraćala karakter ili šta već, na
> pritisak nekog tastera na tastaturi. Gledao sam funkciju
> readAllKeys iz unita xcrt, koji je neko ovde poslao
> nedavno. Ne zadovoljava, jer daje isti rezultat kad se
> pritisnu različite kombinacije tastera, npr. Ctrl-Š je
> isto što i Esc i tome slično. Za izlaz ove funkcije,
Da li si probao nešto ovako:
function myreadkey : integer;
var r: integer;
k : char;
begin
r:=ord(readkey);
if k=0 then r := 256+ord(readkey);
myreadkey:=r;
end;
Ovakav pristup je dovoljan za većinu primena, gde ne izmišljaš
neke uvrnute kombinacije tastera da ti rade nešto. Ctrl-Š i
treba da da ESC. Zašto bi ti to smetalo?
pascal.371dejanr,
-> #366, predragd>> Jel se kod nas pojavila komercijalana verzija BP 7.0, na bilo kom
>> tržištu.
Ne znam šta znači "na bilo kom tržištu". Program se prodaje, mislim
da ga CET ima. Prodaje se i po exYU, vidim na DECnet-u da ga u Sloveniji
dosta koriste.
pascal.372inesic,
-> #363, paki> Dakle, ideja je da proces koji je upravo u toku proverava
> pritisak na taster. Može i preko interapta, ali teže
> (valjda).
Verujem da je teže, ali bih ipak voleo da mi neko objasni kako,
pa da probam. Iz dva razloga, ako program dugo treba da krčka
neke brojke, mislim zaista dugo, onda stvarno nema smisla mučiti
ga da još i tastaturu proverava, a sem toga voleo bih i da naučim
kako se to radi.
Ako ima neko ko zna kako i koga ne mrzi, pliz send mesidž hir.
Ivica
pascal.373inesic,
-> #358, zolika> Najbolje je da uzmeš Modulu-2 i u njoj da radiš. Postoji
> modul TSR u
Pre nego što mi je puko hard (a, ja, Som, prethodno nisam
bekapovao) neko je ovde ostavio šerver Modulu-2. Kad sam ponovo
oporavio hard i DL celu temu pascal od nje više traga nije bilo.
Da li je to obrisano, da li je negde prebačeno, da li je moj SOR
zbingovo negde te poruke??? Zašto nema module koja je šerver?
Halo, moderatore, da li znaš gde da je tražim?
Ivica
pascal.374inesic,
-> #369, pedjak> š$m 1024,0,0ć (* postave se minimalni
> memorijski zahtevi *)
Zbog čega ovo
> š$F+ć (* forsiramo daleke pozive za interapt rutinu *)
i čta ovo uopšte treba da znači, tj. šta su to daleki pozivi?
Ivica
pascal.375peca.st,
-> #356, inesic!-> pobuni? Ako je ovo moguće, bi li
!-> neko na brzaka sklepao programčić
!-> koji recimo u jednom u glu ispisuje
!-> bajt koji se inkrementira (tj. broji) i
!-> ne radi ništa drugo, a kad pritisnem m on
!-> ispiše m u drugom uglu, a kad pritisnem
!-> Esc on se vrati u DOS.
count:=0;
ch:='';
repeat
gotoxy(75,1);
inc(count);
write(count);
if keypressed then begin
ch:=readkey;
if ch='m' then begin
gotoxy(1,1);
write(ch);
end;
end;
until ch=#27;
Stvarno ne vidim u čemu je problem kod tebe. Ako ti je teško da u toku rada
nekog ciklusa ispituješ nešto onda ti teško ima pomoći bez Assm-a i interapta.
(pojma nemam kako se sa tim radi). Ovako nemaš nikakvih problema, samo treba
ispitivati šta USER hoće, šta je pritisnuo i tako to. Ti bi izgleda hteo da
kompjuteru samo objasniš tek onako šta bi ti hteo da radi, e, pa ipak moraš
malo da se pomučiš, kompjuter jeste brz, ali nije baš inteligentan dok mu ti
ne objasniš kako treba biti inteligentan. ;)
Valjda sam ti pomogao.
P e C a
pascal.376pedjolino,
Zahvaljujem se svima na iscrpnim odgovorima
u vezi rezidentnih programa.
Pozdrav Nenad.
pascal.377vitez.koja,
-> #368, pedjak#=>> Prvo, potrebna je procedura (mozda jos bolje
#=>> funkcija) koja bi JEDNOZNACNO vracala karakter ili
#=>> sta vec, na pritisak nekog tastera na tastaturi.
#=>> Gledao sam funkciju readAllKeys iz unita
#=> INT 16H funkcija 00H
#=> Tebi je bitan SCAN kod jer on jednoznacno odreduje svaki
#=> taster na tastaturi.
Nema potrebe da se maltretiras sa interaptima, mozes da citas direktno
sa porta 60h ( Port[$60] u TPu ) i dobijas scan kodove. Svaki taster ima
po dva scan koda, jedan kad je pritisnut i drugi kad je otpusten. Scan
kodovi su rasporedjeni 'po redu', ESC je 1, '1' je 2, i tako dalje.
Detekcija tzv. specijalnih karaktera u TPu je resena upravo sa scan
kodovima : npr za strelicu uzbrdo prvo dobijas 0, a zatim 72, sto je
njen scan kod.
Medjutim, iako tvoj program konstatuje scan kodove sa porta 60h,
ipak moras da vodis racuna o baferu, tj. da ga redovno praznis, jer
njegovo prepunjenje dovodi do onog odvratnog pistanja.
pascal.378peca.st,
-> #364, ssokorac!-> font:=InstallUserFont('font.chr');
Prva stvar: ne smeš napisati 'font.chr' već samo 'font'.
!-> OutText('Ne radi.');
Druga stvar: Ja ne koristim outtext, ja uvek outtextxy(x,y,s) mada
ne vidim zašto bi ovo smetalo.
Ne vidim nikakve druge greške, osim ako font ne postoji.
P e C a
pascal.379predragd,
Da li TP 7.0 (ne BP) može da pravi programe koji će se izvršavati
u protected modu 286-ice, i da li on može da koristi DLL biblioteke.
Peđa.
pascal.380macak,
-> #337, dzakic█ Medjutim, iako tvoj program konstatuje scan kodove sa porta 60h,
█ ipak moras da vodis racuna o baferu, tj. da ga redovno praznis...
Mala dopuna ovoga.
Najjednostavnije da prvo ispraznis bafer i onda citas scan code.
Nesto u ovom stilu:
while scancode <> 1 do
begin
...
registri.ah := $0C;
registri.al := 7;
intr($21,registri);
scancode := port[$60];
...
end;
Ovo provereno ne dovodi ni do kakvog pistanja. Sve radi solidno
i kada je tastatura ubrzana.
pascal.381dejanr,
-> #379, predragd>> Da li TP 7.0 (ne BP) može da pravi programe koji će se izvršavati
>> u protected modu 286-ice
Ne.
>> i da li on može da koristi DLL biblioteke.
Ne.
pascal.382ssokorac,
-> #378, peca.st ─┼┤ Prva stvar: ne smeš napisati 'font.chr' već samo 'font'.
Probao i tako, ali neće :(.
─┼┤ Druga stvar: Ja ne koristim outtext, ja uvek outtextxy(x,y,s) mada
─┼┤ ne vidim zašto bi ovo smetalo.
Ma, to nema nikakve veze...
pascal.383ppekovic,
-> #373, inesic>> Halo, moderatore, da li znaš gde da je tražim?
Pogledaj u temi jezici.
Paya
pascal.384pedjak,
-> #364, ssokorac> .
> .
> font:=InstallUserFont('font.chr'); <= ovde je greška
> If GraphResult<>GrOK then Halt;
> SetTextStyle(font,0,5);
> OutText('Ne radi.');
> .
Probaj ovako:
font:=InstallUserFont('font');
Znači treba ime bez ekstenzije.
P.S. ime fonta može biti najviše četiri znaka.
pascal.385bearboy,
-> #286, paki║ Ma to je lako uraditi, ali tu sliku prvo treba da nacrtam. A recimo
║ da je crtam u PaintBrushu ili nečemu sličnom, morao bih da je snimam
║ u .PCX, da je učitavam iz TP, crtam, skidam u file i tek onda
║ ubacujem u moj program... Ovo je primenljivo na 3-4 sprajta, ali za
║ dvadesetak komada postaje pravo mučenje.Ako neko zna(ima) bolje
║ rešenje ili program, nek mi kaže. Fala...
Jel' za SPRITES.TPU ? Ako jeste, najbolje je koristiti .CEL-ove Autodesk
Animatora... A on ti radi sa GIF-ovima, tako da nema problema, a i sam ima
lepe alatke za crtkanje...
pascal.386bearboy,
-> #293, ssokorac║ ─┼┤ Pa to čudo bi bilo lepo da se okači ovde, ako nije problem :))
║
║ Ja bi vrlo rado, ali kao što rekoh, autor je bearboy, pa ako on smatra da
║ je pd i da je dostupno svima, on će i poslati. Ja ne mogu.
Još ne :) Prvo da završim stvar, da stignem do verzije 2.0, da se izda SUPI
4 (ili više), pa ćemo da vidimo šta možemo...
PS. Stasho, jesi li izabrao neki .MOD ? Mislim da sam pronašao način da
linkujem .MOD u sam .TPU...
pascal.387bearboy,
-> #311, paki║ Bearboy, reci da li si voljan da šilješ ili da upadam kod Staše u
║ stan i nosim unit sa sve hard diskom ;))
║ Šalu na stranu, reci da li je to tvoje čedo pd&sw ili da se snalazimo...
Moraćeš da upadaš :) A i inače, ne bi ti mnogo vredelo pošto unit pri
startanju ispisuje nešto kao 'Sound Routines 4 SUPI 4', tako da nije bash
previše korisno za druge programe...
pascal.388wizard,
-> #387, bearboy>> unit pri startanju ispisuje nešto kao 'Sound Routines 4 SUPI 4',
Jel to znači da taj SUPI neće da radi pod DV-om? No, ionako ih nisam
igrao, nisam mogao da se naviknem na user-interface. :)
pascal.389ndragan,
-> #372, inesic/ neke brojke, mislim zaista dugo, onda stvarno nema smisla mučiti
A da jednom u hiljadu i(s)teracija zaviri u bafer tastature?
pascal.390vvelisavljev,
Jel ima neki trik da proverim da li je disketa u drajvu?
Ne bi da mi se, ako iz programa pozovem npr. COPY *.* A: , pojavi ono
čuveno: Abort, Retry, Ignore.
pascal.391pedjak,
-> #377, vitez.koja> sa porta 60h ( PortŠ$60Ć u TPu ) i dobijas scan kodove. Svaki taster ima
> po dva scan koda, jedan kad je pritisnut i drugi kad je otpusten. Scan
Nee... Svaki taster ima samo jedan SCAN kod. Njegova vrednost ide
od 1-127. Ukoliko je taster pritisnut onda je sedmi bit resetovan, a
ako je taster pušten onda je setovan. Zato se scan kodovi za
pritisnut i otpušten taster razlikuju za 128.
> Detekcija tzv. specijalnih karaktera u TPu je resena upravo sa scan
> kodovima : npr za strelicu uzbrdo prvo dobijas 0, a zatim 72, sto je
žini mi se da baš to nije tako... Mislim da ReadKey u TP-u radi
preko MS-DOS interapta, funkcija 01H ( ulaz znaka sa ehom )
function ReadKey:char;assembler;
asm
mov ah,01h
int 21h
end;
Probaj ovu funkciju, radi identično kao i ugrađena.
> Medjutim, iako tvoj program konstatuje scan kodove sa porta 60h,
> ipak moras da vodis racuna o baferu, tj. da ga redovno praznis, jer
> njegovo prepunjenje dovodi do onog odvratnog pistanja.
Da, svakako. Zato je bolje da se očitavanje tastera vrši preko DOS
ili BIOS interapta, jer onda ne moraš da brineš o takvim stvarima...
pedja
pascal.392pedjak,
-> #374, inesic>> š$F+ć (* forsiramo daleke pozive za interapt rutinu *)
> i čta ovo uopšte treba da znači, tj. šta su to daleki pozivi?
$F direktiva utiče na pozivanje procedura i funkcija pri
generisanju mašinskog koda. Daleki pozivi su takvi pozivi kada se
potprogram poziva navođenjem kompletne segment:ofset adrese, dakle :
CALL seg:ofs
Ovom naredbom se na stek stavlja trenutna vrednost CS i IP registra,
a zatim se skače na navedenu adresu. Pri završetku potprograma u
glavni program se vraćamo pomoću RETF naredbe, koja skida sa steka
prethodno stavljene vrednost CS i IP registra.
Bliski pozivi potprograma se dobijaju navođenjem samo ofsetnog dela
adrese potprograma. Iz ovog proističe da se potprogram mora nalaziti
u okviru istog kodnog segmenta.
Zašto se ova $F direktiva koristi ? Pa ima slučajeva u kojima se
mora kompajleru narediti, kako će da pozove potprogram ( inače
kompajler će to učiniti po nekom svom nahođenju ) Daleki pozivi
moraju postojati pri pozivanju sopstvenih Exit procedura, eksternih
procedura i interapt procedura ( za ovo zadnje nisam siguran, u nekim
slučajevima radi i bez toga, ali bolje je staviti, 'leba ne jede )
inače će se program 'ladno zakucavati.
Ako te još nešto interesuje o organizaciji koda koji generiše TP
slobodno pitaj, tu sam...
pedja
pascal.393pedjak,
-> #364, ssokorac> font:=InstallUserFont('font.chr');
Sad sam primetio. Ime fonta se sastoji od najviše 4 slova i ime se
piše bez ekstenzije. Drugo font ti se mora nalaziti u tekućem diru.
Najverovatnije je tu greška ( banalno, šta ćeš :)
pedja
pascal.394dejanr,
-> #390, vvelisavljev>> Jel ima neki trik da proverim da li je disketa u drajvu?
Pogledaj 6.28 u ovoj konferenciji.
pascal.395peca.st,
-> #382, ssokorac!-> Probao i tako, ali neće :(.
E, pa onda ti nešto nije u redu sa fontom. Odakle si ga uzeo? Ja sam nabavio
onih pet fontova, valjda od QPro-a i oni lepo rade. Nikakvih problema nije bilo
iz prve su proradili.
P e C a
pascal.396peca.st,
-> #384, pedjak!-> font:=InstallUserFont('font');
!-> Znači treba ime bez ekstenzije.
Eh, to mu rekoh i ja, ali on kaže da nije.
P e C a
pascal.397drmarke,
Hitno potreban program koji bi OAK-067VGA karticu switch-ovao
u Hercules rezoluciju. Nešto slično radi SVM89 za Trident kartice ali
mi treba za žAK.
Imam program koji je pisan u Pascal-u za Hercules pa mi i pored
EGAVGA.BGI fali parče slike. Ako neko ima ideju kako bi se ova glupost
prevazišla nek napiše neki red.
Pozdrav DrMarke
pascal.398dzakic,
-> #392, pedjak>> mora kompajleru narediti, kako će da pozove potprogram ( inače
>> kompajler će to učiniti po nekom svom nahođenju ) Daleki pozivi
Neće baš po nahođenju. Sve procedure iz istog junita smeštene su
u segment i pozivaju se sa NEAR. Procedure iz drugih junita se
pozivaju kao FAR jer svaki junit dobije svoj code segment.
Za interapt procedure se ne mora naglašavati da su far,
podrazumeva se. One se završavaju sa RTF - da pokupe i flegove.
pascal.399darone,
-> #397, drmarke>> Imam program koji je pisan u Pascal-u za
>> Hercules pa mi i pored EGAVGA.BGI fali parče
>> slike. Ako neko ima ideju kako bi se ova glupost
>> prevazišla nek napiše neki red.
Evo ti jedan VGAMODE, za OAK 037, možda proradi.
darone
p.s. radi istu stvar ko i SVM89, ali ovde posle
promene resetuj mašinu.
vgamode.arjpascal.400inesic,
-> #389, ndragan> A da jednom u hiljadu i(s)teracija zaviri u bafer
> tastature?
Pa to bi, povrh svega, značilo da treba da postavim i brojač koji
treba da odbroji tih 'iljadu i(S)teracija. To je gubljenje
dragocenih femtosekundi.
pascal.401vitez.koja,
-> #391, pedjak#=>> Svaki taster ima po dva scan koda, jedan kad je
#=>> pritisnut i drugi kad je otpusten.
#=> Nee... Svaki taster ima samo jedan SCAN kod.
#=> Zato se scan kodovi za pritisnut i otpusten taster
#=> razlikuju za 128.
Protivrecis sam sebi :) Ali nema veze. Mislili smo na isto.
pascal.402vitez.koja,
-> #390, vvelisavljev#=> Jel ima neki trik da proverim da li je disketa u drajvu?
#=> Ne bi da mi se, ako iz programa pozovem npr. COPY *.* A:
#=> , pojavi ono cuveno: Abort, Retry, Ignore.
Probaj sa DiskSize, ako vrati smislenu vrednost znaci postoji disketa.
Inace, 'ono cuveno' mozes da izbegnes tako sto ces da stavis {$I-} na
pocetak i {$I+} na kraj kriticnog bloka naredbi - iskljucujes automatsku
kontrolu I/O gresaka. Pri tom je zdravo da motris na promenljivu
IOResult - ako nije 0 nesto ne valja...
pascal.403pedjak,
-> #387, bearboy> Moraćeš da upadaš :) A i inače, ne bi ti mnogo vredelo pošto unit pri
> startanju ispisuje nešto kao 'Sound Routines 4 SUPI 4', tako da nije bash
Jel može nešto da mi se razjasni ? Nisam pratio baš ovu raspravu pa
reko da proverim. Dakle, bear šta si ti to napravio ? Unit za
sviranje .MOD fajlova na PC zujalici ? Ako nije tajna, na kom
principu radi ?
pedja
pascal.404pedjak,
-> #390, vvelisavljev
> Jel ima neki trik da proverim da li je disketa u drajvu?
Bilo je već od ranije:
repeat
writeln ('Ubaci disketu');
readln (dummy1);
size:=disksize (diskno);
until size>0;
pedja
pascal.405ssokorac,
-> #388, wizard ─┼┤ Jel to znači da taj SUPI neće da radi pod DV-om? No, ionako ih nisam
─┼┤ igrao, nisam mogao da se naviknem na user-interface. :)
Da l' će da radi pod DV-om - nemam pojma, probaću kad ga napravim do kraja
:). Ali user-interface je poptpuno drugačiji od starih. EGA/mouse. :)
pascal.406ssokorac,
-> #396, peca.st ─┼┤ Eh, to mu rekoh i ja, ali on kaže da nije.
Štos je u onome - max 4 slova. Izem ti dužinu :), ali thanks, pedjak!
pascal.407ssokorac,
-> #393, pedjak ─┼┤ Najverovatnije je tu greška ( banalno, šta ćeš :)
Bio je u pravom direktorijumu, fazon je u ona 4 slova... Zašto baš 4, tj.
samo 4 ?
pascal.408ssokorac,
-> #395, peca.st ─┼┤ onih pet fontova, valjda od QPro-a i oni lepo rade. Nikakvih problema
─┼┤ nije bilo iz prve su proradili.
Sam sam ih pravio :). Tj. GA pravio, jer je samo jedan.
pascal.409ssokorac,
-> #403, pedjak ─┼┤ reko da proverim. Dakle, bear šta si ti to napravio ? Unit za
─┼┤ sviranje .MOD fajlova na PC zujalici ? Ako nije tajna, na kom
Još bolje. SVira u backgroundu.
pascal.410pedjak,
-> #401, vitez.koja> Protivrecis sam sebi :) Ali nema veze. Mislili smo na isto.
Da sad videh... :) Ali nema veze sporazumeli smo se.
pedja
pascal.411pedjak,
-> #398, dzakic> Neće baš po nahođenju. Sve procedure iz istog junita smeštene su
=========
Pa dobro, nisam upotrebio pravu reč :)) Sve što stoji u tvojoj
poruci je sasvim tačno, na to sam i mislio, ali se nisam dobro
odrazio :)
pedja
pascal.412predragd,
-> #381, dejanr> Ne.
>
>>> i da li on može da koristi DLL biblioteke.
>
> Ne.
Hvala ti na odgovoru zbog kog nisam baš sretniji ali šta se tu
može, kad dođe BP biće drugačije. Koje su još razlike između TP i BP
(7.0 naravo), pored navedenih.
Peđa.
pascal.413predragd,
-> #386, bearboy> PS. Stasho, jesi li izabrao neki .MOD ? Mislim da sam
> pronašao način da linkujem .MOD u sam .TPU...
Izvinjavam se što se mešam, ali ako vas interesuje postoje
procedure za TP ili TC za korišćenje *.MOD-ova. Nisu baš sjajne ali
rade, pa ako vam zatrebaju ...
Peđa.
pascal.414dejanr,
-> #412, predragd>> Koje su još razlike između TP i BP (7.0 naravo), pored navedenih.
Pa, glavna razlika je što BP može da generiše Windows aplikacije dok
je TP 7 ograničen na DOS. Možda će te zanimati da pogledaš preliminarni
prikaz Pascala 7.0 u prošlim "Računarima"
pascal.415vasic,
-> #398, dzakicCccc, Zače, grdiš čoveka zbog nepreciznosti, a pogledaj samo šta si ti
sam napisao:
> Neće baš po nahođenju. Sve procedure iz istog junita smeštene su
> u segment i pozivaju se sa NEAR. Procedure iz drugih junita se
> pozivaju kao FAR jer svaki junit dobije svoj code segment.
Znači, ako neku proceduru zovem iz njenog unit-a, biće generisan near
call, a ako istu proceduru pozovem odnekle spolja to će biti far call.
Ne znam zašto, ali mi to ne deluje kao mehanizam koji bi radio duže od
par nanosekundi. :))
pascal.416pedjak,
-> #407, ssokorac> Bio je u pravom direktorijumu, fazon je u ona 4 slova... Zašto baš 4, tj.
> samo 4 ?
Pa mora i Borland negde da zezne stvar :))
pedja
pascal.417pedjak,
-> #405, ssokorac> Da l' će da radi pod DV-om - nemam pojma, probaću kad ga napravim do kraja
Jel' mogu već sad rezervišem mesto u budućoj grupi za testiranje
novog SUPI-ja, a ? Ajde sredi mi :))
pedja
pascal.418pedjak,
-> #409, ssokorac> Još bolje. SVira u backgroundu.
Sjajno ! A jel' može da se dobije neki demo koji koristi taj unit,
ako već ne može sam unit. Voleo bih da čujem kako zvuči.
pedja
pascal.419pedjak,
-> #405, ssokorac> :). Ali user-interface je poptpuno drugačiji od starih. EGA/mouse. :)
A da li će raditi na Herc/mouse ?
pedja
pascal.420skerl,
Mala pomoc pocetnicima pri ucenju Pascal-a. Pogotovo
pri pregledanju i shvatanju demo programa kao i onih koje nisu
sami pisali.
Pozdrav,
Skerl.
─────────────────────────────────────────────────────────────
January 1, 1993
Turbo Identity Version 1.0
A HyperSource Utility for Turbo Pascal v.6.0
(C) Copyright 1993 by Vladimir Jacko.
All Rights Reserved.
OVERVIEW
TI offers the HyperText information from TP 6.0 source code.
TI finds a definition for each identifier used in a program.
It was designed as a utility to help beginners to read and
understand the demonstration programs.
REQUIREMENTS
Borland's Turbo Pascal(R) version 6.0
A mouse is desirable
The following files are supplied:
TI.EXE The HyperSource utility
TI.DOC This one
This is a test version. It was released as I'd like to know
other people's opinions.
ti01.zippascal.421ilazarevic,
U kojoj rezoluciji, po difoltu, radi TP program ako je BGI drajver
EGAVGA?
pascal.422ilazarevic,
Kako da ispraznim bafer tastature?
pascal.423lovro,
-> #413, predragd> Izvinjavam se sto se mesam, ali ako vas interesuje postoje
> procedure za TP ili TC za koriscenje *.MOD-ova. Nisu bas sjajne
> ali rade, pa ako vam zatrebaju ...
Bilo bi lepo od tebe, pa ako ih imas...
Lovro
pascal.424dzakic,
-> #415, vasic>> Znači, ako neku proceduru zovem iz njenog unit-a, biće generisan
>> near call, a ako istu proceduru pozovem odnekle spolja to će biti
>> far call.
Naravno da ne. Pravi se razlika između dve vrste procedura: prve
su "interface" procedure, one moraju biti far i tako se pozivaju
bilo iz drugog bilo iz tog istog junita, dok su 'lokalne'
procedure near jer se pozivaju samo iz tog junita.
Da ne zalazimo sad u overlay-e, tu moraju sve da budu far.
Ma sve je jasno, možda je i bilo neprecizno, ali sam hteo da
kažem da to sve nije baš toliko proizvoljno već se tačno zna
kako se šta poziva...
pascal.425dzakic,
-> #422, ilazarevic>> Kako da ispraznim bafer tastature?
var kbdhead: word absolute $40:$1A;
kbdtail: word absolute $40:$1C;
begin
kbdtail:=kbdhead;
end.
pascal.426mjova,
-> #422, ilazarevic> Kako da ispraznim bafer tastature?
možeš na dva nalina. jedan je relativno jednostavan: uzimaš znak iz
bafera dokle god ga ima (prvo proveriš da li ima nešto u baferu), a
drugi je malo teži ali brži: izjednačiš početak i kraj bafera
(pogledaj u nekom helpu kako da nađeš ove adrese).
pascal.427pedjak,
-> #413, predragd> Izvinjavam se što se mešam, ali ako vas interesuje postoje
> procedure za TP ili TC za korišćenje *.MOD-ova. Nisu baš sjajne ali
> rade, pa ako vam zatrebaju ...
Trebaju meni. Šalji....
pedja
pascal.428vitez.koja,
-> #422, ilazarevic#=> Kako da ispraznim bafer tastature?
//na pocetku programa {$X+} - TP 6.0
Procedure ClearKBD;
begin
while keypressed do readkey
end;
pascal.429vvelisavljev,
-> #404, pedjak> Bilo je već od ranije:
Izvinjavam se. Hvala svima! Šljaka OK.
pascal.430peca.st,
-> #421, ilazarevic!-> U kojoj rezoluciji, po difoltu, radi TP
!-> program ako je BGI drajver EGAVGA?
640*480*16
P e C a