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 2 (dos) - FINESTRE.PAS

FINESTRE.PAS

Caricato da: David
Scarica il programma completo

  1. program gestione;
  2. (*$M 10000,10000,20000*)
  3.  
  4. (*
  5. Questa Š la versione 2 di "gestione a finestre(dos)".
  6.  
  7. I cambiamenti sono:
  8.  
  9. 1)si usano gli oggetti per fare tutte le finestre, che rende
  10. il codice pi— fluido e riutilizzabile sebbene occupi pi— spazio in memoria.
  11. Per fare cambiamenti alle finestre basta poco!
  12. Es.:
  13. -per aggiungere l'ombra alla finestra errore basta aggiungere nella
  14. procedure inizializza_finestre la procedura dai_ombra(per default Š senza ombra);
  15.  
  16.  
  17. 2)qualora la finestra vada oltre la fine dello schermo questa si posiziona
  18. automaticamente prima modificando il campo dell'oggetto posX quando si
  19. richiama una procedura che disegna.
  20.  
  21.  
  22. 3)l'ombra lascia intatto il colore testo e il carattere, come avviene
  23. per l'ambiente a finestre del turbo pascal.
  24.  
  25. La unit costanti Š invariata...
  26.  
  27.                          <Utilit…>
  28. Programma di gestione per eseguibili(senza mouse, solo con tastiera).
  29. Con le finestre si sceglie un eseguibile esterno e si fa partire premendo
  30. invio(se il file non viene trovato appare una finestra di messaggio).
  31. Per far questo viene usata la prodedura exec e si riserva una parte di
  32. memoria per gli eseguibili tramite la direttiva $M. Il programma Š strutturato
  33. in modo da poter cambiare colori, numero di finestre e di scelte(compresi gli
  34. eseguibili esterni all'applicazione) operando solo sulle costanti presenti
  35. nella unit costanti.
  36. Si scrive tutto direttamente in memoria video,
  37. sia le cornici che le stringhe, e si usa una lista di puntatori
  38. per memorizzare le schermate video.
  39.  
  40. Pu• tornare utile in vecchi sistemi sotto dos.
  41.  
  42.  
  43. PROGRAMMA SVILUPPATO DA DAVID(nome vero:Angelo)
  44. Programmatore per passione.
  45. Diploma in Delphi.
  46. *)
  47.  
  48.  
  49. uses crt,dos,mem_vid,punt_vid,fin_vid,costanti;
  50.  
  51. var
  52.   iterX,iterY:byte;
  53.   (*indicano la posizione delle scelte sulla finestra principale(iterX)
  54.   e sulle finestrelle(iterY)*)
  55.   fin_principale,fin_errore:finestra_vid;
  56.   finestrelle:array[1..num_finestre] of finestra_iter;
  57.  
  58.  
  59.  
  60. procedure cursore(ch:char);
  61. var
  62.   regs:registers;
  63. begin
  64.   regs.AH:=$01;
  65.   case ch of
  66.     'S':begin
  67.           regs.CH:=$20;
  68.           regs.CL:=$20;
  69.         end;
  70.     (*cursore spento*)
  71.     'G':begin
  72.           regs.CH:=$3;
  73.           regs.CL:=$7;
  74.         end;
  75.     (*cursore grosso*)
  76.     'P':begin
  77.           regs.CH:=$6;
  78.           regs.CL:=$7;
  79.         end;
  80.     (*cursore piccolo*)
  81.   end;
  82.   intr($10,regs);
  83. end;
  84.  
  85.  
  86.  
  87.  
  88.  
  89. procedure inizializza_finestre;
  90. var i:byte;
  91. begin
  92.   with fin_principale do
  93.     begin
  94.       init;
  95.       dai_corn(singola);
  96.       dai_posiz(1,2);
  97.       dai_lunghezza(78);
  98.       dai_righe(22);
  99.       dai_col_int(colori_principale[TC],colori_principale[TB]);
  100.       dai_col_corn(colori_principale[TC_bordo],colori_principale[TB_bordo]);
  101.     end;
  102.   for i:=1 to num_finestre do
  103.     with finestrelle[i] do
  104.       begin
  105.         init;
  106.         dai_posiz(posX_finestre[i],2);
  107.         dai_lunghezza(lunghezza_stringhe[i]);
  108.         dai_righe(dim_finestre[i]);
  109.         dai_ombra;
  110.         dai_col_corn(colori_finestra[tc2_bordo],colori_finestra[tb2_bordo]);
  111.         dai_col_int(colori_finestra[tc2], colori_finestra[tb2]);
  112.         dai_col_iter(colori_finestra[tc2_iter],colori_finestra[tb2_iter]);
  113.       end;
  114.   with fin_errore do
  115.     begin
  116.       init;
  117.       dai_posiz(19,12);
  118.       dai_lunghezza(40);
  119.       dai_righe(5);
  120.       dai_corn(singola);
  121.       dai_col_corn(colori_finestra[tc2_bordo],colori_finestra[tb2_bordo]);
  122.       dai_col_int(colori_finestra[tc2], colori_finestra[tb2]);
  123.     end;
  124.   finestrelle[iterX].dai_iterY(iterY);
  125. end;
  126.  
  127.  
  128.  
  129.  
  130. procedure fin_iterY_1;
  131. var
  132.   i:byte;
  133. begin
  134.   for i:=1 to num_finestre
  135.     do finestrelle[i].dai_iterY(1);
  136. end;
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143. procedure fai_finestrella(i:byte);
  144. var j:byte;
  145. begin
  146.   finestrelle[i].disegna;
  147.   for j:=1 to dim_finestre[i]
  148.     do finestrelle[i].s_st(j,finestra_stringhe[i,j]);
  149. end;
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159. procedure iter_princ;
  160. begin
  161.   str_vid_att(posX_finestre[iterX],1,length(fin_princ[iterX]),
  162.                                  colori_principale[TC_iter],
  163.                                  colori_principale[TB_iter]);
  164. end;
  165.  
  166.  
  167. procedure init;
  168. (*inizializza la schermata principale con apertura della prima finestrella*)
  169. var i:byte;
  170. begin
  171.   inizializza_finestre;
  172.   pulisci(1,1,80,1,colori_principale[TC],colori_principale[TB]);
  173.   fin_principale.disegna;
  174.   for i:=1 to num_finestre do
  175.     str_vid_car(posX_finestre[i],1,fin_princ[i]);
  176.   punt_avanti;
  177.   iter_princ;
  178.   fai_finestrella(iterX);
  179.   punt_avanti;
  180. end;
  181.  
  182.  
  183.  
  184.  
  185.  
  186. procedure iter;
  187. (*legge da tastiera, apre finestrelle e manda in esecuzione eseguibili*)
  188. var
  189.   ch:char;
  190.  
  191.  
  192.  
  193. procedure esegui;
  194. (*manda in esecuzione gli eseguibili se presenti*)
  195. var trovato_ext:boolean;
  196. {trova esterni}
  197.  
  198. procedure esterni;
  199. var i:byte;c:char;
  200.  
  201.  
  202. function errore:boolean;
  203. var d:DirStr; name1:NameStr; name2:ExtStr;
  204. begin
  205.   fsplit(exe_ext[i].prog,d,name1,name2);
  206.   if fsearch(name1+name2,d)=''
  207.     then errore:=true
  208.     else errore:=false;
  209. end;
  210.  
  211. procedure fai_finestra_errore;
  212. {disegna finestra errore per file eseguibile non trovato}
  213. var j,l:byte;
  214. begin
  215.   fin_errore.disegna;
  216.   fin_errore.s_st_c(1,exe_ext[i].prog);
  217.   fin_errore.s_st_c(3,'File non trovato');
  218.   fin_errore.s_st_c(5,'Premi un tasto per continuare...');
  219. end;
  220.  
  221.  
  222.  
  223. begin
  224.   for i:=1 to num_exe do
  225.     if (exe_ext[i].posX=iterX) and (exe_ext[i].posY=iterY) then
  226.       begin
  227.         if errore then
  228.           begin
  229.             punt_avanti;
  230.             fai_finestra_errore;
  231.             c:=readkey;
  232.             punt_indietro;
  233.             exit;
  234.           end;
  235.         punt_avanti;
  236.         cursore('P');
  237.         swapvectors;
  238.         exec(exe_ext[i].prog,exe_ext[i].param);
  239.         swapvectors;
  240.         cursore('S');
  241.         punt_indietro;
  242.         trovato_ext:=true;
  243.         break;
  244.       end;
  245. end;
  246.  
  247. begin
  248.   trovato_ext:=false;
  249.   esterni;
  250.   if trovato_ext then exit;
  251.   case iterX of
  252.     1:case iterY of
  253.         1:begin
  254.             TextBackground(0);
  255.             ClrScr;
  256.             cursore('P');
  257.             halt;
  258.           end;
  259.       end;
  260.     5:begin
  261.         (*si modificano le scelte dei colori dall'eseguibile. per farlo
  262.         si ricorre alla ricorsione della procedure iter*)
  263.         azzera_punt_video;
  264.         scelta_colori(iterY);
  265.         init;
  266.         iter;
  267.        end;
  268.    end;
  269. end;
  270.  
  271.  
  272.  
  273. begin
  274.   repeat
  275.     ch:=readkey;
  276.     if ch=#13 then esegui;
  277.     if ch=#0
  278.       then begin
  279.              ch:=readkey;
  280.              case ch of
  281.                #75:begin
  282.                      iterY:=1; iterX:=iterX-1;
  283.                      punt_indietro;
  284.                      if iterX=0 then iterX:=num_finestre;
  285.                      iter_princ;
  286.                      fin_iterY_1;
  287.                      fai_finestrella(iterX);
  288.                      punt_avanti;
  289.                    end;
  290.                #77:begin
  291.                      iterY:=1;  iterX:=iterX+1;
  292.                      punt_indietro;
  293.                      if iterX=num_finestre+1 then iterX:=1;;
  294.                      iter_princ;
  295.                      fin_iterY_1;
  296.                      fai_finestrella(iterX);
  297.                      punt_avanti;
  298.                    end;
  299.                #72:begin
  300.                      iterY:=iterY-1;
  301.                      if iterY=0 then iterY:=dim_finestre[iterX];
  302.                      finestrelle[iterX].cambia_iterY(iterY);
  303.                      corrente^.schermo:=video^;
  304.                    end;
  305.                #80:begin
  306.                      iterY:=iterY+1;
  307.                      if iterY=dim_finestre[iterX]+1 then iterY:=1;
  308.                      finestrelle[iterX].cambia_iterY(iterY);
  309.                      corrente^.schermo:=video^;
  310.                    end;
  311.              end;
  312.          end;
  313.   until ch=#216;
  314. end;
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321. begin
  322.   iterX:=1;
  323.   iterY:=1;
  324.   if seg_vid=$B800
  325.     then scelta_colori(1)
  326.     else scelta_colori(3);
  327.   cursore('S');
  328.   init;
  329.   iter;
  330.   cursore('P');
  331. end.
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.