program gestione;
(*$M 10000,10000,20000*)
(*
Questa Š la versione 2 di "gestione a finestre(dos)".
I cambiamenti sono:
1)si usano gli oggetti per fare tutte le finestre, che rende
il codice pi— fluido e riutilizzabile sebbene occupi pi— spazio in memoria.
Per fare cambiamenti alle finestre basta poco!
Es.:
-per aggiungere l'ombra alla finestra errore basta aggiungere nella
procedure inizializza_finestre la procedura dai_ombra(per default Š senza ombra);
2)qualora la finestra vada oltre la fine dello schermo questa si posiziona
automaticamente prima modificando il campo dell'oggetto posX quando si
richiama una procedura che disegna.
3)l'ombra lascia intatto il colore testo e il carattere, come avviene
per l'ambiente a finestre del turbo pascal.
La unit costanti Š invariata...
<Utilit…>
Programma di gestione per eseguibili(senza mouse, solo con tastiera).
Con le finestre si sceglie un eseguibile esterno e si fa partire premendo
invio(se il file non viene trovato appare una finestra di messaggio).
Per far questo viene usata la prodedura exec e si riserva una parte di
memoria per gli eseguibili tramite la direttiva $M. Il programma Š strutturato
in modo da poter cambiare colori, numero di finestre e di scelte(compresi gli
eseguibili esterni all'applicazione) operando solo sulle costanti presenti
nella unit costanti.
Si scrive tutto direttamente in memoria video,
sia le cornici che le stringhe, e si usa una lista di puntatori
per memorizzare le schermate video.
Pu• tornare utile in vecchi sistemi sotto dos.
PROGRAMMA SVILUPPATO DA DAVID(nome vero:Angelo)
Programmatore per passione.
Diploma in Delphi.
*)
uses crt,dos,mem_vid,punt_vid,fin_vid,costanti;
var
iterX,iterY:byte;
(*indicano la posizione delle scelte sulla finestra principale(iterX)
e sulle finestrelle(iterY)*)
fin_principale,fin_errore:finestra_vid;
finestrelle:array[1..num_finestre] of finestra_iter;
procedure cursore(ch:char);
var
regs:registers;
begin
regs.AH:=$01;
case ch of
'S':begin
regs.CH:=$20;
regs.CL:=$20;
end;
(*cursore spento*)
'G':begin
regs.CH:=$3;
regs.CL:=$7;
end;
(*cursore grosso*)
'P':begin
regs.CH:=$6;
regs.CL:=$7;
end;
(*cursore piccolo*)
end;
intr($10,regs);
end;
procedure inizializza_finestre;
var i:byte;
begin
with fin_principale do
begin
init;
dai_corn(singola);
dai_posiz(1,2);
dai_lunghezza(78);
dai_righe(22);
dai_col_int(colori_principale[TC],colori_principale[TB]);
dai_col_corn(colori_principale[TC_bordo],colori_principale[TB_bordo]);
end;
for i:=1 to num_finestre do
with finestrelle[i] do
begin
init;
dai_posiz(posX_finestre[i],2);
dai_lunghezza(lunghezza_stringhe[i]);
dai_righe(dim_finestre[i]);
dai_ombra;
dai_col_corn(colori_finestra[tc2_bordo],colori_finestra[tb2_bordo]);
dai_col_int(colori_finestra[tc2], colori_finestra[tb2]);
dai_col_iter(colori_finestra[tc2_iter],colori_finestra[tb2_iter]);
end;
with fin_errore do
begin
init;
dai_posiz(19,12);
dai_lunghezza(40);
dai_righe(5);
dai_corn(singola);
dai_col_corn(colori_finestra[tc2_bordo],colori_finestra[tb2_bordo]);
dai_col_int(colori_finestra[tc2], colori_finestra[tb2]);
end;
finestrelle[iterX].dai_iterY(iterY);
end;
procedure fin_iterY_1;
var
i:byte;
begin
for i:=1 to num_finestre
do finestrelle[i].dai_iterY(1);
end;
procedure fai_finestrella(i:byte);
var j:byte;
begin
finestrelle[i].disegna;
for j:=1 to dim_finestre[i]
do finestrelle[i].s_st(j,finestra_stringhe[i,j]);
end;
procedure iter_princ;
begin
str_vid_att(posX_finestre[iterX],1,length(fin_princ[iterX]),
colori_principale[TC_iter],
colori_principale[TB_iter]);
end;
procedure init;
(*inizializza la schermata principale con apertura della prima finestrella*)
var i:byte;
begin
inizializza_finestre;
pulisci(1,1,80,1,colori_principale[TC],colori_principale[TB]);
fin_principale.disegna;
for i:=1 to num_finestre do
str_vid_car(posX_finestre[i],1,fin_princ[i]);
punt_avanti;
iter_princ;
fai_finestrella(iterX);
punt_avanti;
end;
procedure iter;
(*legge da tastiera, apre finestrelle e manda in esecuzione eseguibili*)
var
ch:char;
procedure esegui;
(*manda in esecuzione gli eseguibili se presenti*)
var trovato_ext:boolean;
{trova esterni}
procedure esterni;
var i:byte;c:char;
function errore:boolean;
var d:DirStr; name1:NameStr; name2:ExtStr;
begin
fsplit(exe_ext[i].prog,d,name1,name2);
if fsearch(name1+name2,d)=''
then errore:=true
else errore:=false;
end;
procedure fai_finestra_errore;
{disegna finestra errore per file eseguibile non trovato}
var j,l:byte;
begin
fin_errore.disegna;
fin_errore.s_st_c(1,exe_ext[i].prog);
fin_errore.s_st_c(3,'File non trovato');
fin_errore.s_st_c(5,'Premi un tasto per continuare...');
end;
begin
for i:=1 to num_exe do
if (exe_ext[i].posX=iterX) and (exe_ext[i].posY=iterY) then
begin
if errore then
begin
punt_avanti;
fai_finestra_errore;
c:=readkey;
punt_indietro;
exit;
end;
punt_avanti;
cursore('P');
swapvectors;
exec(exe_ext[i].prog,exe_ext[i].param);
swapvectors;
cursore('S');
punt_indietro;
trovato_ext:=true;
break;
end;
end;
begin
trovato_ext:=false;
esterni;
if trovato_ext then exit;
case iterX of
1:case iterY of
1:begin
TextBackground(0);
ClrScr;
cursore('P');
halt;
end;
end;
5:begin
(*si modificano le scelte dei colori dall'eseguibile. per farlo
si ricorre alla ricorsione della procedure iter*)
azzera_punt_video;
scelta_colori(iterY);
init;
iter;
end;
end;
end;
begin
repeat
ch:=readkey;
if ch=#13 then esegui;
if ch=#0
then begin
ch:=readkey;
case ch of
#75:begin
iterY:=1; iterX:=iterX-1;
punt_indietro;
if iterX=0 then iterX:=num_finestre;
iter_princ;
fin_iterY_1;
fai_finestrella(iterX);
punt_avanti;
end;
#77:begin
iterY:=1; iterX:=iterX+1;
punt_indietro;
if iterX=num_finestre+1 then iterX:=1;;
iter_princ;
fin_iterY_1;
fai_finestrella(iterX);
punt_avanti;
end;
#72:begin
iterY:=iterY-1;
if iterY=0 then iterY:=dim_finestre[iterX];
finestrelle[iterX].cambia_iterY(iterY);
corrente^.schermo:=video^;
end;
#80:begin
iterY:=iterY+1;
if iterY=dim_finestre[iterX]+1 then iterY:=1;
finestrelle[iterX].cambia_iterY(iterY);
corrente^.schermo:=video^;
end;
end;
end;
until ch=#216;
end;
begin
iterX:=1;
iterY:=1;
if seg_vid=$B800
then scelta_colori(1)
else scelta_colori(3);
cursore('S');
init;
iter;
cursore('P');
end.