program gestione;
(*$M 10000,10000,20000*)
(*
Questo Š un 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,stringhe,costanti;
var
iterX,iterY:byte;
(*indicano la posizione delle scelte sulla finestra principale(iterX)
e sulle finestrelle(iterY)*)
procedure FinPrincipale(iterX:byte;fai_cornice:boolean);
(*disegna la finestra principale, ossia quella sotto le finestrelle*)
var
i:byte;
begin
if fai_cornice=true
then cornice(1,80,2,25,colori_principale[TC_bordo],
colori_principale[TB_bordo],'Ú','¿','À','Ù','Ä','³');
if iterX=0
then
for i:=1 to num_finestre do
str_vid(posX_finestre[i],1,fin_princ[i],
colori_principale[TC],colori_principale[TB])
else str_vid(posX_finestre[iterX],1,fin_princ[iterX],
colori_principale[TC_iter],colori_principale[TB_iter])
end;
procedure finestre(fai_cornice:boolean);
(*disegna la finestrella scelta*)
var i:byte;
procedure fai_ombra;
var i:byte;
begin
for i:=posX_finestre[iterX]+1 to
posX_finestre[iterX] + lunghezza_stringhe[iterX] + 2 do
fissa_car_col(i,4+dim_finestre[iterX],' ',0,colori_finestra[TB2_ombra]);
for i:=3 to 4+dim_finestre[iterX] do
fissa_car_col(posX_finestre[iterX] + lunghezza_stringhe[iterX] + 2,i,' ',0,colori_finestra[TB2_ombra]);
end;
begin
if fai_cornice=true
then begin
fai_ombra;
cornice(posX_finestre[iterX],posX_finestre[iterX]+
lunghezza_stringhe[iterX]+1,2,3+dim_finestre[iterX],
colori_finestra[TC2_bordo],colori_finestra[TB2_bordo],
'É','»','È','¼','Í','º');
end;
for i:=1 to dim_finestre[iterX] do
if i=iterY then str_vid(posX_finestre[iterX]+1,i+2,
finestra_stringhe[iterX,i],
colori_finestra[TC2_iter],
colori_finestra[TB2_iter])
else str_vid(posX_finestre[iterX]+1,i+2,
finestra_stringhe[iterX,i],
colori_finestra[TC2],colori_finestra[TB2]);
end;
procedure init;
(*inizializza la schermata principale con apertura della prima finestrella*)
begin
pulisci(1,1,80,25,colori_principale[TC],colori_principale[TB]);
FinPrincipale(0,true);
punt_avanti;
FinPrincipale(iterX,false);
finestre(true);
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;
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 finestra_errore;
{disegna finestra errore per file eseguibile non trovato}
var j,l:byte;
begin
l:=length(exe_ext[i].prog);
cornice(19,61,10,15,colori_finestra[TC2_bordo],
colori_finestra[TB2_bordo],'É','»','È','¼','Í','º');
pulisci(20,11,60,14,colori_finestra[TC2],colori_finestra[TB2]);
j:=(40-l) div 2;
str_vid(20+j,11,exe_ext[i].prog,colori_finestra[TC2],colori_finestra[TB2]);
j:=(40-16) div 2;
str_vid(20+j,13,'File non trovato',colori_finestra[TC2],colori_finestra[TB2]);
j:=(40-32) div 2;
str_vid(20+j,14,'Premi un tasto per continuare...',colori_finestra[TC2],colori_finestra[TB2]);
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;
finestra_errore;
ch:=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;
FinPrincipale(iterX,false);
finestre(true);
punt_avanti;
end;
#77:begin
iterY:=1; iterX:=iterX+1;
punt_indietro;
if iterX=num_finestre+1 then iterX:=1;;
FinPrincipale(iterX,false);
finestre(true);
punt_avanti;
end;
#72:begin
iterY:=iterY-1;
if iterY=0 then iterY:=dim_finestre[iterX];
finestre(false);
corrente^.schermo:=video^;
end;
#80:begin
iterY:=iterY+1;
if iterY=dim_finestre[iterX]+1 then iterY:=1;
finestre(false);
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.