Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Gestione a finestre (dos) - FINESTRE.PAS

FINESTRE.PAS

Caricato da: David
Scarica il programma completo

  1. program gestione;
  2. (*$M 10000,10000,20000*)
  3.  
  4. (*
  5. Questo Š un programma di gestione per eseguibili(senza mouse, solo con tastiera).
  6. Con le finestre si sceglie un eseguibile esterno e si fa partire premendo
  7. invio(se il file non viene trovato appare una finestra di messaggio).
  8. Per far questo viene usata la prodedura exec e si riserva una parte di
  9. memoria per gli eseguibili tramite la direttiva $M. Il programma Š strutturato
  10. in modo da poter cambiare colori, numero di finestre e di scelte(compresi gli
  11. eseguibili esterni all'applicazione) operando solo sulle costanti presenti nella unit
  12. costanti.
  13. Si scrive tutto direttamente in memoria video,
  14. sia le cornici che le stringhe, e si usa una lista di puntatori
  15. per memorizzare le schermate video.
  16.  
  17. Pu• tornare utile in vecchi sistemi sotto dos.
  18.  
  19.  
  20. PROGRAMMA SVILUPPATO DA DAVID(nome vero:Angelo)
  21. Programmatore per passione.
  22. Diploma in Delphi.
  23. *)
  24.  
  25.  
  26. uses crt,dos,stringhe,costanti;
  27.  
  28. var
  29.   iterX,iterY:byte;
  30.   (*indicano la posizione delle scelte sulla finestra principale(iterX)
  31.   e sulle finestrelle(iterY)*)
  32.  
  33.  
  34. procedure FinPrincipale(iterX:byte;fai_cornice:boolean);
  35. (*disegna la finestra principale, ossia quella sotto le finestrelle*)
  36. var
  37.   i:byte;
  38. begin
  39.   if fai_cornice=true
  40.     then cornice(1,80,2,25,colori_principale[TC_bordo],
  41.          colori_principale[TB_bordo],'Ú','¿','À','Ù','Ä','³');
  42.   if iterX=0
  43.     then
  44.       for i:=1 to num_finestre do
  45.         str_vid(posX_finestre[i],1,fin_princ[i],
  46.                      colori_principale[TC],colori_principale[TB])
  47.     else str_vid(posX_finestre[iterX],1,fin_princ[iterX],
  48.                      colori_principale[TC_iter],colori_principale[TB_iter])
  49. end;
  50.  
  51.  
  52.  
  53.  
  54. procedure finestre(fai_cornice:boolean);
  55. (*disegna la finestrella scelta*)
  56. var i:byte;
  57.  
  58. procedure fai_ombra;
  59. var i:byte;
  60. begin
  61.   for i:=posX_finestre[iterX]+1 to
  62.          posX_finestre[iterX] + lunghezza_stringhe[iterX] + 2  do
  63.     fissa_car_col(i,4+dim_finestre[iterX],' ',0,colori_finestra[TB2_ombra]);
  64.   for i:=3 to 4+dim_finestre[iterX] do
  65.     fissa_car_col(posX_finestre[iterX] + lunghezza_stringhe[iterX] + 2,i,' ',0,colori_finestra[TB2_ombra]);
  66. end;
  67.  
  68.  
  69. begin
  70.   if fai_cornice=true
  71.     then begin
  72.            fai_ombra;
  73.            cornice(posX_finestre[iterX],posX_finestre[iterX]+
  74.                    lunghezza_stringhe[iterX]+1,2,3+dim_finestre[iterX],
  75.                    colori_finestra[TC2_bordo],colori_finestra[TB2_bordo],
  76.                    'É','»','È','¼','Í','º');
  77.          end;
  78.   for i:=1 to dim_finestre[iterX] do
  79.     if i=iterY then str_vid(posX_finestre[iterX]+1,i+2,
  80.                             finestra_stringhe[iterX,i],
  81.                             colori_finestra[TC2_iter],
  82.                             colori_finestra[TB2_iter])
  83.                else str_vid(posX_finestre[iterX]+1,i+2,
  84.                             finestra_stringhe[iterX,i],
  85.                             colori_finestra[TC2],colori_finestra[TB2]);
  86. end;
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93. procedure init;
  94. (*inizializza la schermata principale con apertura della prima finestrella*)
  95. begin
  96.   pulisci(1,1,80,25,colori_principale[TC],colori_principale[TB]);
  97.   FinPrincipale(0,true);
  98.   punt_avanti;
  99.   FinPrincipale(iterX,false);
  100.   finestre(true);
  101.   punt_avanti;
  102. end;
  103.  
  104.  
  105.  
  106.  
  107.  
  108. procedure iter;
  109. (*legge da tastiera, apre finestrelle e manda in esecuzione eseguibili*)
  110. var
  111.   ch:char;
  112.  
  113.  
  114.  
  115. procedure esegui;
  116. (*manda in esecuzione gli eseguibili se presenti*)
  117. var trovato_ext:boolean;
  118. {trova esterni}
  119.  
  120. procedure esterni;
  121. var i:byte;
  122.  
  123.  
  124. function errore:boolean;
  125. var d:DirStr; name1:NameStr; name2:ExtStr;
  126. begin
  127.   fsplit(exe_ext[i].prog,d,name1,name2);
  128.   if fsearch(name1+name2,d)=''
  129.     then errore:=true
  130.     else errore:=false;
  131. end;
  132.  
  133. procedure finestra_errore;
  134. {disegna finestra errore per file eseguibile non trovato}
  135. var j,l:byte;
  136. begin
  137.   l:=length(exe_ext[i].prog);
  138.   cornice(19,61,10,15,colori_finestra[TC2_bordo],
  139.     colori_finestra[TB2_bordo],'É','»','È','¼','Í','º');
  140.   pulisci(20,11,60,14,colori_finestra[TC2],colori_finestra[TB2]);
  141.   j:=(40-l) div 2;
  142.   str_vid(20+j,11,exe_ext[i].prog,colori_finestra[TC2],colori_finestra[TB2]);
  143.   j:=(40-16) div 2;
  144.   str_vid(20+j,13,'File non trovato',colori_finestra[TC2],colori_finestra[TB2]);
  145.   j:=(40-32) div 2;
  146.   str_vid(20+j,14,'Premi un tasto per continuare...',colori_finestra[TC2],colori_finestra[TB2]);
  147. end;
  148.  
  149.  
  150.  
  151. begin
  152.   for i:=1 to num_exe do
  153.     if (exe_ext[i].posX=iterX) and (exe_ext[i].posY=iterY) then
  154.       begin
  155.         if errore then
  156.           begin
  157.             punt_avanti;
  158.             finestra_errore;
  159.             ch:=readkey;
  160.             punt_indietro;
  161.             exit;
  162.           end;
  163.         punt_avanti;
  164.         cursore('P');
  165.         swapvectors;
  166.         exec(exe_ext[i].prog,exe_ext[i].param);
  167.         swapvectors;
  168.         cursore('S');
  169.         punt_indietro;
  170.         trovato_ext:=true;
  171.         break;
  172.       end;
  173. end;
  174.  
  175. begin
  176.   trovato_ext:=false;
  177.   esterni;
  178.   if trovato_ext then exit;
  179.   case iterX of
  180.     1:case iterY of
  181.         1:begin
  182.             TextBackground(0);
  183.             ClrScr;
  184.             cursore('P');
  185.             halt;
  186.           end;
  187.       end;
  188.     5:begin
  189.         (*si modificano le scelte dei colori dall'eseguibile. per farlo
  190.         si ricorre alla ricorsione della procedure iter*)
  191.         azzera_punt_video;
  192.         scelta_colori(iterY);
  193.         init;
  194.         iter;
  195.        end;
  196.    end;
  197. end;
  198.  
  199.  
  200.  
  201. begin
  202.   repeat
  203.     ch:=readkey;
  204.     if ch=#13 then esegui;
  205.     if ch=#0
  206.       then begin
  207.              ch:=readkey;
  208.              case ch of
  209.                #75:begin
  210.                      iterY:=1; iterX:=iterX-1;
  211.                      punt_indietro;
  212.                      if iterX=0 then iterX:=num_finestre;
  213.                      FinPrincipale(iterX,false);
  214.                      finestre(true);
  215.                      punt_avanti;
  216.                    end;
  217.                #77:begin
  218.                      iterY:=1;  iterX:=iterX+1;
  219.                      punt_indietro;
  220.                      if iterX=num_finestre+1 then iterX:=1;;
  221.                      FinPrincipale(iterX,false);
  222.                      finestre(true);
  223.                      punt_avanti;
  224.                    end;
  225.                #72:begin
  226.                      iterY:=iterY-1;
  227.                      if iterY=0 then iterY:=dim_finestre[iterX];
  228.                      finestre(false);
  229.                      corrente^.schermo:=video^;
  230.                    end;
  231.                #80:begin
  232.                      iterY:=iterY+1;
  233.                      if iterY=dim_finestre[iterX]+1 then iterY:=1;
  234.                      finestre(false);
  235.                      corrente^.schermo:=video^;
  236.                    end;
  237.              end;
  238.          end;
  239.   until ch=#216;
  240. end;
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247. begin
  248.   iterX:=1;
  249.   iterY:=1;
  250.   if seg_vid=$B800
  251.     then scelta_colori(1)
  252.     else scelta_colori(3);
  253.   cursore('S');
  254.   init;
  255.   iter;
  256.   cursore('P');
  257. end.
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.