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) - STRINGHE.PAS

STRINGHE.PAS

Caricato da: David
Scarica il programma completo

  1. unit stringhe;
  2.  
  3.  
  4.      (**********************)  interface  (****************************)
  5. uses crt,dos;
  6. TYPE
  7.   PSchermo=^TipoSchermo;
  8.   TipoSchermo=array[1..25,1..80] of record
  9.       ch:char;
  10.       at:byte;
  11.       end;
  12.   (*array identico alla memoria video*)
  13.   Pfinestra=^finestra;
  14.   finestra=record
  15.     schermo:TipoSchermo;
  16.     prox,prec:Pfinestra;
  17.     end;
  18.   (*lista doppia che andr… a memorizzare le schermate*)
  19.   string20=string[20];
  20.   STRING80=STRING[80];
  21.  
  22. var
  23.   video:PSchermo;
  24.   seg_vid:word;
  25.   corrente,precedente,successivo,ultimo,primo:Pfinestra;
  26.  
  27. procedure cursore(ch:char);
  28. (*spegne e attiva il cursore*)
  29. procedure fissa_car_col(x,y:byte;ch:char;fg,bg:byte);
  30. (*fissa carattere,colore testo e colore sfondo in una word della memoria
  31. video *)
  32. procedure str_vid(x,y:byte;str:string80;fg,bg:byte);
  33. (*fissa una stringa con colore testo e sfondo direttamente in
  34. memoria video*)
  35. procedure pulisci(x1,y1,x2,y2,colore_testo,colore_sfondo:byte);
  36. (*riempie una finestra con spazi ' ' in memoria video, fissando i colori
  37. di testo e sfondo*)
  38. procedure cornice(x1,x2,y1,y2,fg,bg:byte;s1,s2,s3,s4,s5,s6:char);
  39. (*disegna la cornice alle finestre, fissando i colori di sfondo e testo*)
  40. procedure punt_avanti;
  41. (*memorizza ultima schermata*)
  42. procedure punt_indietro;
  43. (*ritorno alla schermata precedente*)
  44. procedure azzera_punt_video;
  45. (*azzera lista puntatori*)
  46.  
  47.  
  48.  
  49.  
  50.    (********************) IMPLEMENTATION (********************)
  51.  
  52.  
  53.  
  54. procedure cursore(ch:char);
  55. var
  56.   regs:registers;
  57. begin
  58.   regs.AH:=$01;
  59.   case ch of
  60.     'S':begin
  61.           regs.CH:=$20;
  62.           regs.CL:=$20;
  63.         end;
  64.     (*cursore spento*)
  65.     'G':begin
  66.           regs.CH:=$3;
  67.           regs.CL:=$7;
  68.         end;
  69.     (*cursore grosso*)
  70.     'P':begin
  71.           regs.CH:=$6;
  72.           regs.CL:=$7;
  73.         end;
  74.     (*cursore piccolo*)
  75.   end;
  76.   intr($10,regs);
  77. end;
  78.  
  79.                            {*************}
  80.  
  81. procedure fissa_car_col(x,y:byte;ch:char;fg,bg:byte);
  82. var
  83.   w:word;
  84.   attrib:word;
  85. begin
  86.   w:=((y-1)*80+(x-1))*2;
  87.   attrib:=(bg shl 4)+ fg;
  88.   memW[seg_vid:W]:=(attrib shl 8)+ ord(ch);
  89. end;
  90.  
  91.  
  92.                            {***************}
  93.  
  94. procedure str_vid(x,y:byte;str:string80;fg,bg:byte);
  95. var
  96.   i:byte;
  97. begin
  98.   if str='' then exit;
  99.   for i:=1 to (length(str)) do fissa_car_col(x+i-1,y,str[i],fg,bg);
  100. end;
  101.  
  102.                            {***************}
  103.  
  104. procedure pulisci(x1,y1,x2,y2,colore_testo,colore_sfondo:byte);
  105. var
  106.   i,j:byte;
  107. begin
  108.   for i:=y1 to y2
  109.     do for j:=x1 to x2
  110.          do fissa_car_col(j,i,' ',colore_testo,colore_sfondo);
  111. end;
  112.  
  113.                        {*******************}
  114.  
  115. procedure cornice(x1,x2,y1,y2,fg,bg:byte;s1,s2,s3,s4,s5,s6:char);
  116. var
  117.   i:byte;
  118. begin
  119.   for i:=x1+1 to x2-1 do
  120.     begin
  121.       fissa_car_col(i,y1,s5,fg,bg);
  122.       fissa_car_col(i,y2,s5,fg,bg);
  123.     end;
  124.   for i:=y1+1 to y2-1 do
  125.     begin
  126.       fissa_car_col(x1,i,s6,fg,bg);
  127.       fissa_car_col(x2,i,s6,fg,bg);
  128.     end;
  129.   fissa_car_col(x1,y1,s1,fg,bg);
  130.   fissa_car_col(x2,y1,s2,fg,bg);
  131.   fissa_car_col(x1,y2,s3,fg,bg);
  132.   fissa_car_col(x2,y2,s4,fg,bg);
  133. end;
  134.  
  135.                        {*******************}
  136.  
  137. procedure punt_avanti;
  138. begin
  139.   if primo=nil
  140.     then begin
  141.            new(corrente);
  142.            primo:=corrente;
  143.            ultimo:=corrente;
  144.            corrente^.prox:=nil;
  145.            corrente^.schermo:=video^;
  146.          end
  147.     else begin
  148.            precedente:=corrente;
  149.            new(corrente);
  150.            precedente^.prox:=corrente;
  151.            ultimo:=corrente;
  152.            corrente^.prox:=nil;
  153.            ultimo^.prec:=precedente;
  154.            corrente^.schermo:=video^;
  155.          end;
  156. end;
  157.  
  158.  
  159.  
  160.  
  161. procedure punt_indietro;
  162. begin
  163.   if ultimo <> primo
  164.     then begin
  165.            corrente:=ultimo;
  166.            ultimo:=corrente^.prec;
  167.            dispose(corrente);
  168.            corrente:=ultimo;
  169.            video^:=corrente^.schermo;
  170.          end;
  171. end;
  172.  
  173.  
  174.  
  175. procedure azzera_punt_video;
  176. begin
  177.   if primo=nil then exit;
  178.   corrente:=primo;
  179.   while corrente<>nil
  180.      do begin
  181.           precedente:=corrente^.prox;
  182.           dispose(corrente);
  183.           corrente:=precedente;
  184.         end;
  185.   primo:=nil;
  186. end;
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193. begin
  194.   if mem[$0000:$0449]=7
  195.     then seg_vid:=$B000
  196.     else seg_vid:=$B800;
  197.   {video bianco e nero o colori}
  198.   new(video);
  199.   video:=ptr(seg_vid,$0000);
  200.   primo:=nil;
  201. end.