{**********************************************************************
Copyright (C) 2009 by Salvatore Licciardi

Web http://www.webalice.it/turylicciardi    eMail turylicciardi@tiscali.it

 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, version 3 of the License.
 This program is distributed in the hope  that it will be useful , but WITHOUT
 ANY WARRANTY without even the implied warranty  of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details. You should have received
 a copy of the GNU General Public License along with this program. If not, see
 http://www.gnu.org/licenses/

 **********************************************************************}

program EdiTury;
// Editor, versione 3.30 per Dos 32 bit, Win32 & 64 bit, OS/2 32 bit, Linux 32 bit
// Richiede FPC 2.0.0
{$M 1000000,4097152,4097152}  // Impostazioni per la memoria: stack size, heapmin, heapmax
{$MODE ObjFpc}
{$GOTO On}
{$MACRO On}
{$H+}  // longstring

{$ifdef Win32}
 {$APPTYPE Console}
{$endif}

{$ifdef Win64}
 {$define Win32}
{$endif}
{$ifdef Go32v2}
 {$define TxtCrt}
{$endif}
{$ifdef Win32}
 {$define TxtVideo}
{$endif}
{$ifdef OS2}
 {$define TxtVideo}
{$endif}
{$ifdef Linux}
 {$define TxtCrt}
{$endif}

uses {$ifdef Go32v2}
      MsMouse,
      {$else}
      Mouse,
     {$endif}
     {$ifdef Go32v2}
      Go32,
     {$endif}
     Crt,Dos,SysUtils,Strings,Math,Video,Keyboard,
     {$ifdef TxtVideo}
      TxtVideo,
     {$endif}
     Type_var,T_Edit1x,T_Edit20,T_Edit24,T_Edit30,
     Altro32,Altro32D,LDU_PCH;

var ignora_ini:BOOLEAN;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

function Shift():boolean;
begin
shift:=(pos('SHIFT',upcase(ks))>0);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Pre_start_1; // update ver 2.50 , 2.69
var i,ii:word;
    lbin_:integer;
    stringa,coda,stringa_normale,coda_normale:string;
//  opzioni_da_terminale[1]='0' sempre, perche' non serve piu': era /<nn>
begin
{$ifdef Go32v2}
 dosmemget($B800, 0, save_screen, sizeof(save_screen));
 dosmemget($B800, 0, save_shell, sizeof(save_shell));
 save_shell_x:=whereX;
 save_shell_y:=whereY;
 old_x:=wherex;
 old_y:=wherey;
 old_textmode:=LastMode;
{$endif}
initmouse;
Initkeyboard;
topo:={$ifdef Go32v2}MouseFound{$else}(DetectMouse>0){$endif};
{$I-}  // update 2.45
getdir(0,start_dir_prompt);
{$I+}
if IOResult<>0 then;
forza_apertura:=0;  // ver 2.50
opzioni_da_terminale:='00000000000'; // maschera: se =1, opzione presente nella riga di comando
(* opzioni_da_terminale: posizione carattere
1= /<nn> non piu' usato, ma da non usare
2= /SF
3= /SL
4= /BACKUP
5= /CL
6= /US
7= /DM
8= /D0 /D1 /D2
9= /P=
10= /N
11= /MEM  (ver 2.88)  *)
Files_da_Terminale.init;
stampante.init;
Lingue.Init;
Tot:=0;
apri_file_caricati:=true;
selezione_quadrata:=false;
lunghezza_riga:=254; // 254+ il primo carattere che e' sempre #13 =255
delimitatore:=0;     // lineending
next_length_TXT:=254;
next_length_ESA:=79;
mem_automatica:=false;  // ver 2.88
binario:=false;
CL:=false;
sl:=false;
BK:=false;
unoS:=false;
sfinal:=true;
ignora_ini:=false;
mancino:=false;
for i:=1 to ParamCount do
  begin
  stringa:={UpCase}(ParamStr(i));
  stringa_normale:=stringa;
  stringa:=UpCase(stringa);
  // non fare  stringa:=UpCase(ParamStr(i));  // crash anomalo in DOS

  while stringa<>'' do
    begin
    Testa_Coda(stringa,opz,stringa,coda);
    Testa_Coda(stringa_normale,opz,stringa_normale,coda_normale);
    if stringa=opz+'DEF' then
                      begin   // formato di default, ignora i precedenti /ESA /ASK /TXT
                      forza_apertura:=0;
                      binario:=false;
                      end else
    if stringa=opz+'ESA' then
                      begin      {formato esadecimale}
                      forza_apertura:=2;
                      binario:=true;
                      end else
    if stringa=opz+'TXT' then
                      begin      {formato testo}
                      forza_apertura:=1;
                      binario:=false;
                      end else
    if stringa=opz+'ASK' then forza_apertura:=3 else // chiede Txt o Esa
    if stringa=opz+'I' then ignora_ini:=true else
    if stringa=opz+inv+'I' then ignora_ini:=false else
    if stringa=opz+'DM' then        {abilita/disabilita la gestione del mouse}
                     begin
                     {$ifdef Go32v2}
                     topo:=false;
                     opzioni_da_terminale[7]:='1';
                     {$ENDIF}
                     end else
    if stringa=opz+inv+'DM' then
                     begin
                     topo:={$ifdef Go32v2}Mousefound{$else}(DetectMouse>0){$endif};
                     opzioni_da_terminale[7]:='1';
                     end else
    if stringa=opz+'N' then
                     begin
                     opzioni_da_terminale[10]:='1';
                     apri_file_caricati:=false;
                     end else
    if stringa=opz+inv+'N' then
                     begin
                     opzioni_da_terminale[10]:='1';
                     apri_file_caricati:=true;
                     end else
    if stringa=opz+'MEM' then      // ver 2.88
                     begin
                     opzioni_da_terminale[11]:='1';
                     mem_automatica:=true;
                     end else
    if stringa=opz+inv+'MEM' then  // ver 2.88
                     begin
                     opzioni_da_terminale[11]:='1';
                     mem_automatica:=false;
                     end else
    if stringa=opz+'SF' then
                     begin
                     opzioni_da_terminale[2]:='1';
                     sfinal:=true;
                     end else
    if stringa=opz+inv+'SF' then  {salva anche spazi finali}
                     begin
                     opzioni_da_terminale[2]:='1';
                     sfinal:=false;
                     end else
    if stringa=opz+'BACKUP' then
                     begin
                     opzioni_da_terminale[4]:='1';
                     BK:=true;
                     end else
    if stringa=opz+inv+'BACKUP' then  {backup in salva}
                     begin
                     opzioni_da_terminale[4]:='1';
                     BK:=false;
                     end else
    if stringa=opz+'SL' then  {sola lettura}
                     begin
                     opzioni_da_terminale[3]:='1';
                     SL:=true;
                     end else
    if stringa=opz+inv+'SL' then
                     begin
                     opzioni_da_terminale[3]:='1';
                     SL:=false;
                     end else
    if stringa=opz+'CL' then
                     begin
                     opzioni_da_terminale[5]:='1';
                     CL:=true;
                     end else
    if stringa=opz+inv+'CL' then  {cursore libero}
                     begin
                     opzioni_da_terminale[5]:='1';
                     CL:=false;
                     end else
    if stringa=opz+'US' then
                     begin
                     opzioni_da_terminale[6]:='1';
                     unoS:=true;
                     end else
    if stringa=opz+inv+'US' then  {uno spazio fra parole}
                     begin
                     opzioni_da_terminale[6]:='1';
                     unoS:=false;
                     end else
    if stringa=opz+'D0' then  // delimitatore
                     begin
                     opzioni_da_terminale[8]:='1';
                     delimitatore:=0 // lineending
                     end else
    if stringa=opz+'D1' then  // delimitatore
                     begin
                     opzioni_da_terminale[8]:='1';
                     delimitatore:=1; // #10
                     end else
    if stringa=opz+'D2' then  // delimitatore
                     begin
                     opzioni_da_terminale[8]:='1';
                     delimitatore:=2; // #13+#10
                     end else
    {$ifndef Linux}
    if stringa=opz+'P=LPT1' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT1');
                     end else
    if stringa=opz+'P=LPT2' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT2');
                     end else
    if stringa=opz+'P=LPT3' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT3');
                     end else
    if stringa=opz+'P=LPT4' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT4');
                     end else
    if stringa=opz+'P=LPT5' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT5');
                     end else
    if stringa=opz+'P=LPT6' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT6');
                     end else
    if stringa=opz+'P=LPT7' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT7');
                     end else
    if stringa=opz+'P=LPT8' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT8');
                     end else
    if stringa=opz+'P=LPT9' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('LPT9');
                     end else
    if stringa=opz+'P=COM1' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('COM1');
                     end else
    if stringa=opz+'P=COM2' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('COM2');
                     end else
    if stringa=opz+'P=COM3' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('COM3');
                     end else
    if stringa=opz+'P=COM4' then  // seleziona stampante
                     begin
                     opzioni_da_terminale[9]:='1';
                     stampante.set_printer('COM4');
                     end else
    {$endif}
    if stringa=opz+{$ifdef Linux}'H'{$else}'?'{$endif} then Help else
                     begin
                     val_Try(Copy_end(stringa,2),LBin_,ii);  {ii= posizione errore}
                     if (ii=0) and (LBin_>=1) and (LBin_<=254) then lunghezza_riga_forzata:=LBin_
                                                               else files_da_terminale.Inserisci(1,stringa_normale); // forse file
                     end;
    stringa:=coda;
    stringa_normale:=coda_normale;
    end;
  end;
Initvideo;// da fare prima di INIZIALIZZAZIONE, altrimenti ScreenWidth torna 0
ins:=binario;
posizione_file_attuale:=-1;
if binario then setlength(testo,next_max_righe_esa)
           else setlength(testo,next_max_righe_txt);
with Htm do // ver 2.77     e' HTM.
     begin
     titolo:=true;
     fine_riga_br:=true;
     colore_testo:='';   // FFFFFF  r,g,b; stringa vuota=ignora
     colore_sfondo:='';  // FFFFFF  r,g,b; stringa vuota=ignora
     h:=0;               // 0..6: <h>  ,  0=ignora
     size:=0;            // 0..7: size ,  0=ignora
     allinea:=0;         // 0=ignora, 1=sinistra, 2=destra, 3=centro, 4=giustificato
     corsivo:=false;
     grassetto:=false;
     sottolineato:=false; // ver 2.95
     font:='';
     selezione:=false;    // ver 2.81
     size_rtf:=0;         // ver 2.96
     end;

menu_selezione_speciale:=1;          // ver 3.03
menu_selezione_formattato:=1;        // ver 3.04
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Inizializzazione_2;
var j,i:byte;
    found_ini,errore_parametri,tasto_premuto:boolean;
begin
writeln(invio+Lingue.Get_txt(0));  // Avvio di EdiTury in corso...
writeln(Lingue.Get_txt(1),' ',ver,Lingue.Get_txt(2),{$I %DATE%},'  ',{$I %TIME%}+invio); //  'Versione'  '  del  '
writeln(Lingue.Get_txt(3),FPC_VERSION,'.',FPC_RELEASE,'.',FPC_PATCH,'      CPU: ',{$I %FPCTARGET%},Lingue.Get_txt(6),Os_prog+' '+IntToStr(bit)+' bit');
 // Writeln('Compiler version: ',{$I %FPCVERSION%}); // 'Versione del compilatore FreePascal '   '   per '
writeln(invio+Lingue.Get_txt(4)); // 'Apri il file EDIT.TXT per consultare la guida.'
found_ini:=exist(pathof(paramstr(0))+'editor.ini')<>-1;
if not found_ini then
                 begin
                 writeln(invio+Lingue.Get_txt(7)+pathof(paramstr(0))+'editor.ini'); // 'File di inizializzazione non trovato '
                 ignora_ini:=true; // in questo modo, se dovesse ricomparire poco dopo, sarebbe ignorato
                 end;
if ignora_ini and found_ini then writeln(Lingue.Get_txt(8));  // 'File di inizializzazione ignorato'
errore_parametri:=false;
Editor_Ini.init; // ver 2.59
Estensioni.init;
appunti_usato:=-1;
setlength(Appunti,0);
Annulla_Esa.init;
sotto_:=true;
pInt:=false;
per_riga:=false; // ver 3.23
jolly:=false;
selezione:=false;
ignora:=true;
tutto:=false;
{$ifdef TxtVideo}
_start:=-1;
_end:=maxr+1;
{$endif}
RunEdit:='';
RunShell:='';
vera_tastiera:=false;
Segnala_Errori:=true;
sostituto:='';
cerco:='';
verticale:=2;
adiacente:=false;
frequenza:=0;
ritardo:=0;
AutoDetect:=false;
MOrizzontale:=8;
MVerticale:=16;
un_bak:=true;
Home:=false;
Fine_:=false;
SaveShell:='ST';
Azzera_Selezione;
the_files:='';
max_righe_video:=byte(ScreenHeight); // serve ripetuto, perche' RunShell puo' cambiare valore
if not ignora_ini then
   if IniFile then
           begin
           errore_parametri:=true;
           writeln;
           end;
{$ifndef Linux}
if stampante.Get_Printer()='' then
   if stampante.Set_Printer('LPT1')<>0 then writeln(invio+Lingue.Get_txt(5));  // 'Errore nell''inizializzazione della stampante su LPT1'
{$endif}
Est_note:=Lingue.get_charUp(140){'P'};
Est_non_note:=Lingue.get_charUp(144){'/'};
percorso:=start_dir_default_path;
if start_dir_default_path='' then      // update 2.45
   begin
   start_dir_default_path:=start_dir_prompt;
   if (start_dir_default_path<>'')and(start_dir_default_path[length(start_dir_default_path)]<>pathdelim) then start_dir_default_path:=start_dir_default_path+pathdelim;
   percorso:=start_dir_default_path;
   end;

if the_files='' then the_files:={$ifdef Linux}'*'{$else}'*.*'{$endif};
//max_righe_video:=byte(ScreenHeight); // serve ripetuto, perche' RunShell puo' cambiare valore

if RunEdit<>'' then
      begin
      SwapVectors;
      Exec(GetEnv(ambiente_terminale),opz+'c '+RunEdit);
      SwapVectors;
      case DosError of
         0: ;
         2: begin
            gotoxy(21,riga_menu+3);
            write('                                    ');
            gotoxy(40-Lingue.get_length_txt(9) div 2,riga_menu+3);
            write(Lingue.get_txt(9));   // File non trovato
            Esc;
            end;
         8: begin
            gotoxy(21,riga_menu+3);
            write('                                    ');
            gotoxy(40-Lingue.get_length_txt(10) div 2,riga_menu+3);
            write(Lingue.get_txt(10)); // Memoria insufficiente
            Esc;
            end;
         else
            begin
            gotoxy(21,riga_menu+3);
            write('                                    ');
            gotoxy(40-Lingue.get_length_txt(11) div 2,riga_menu+3);
            write(Lingue.get_txt(11));  // Errore generico
            Esc;
            end;
        end;
      end;
if (ScreenWidth<max_larghezza)or(ScreenHeight<min_righe_video) then TextMode(Co80);
if errore_parametri then
           begin
           tasto_premuto:=false;
           normale;
           write(invio+Lingue.get_txt(12));     // 'Attendere ... 3'
           for i:=3 downto 1 do
               begin
               write(#8,i-1);
               for j:=1 to 10 do
                   begin
                   if tasto_premuto then break;
                   Delay2(10);  // ritardo per poter leggere i messaggi di errore
                   if (PollKeyEvent<>0) then
                             begin
                             GetKeyEvent;
                             tasto_premuto:=true;
                             break;
                             end;
                   end; // for
               end; // for
           end;
copie:=1;
Annulla_Txt.init;
Annulla_Selezione.init;
Ripristina_Txt.init;       // ver 3.15
Ripristina_Selezione.init; // ver 3.15
ErrorTextMode_start;
Doppio_Click.init;
Doppio_Click.set_mancino(mancino);
Doppio_Click.Set_Num_Click_Max(4);
{$ifdef Go32v2}
 SetMousePos(((max_larghezza div 2)-1)*8,((ScreenHeight div 2) -1)*8);
{$else}
 {$ifndef OS2}  // a causa di un bug: RTE 99
 SetMouseXY((max_larghezza div 2)-1,(ScreenHeight div 2) -1);
 {$endif}
{$endif}
{$ifdef Go32v2}
 SetMouseSpeed(MOrizzontale,MVerticale);
 keyspeed(byte(ritardo),byte(frequenza));
{$endif}
max_righe_video:=byte(ScreenHeight);
stato_appunti.init;   // ver 2.53   non puo' stare oltre, altrimenti .init non e' eseguita: crash
stato_appunti.Set_pos_XY(max_larghezza-2,riga_menu+4);  // ver 2.53
apri_formato:='T';  // ver 2.20
Crea_ListaX;
Crea_ListaY;
Nuovo_Comune;
setlength(multi_file,1);  // nella pos 0 non c'e' nulla di proposito , e nella pos 1 quello vuoto predefinito
inserisci_file_dopo(0);
posizione_file_attuale:=1;
Aggiorna_Campi_Menu;
x_min:=1;
no_update:=false;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__Command_Shell;  // CommandShell  File --> Command Shell
var old_ins,old_Segnala_Errori,opzione_disabilita_mouse:boolean;
    i:byte;
begin
if {$ifdef Go32v2}mousefound{$else}(DetectMouse>0){$endif} and topo then opzione_disabilita_mouse:=false
                                                                    else opzione_disabilita_mouse:=true;
if modifica then
   if SaveShell='N' then else          // non fa alcun salvataggio
   if (SaveShell='AI') or ( (SaveShell='STI') and not binario ) or
      ( (SaveShell='SEI') and binario ) then
            begin                                  // AI  salva tutto e ignora gli errori
            old_Segnala_Errori:=Segnala_Errori;    // STI salva solo testo e ignora gli errori
            Segnala_Errori:=false;                 // SEI salva solo esadecimale e ignora gli errori
            Scrivi;
            Segnala_Errori:=old_Segnala_Errori;
            end else
   if (SaveShell='A') or ( (SaveShell='ST') and not binario ) or
      ( (SaveShell='SE') and binario ) then
      begin
      scrivi;     // IOF=false == errori in scrittura
      if (IOF=false) and (ShellError=false) then Exit;
      end
   else
     case AskSaveShell of  // SaveShell==C : ask
          'S' : begin
                gotoxy(29,riga_menu+4);
                clreol;
                scrivi;     // IOF=false == errori in scrittura
                if (IOF=false) and (ShellError=false) then Exit;
                end;
          'N' : ;
          'A' : Exit;
          end;
normale;
HideMouse;
clrscr;
old_ins:=ins;
{$ifdef TxtVideo}
ForceUpdateXY(0,0,ScreenWidth*ScreenHeight);
{$endif}
ins:=false;
if ins then CursorBig else CursorOn;

{$ifndef Go32v2}
 donemouse;
{$endif}
DoneKeyboard;
DoneVideo;

gotoxy(1,40-Lingue.get_length_txt(13) div 2);
writeln(Lingue.get_txt(13)+invio);   // 'Sei nella Shell'

SwapVectors;
if Exist(PathOf(ParamStr(0))+RunShell)>=0
       then Exec(GetEnv(ambiente_terminale),opz+'c '+PathOf(ParamStr(0))+RunShell+' '+percorso+' '+nomefile)
       else
        if Exist(RunShell)>=0 then Exec(GetEnv(ambiente_terminale),opz+'c '+RunShell+' '+percorso+' '+nomefile)
       else
        begin
        if RunShell<>'' then writeln(invio+Lingue.get_txt(14)+RunShell);  // 'File di Shell non trovato: '
        Exec(GetEnv(ambiente_terminale),'');
        end;
SwapVectors;
{$ifdef Go32v2}
 dosmemget($B800, 0, save_shell, sizeof(save_shell)); // preparo per Alt+F5
 save_shell_x:=whereX;
 save_shell_y:=whereY;
{$endif}
{$ifndef Go32v2}
 donemouse;
{$endif}
initKeyboard;
if not opzione_disabilita_mouse then
       begin
       {$ifdef Go32v2}
        mousefound:=initmouse;
        topo:=mousefound;
       {$else}
        initmouse;
        topo:=(DetectMouse>0);
       {$endif}
       end;
ShowMouse;
if DosError<>0 then
        begin
        case DosError of
          3: begin  // DosError:=3;
             gotoxy(40-Lingue.get_length_txt(15) div 2,riga_menu+3);
             write(Lingue.get_txt(15)); // 'Interprete dei comandi non trovato'
             end;
          8: begin
             gotoxy(40-Lingue.get_length_txt(10) div 2,riga_menu+3);
             write(Lingue.get_txt(10));  // 'Memoria insufficiente'
             end;
          else
            begin
            gotoxy(40-Lingue.get_length_txt(17) div 2,riga_menu+3);
            writeln(Lingue.get_txt(17));  // 'Impossibile caricare l''interprete dei comandi'
            end;
          end; // del case
        esc;
        end;
for i:=1 to length(listaY) do listaY[i].topo:=topo;
listaX.topo:=topo;
{$ifdef Go32v2}
 SetMouseSpeed(MOrizzontale,MVerticale);
 keyspeed(byte(ritardo),byte(frequenza));
{$endif}
ShowMouse;
{$ifdef TxtVideo}
 DoneVideo;
{$endif}
InitVideo;
{$ifdef Go32v2}
 TextMode(old_textmode);
{$endif}
max_righe_video:=byte(ScreenHeight); // serve perche' CommandShell puo' cambiarlo
ErrorTextMode;
HideMouse;
ins:=old_ins;
if ins then CursorBig else CursorOn;
{$ifdef Linux}
 clrscr;
{$endif}
Evidenzia_Selezione;     // Evidenzia_Selezione e grafica: righe invertite
Grafica;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

function Tasto__Giu():boolean;    // update ver 1.82 , 2.25
var old_x_riga,old_iy,old_x_min:integer;
    update_video:boolean;
begin
update_video:=false;
old_x_riga:=x_riga;
old_x_min:=x_min;
old_iy:=iy;
if binario then
         begin
         if iy<MaxR then
             begin
             if iy=ymax then Exit(true);
             inc(iy);
             inc(y);
             if x_riga>length(testo[iy]) then
                begin
                x_riga:=length(testo[iy]);
                if old_x_riga>x_riga then x:=byte(max(1,x-(old_x_riga-x_riga)));
                if x_riga<x_min then
                   begin
                   update_video:=true;
                   x_min:=x_riga-x+1;
                   end;
                if old_x_riga-x_riga>79 then update_video:=true;
                end;
             if y=riga_menu then
                  begin
                  y:=riga_menu-1;
                  update_video:=true;
                  end;
             if update_video then Evidenzia_Selezione;
             end
            else    {iy=MaxR}
             begin  {nella prossima parte}
             if nomefile='' then Exit(true);
             if modifica then
                          begin
                          Need_Save;
                          case Tasti_SNA(30,riga_menu+4) of
                             'A': ;  {non fa nulla: ESC}
                             'N': begin
                                  modifica:=false;
                                  gotoxy(3,riga_menu+2);
                                  write('                                                                           ');
                                  gotoxy(1,riga_menu+4);
                                  write('                                                ');
                                  tot:=tot+num_byte();
                                  Apertura_Bin;
                                  end;
                             'S': begin
                                  gotoxy(1,riga_menu+4);
                                  write('                                                ');
                                  if SL then
                                        begin
                                        SL_Error;  // ver 2.52
                                        Exit;
                                        end
                                       else Salva;
                                  if IOF  then {salvataggio corretto}
                                          begin
                                          gotoxy(1,riga_menu+1);
                                          write('                              ');
                                          tot:=tot+num_byte();
                                          Apertura_Bin;
                                          end
                                         else Attrib;
                                  end;
                             end;
                          end
                         else    {modifica=false}
                          begin
                          tot:=tot+num_byte();
                          Azzera_Selezione; // add 2.66
                          Apertura_Bin;
                          end;
             Grafica;
             Info;
             end;
         end
        else  {non binario}
         begin
         if iy=MaxR then Exit(true);
         if CL then
            begin
            inc(iy);
            inc(y);
            if iy>ymax then
               begin
               ymax:=iy;
               testo[ymax]:=#13;
               modifica:=true;
               if vera_tastiera and FreeAnnulla(1) then
                   begin
                   Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+zero(inttostr(y-1),2)+zero(inttostr(iy-1),4)+'LG')));
                   Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
                   end;
               end
              else if vera_tastiera and (x_riga>length(testo[iy])) and FreeAnnulla(1) then
                      begin
                      Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+zero(inttostr(y-1),2)+zero(inttostr(iy-1),4)+'LG'+' '+char(length(testo[iy])) )));
                      Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
                      end;
            while x_riga>length(testo[iy]) do Insert(' ',testo[iy],length(testo[iy])+1);
            if x_riga<>old_x_riga then modifica:=true;
            end
           else  {no CL}
            begin
            if (iy>=ymax) then Exit;
            inc(iy);
            inc(y);
            x_riga:=byte(min(x_riga,length(testo[iy])));
            fix_position;
            x:=byte(max(x-(old_x_riga-x_riga),1));
            x_reale:=x;
            if x_min>x_riga then
                begin
                x_min:=x_riga;
                x:=1;
                x_reale:=x;
                end;
            end;
         if y=riga_menu then
              begin
              y:=riga_menu-1;
              Evidenzia_Selezione;
              end;
         end;
Tasto__Giu:=(old_iy=iy);
if old_x_min<>x_min then Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

function Tasto__Tastiera(c:char):boolean;   // scrittura su video
var app,appx,err:char;    // torna TRUE in caso di memoria per testo esaurita
    b,a,ii,old_iy,old_ymax,old_x_min,old_x_riga:integer;
    old_x,old_y:byte;
    tab,update_video:boolean;
    res:string;
begin           { \/ non fa continuare la scrittura dopo l'ultimo byte}
old_x_min:=x_min;
update_video:=false;
tab:=(not binario)and(c=#9);
if tab then c:=' ';

Tasto__tastiera:=false;
err:=' ';
if (iy=ymax)and(x_riga=lunghezza_riga+1) then
                                         else modifica:=true;
if (x_riga=lunghezza_riga+1)and(iy<maxR) then      { update ver 1.80 }
                begin
                if (iy<ymax) then // emulare Destra
                            begin
                            err:='B';  // era A
                            inc(iy);
                            inc(y);
                            if y=riga_menu then y:=riga_menu-1;
                            Set_Cursore_X(1);
                            old_y:=y;
                            old_x_riga:=x_riga;
                            old_x:=x;
                            old_x_min:=x_min;
                            old_iy:=iy;
                            old_ymax:=ymax;
                            end
                           else  { faccio una nuova riga vuota }
                            begin
                            Tasto__Invio;
                            exit(Tasto__Tastiera(c))  // scrittura su video ver 3.30
                            end
                end
               else
                begin
                if (x_riga=lunghezza_riga+1)and(iy=ymax) then
                   if not Tasto__invio() then Exit(true);  // simula che va a capo in riga nuova
                old_y:=y;
                old_x_riga:=x_riga;
                old_x:=x;
                old_iy:=iy;
                old_ymax:=ymax;
                end;
a:=x;
if x_riga=lunghezza_riga+1 then
        if iy<MaxR then
                  begin
                  Set_Cursore_X(1);
                  inc(y);
                  inc(iy);
                  modifica:=true;
                  if y>riga_menu-1 then
                          begin
                          y:=riga_menu-1;
                          err:='A';  {devo spostare tutto il testo}
                          end;
                  if iy>ymax then
                             begin
                             ymax:=iy;
                             testo[iy]:=#13;
                             end;
                  if a=lunghezza_riga+1 then gotoxy(x,y);
                  end
        else sonoro;
ii:=iy;  {l'ultimo carattere lo porta come primo: per tutto il foglio}
app:=c;
c:=#1;
b:=ii;
if (ins=false) then while (length(testo[b])>=lunghezza_riga+1) do inc(b);
if b>MaxR then
   begin
   if stato<>4 then Righe_Finite; //se stato=4, in 'sostituisci' il messaggio di righe finite deve essere ignorato
   Exit(true);
   end;
if (length(testo[ii])=lunghezza_riga+1)and(iy<MaxR)and(ins=false) then
   begin
   repeat
    if c=#1 then appx:=testo[ii][lunghezza_riga+1]
            else appx:=c;
    if length(testo[ii+1])=lunghezza_riga+1 then c:=testo[ii+1][lunghezza_riga+1];
    if testo[ii+1]='' then testo[ii+1]:=' '; {qualsiasi cosa}
    testo[ii+1][1]:=appx;
    testo[ii+1]:=#13+testo[ii+1];
    setlength(testo[ii],length(testo[ii])-1);
    inc(ii);
    if ymax<ii then ymax:=ii;
   until (ii=MaxR{ymax})or(length(testo[ii])<lunghezza_riga)or(ii=b);
   {$ifdef TxtVideo}
   _start:=iy+1;
   _end:=ii;
   {$endif}
   if vera_tastiera and FreeAnnulla(1) then
      begin
      Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+undo__x_prepara()+Zero(IntToStr(old_y),2)+Zero(IntToStr(old_iy),4)+'X'+Zero(IntToStr(ii),4)+Zero(IntToStr(old_ymax),4)+app {was c ver 3.24}))); { ver 1.80 }
      Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
      end;
   err:='A';
   end;

c:=app;
if (iy=MaxR)and(x_riga=lunghezza_riga+1)
   then
   else
    begin                                           { ver 1.80 \|/ }
    if (err<>'A') and vera_tastiera and FreeAnnulla(1)  then
       if ins then
               begin
               if (length(testo[old_iy])>old_x_riga)and(length(testo[old_iy])<=lunghezza_riga+1) then // sovrascrive
                   begin
                   res:='';
                   if testo[old_iy][old_x_riga+1]=#0 then res:=c;
                   if c=#0 then res:=testo[old_iy][old_x_riga+1]+'----';
                   if (c<>#0)and(testo[old_iy][old_x_riga+1]<>#0) then
                      Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+char(old_x)+char(old_x_min)+Zero(IntToStr(old_y),2)+Zero(IntToStr(old_iy),4)+'x'+testo[old_iy][old_x_riga+1]+c)))
                       else
                      Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+char(old_x)+char(old_x_min)+Zero(IntToStr(old_y),2)+Zero(IntToStr(old_iy),4)+'x'+res)));
                   Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
                   end
                  else
               if (length(testo[iy])=x_riga)and(length(testo[iy])<=lunghezza_riga+1) then //non sovrascrive
                  if (iy=ymax) and (x_riga=1) and (length(testo[iy-1])=lunghezza_riga+1)
                     then
                      begin
                      Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+undo__x_prepara()+Zero(IntToStr(old_y),2)+Zero(IntToStr(iy),4)+'x---'+c)));
                      Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
                      end
                     else
                      begin
                      Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+undo__x_prepara()+Zero(IntToStr(old_y),2)+Zero(IntToStr(iy),4)+'x--'+c)));
                      Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
                      end;
               end
              else
               begin
               Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+char(old_x)+char(old_x_min)+Zero(IntToStr(old_y),2)+Zero(IntToStr(old_iy),4)+'X'+Zero(IntToStr(old_iy),4)+Zero(IntToStr(old_ymax),4)+c)));
               Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
               end;
    if tab then ord32_255(testo[iy],x,lunghezza_riga+1,#9)  // in ord32_255 c'e' evidenzia_selezione da evitare
           else ord32_255(testo[iy],x,lunghezza_riga+1,c);
    end;
if (err<>' ') and vera_tastiera and (not tab) and (not no_update) then
   Evidenzia_Selezione;
if binario and (x_riga=lunghezza_riga+1) then
      if iy<maxR then
                 begin
                 Set_Cursore_X(1);
                 inc(iy);
                 if iy>ymax then inc(ymax); // cioe', aggiungo una nuova riga
                 inc(y);
                 if y>riga_menu-1 then
                                  begin
                                  y:=riga_menu-1;
                                  update_video:=true;
                                  end;
                 if old_x_riga-x_riga>79 then update_video:=true;
                 if update_video then Evidenzia_Selezione;
                 end
                else
                 begin
                 Set_Cursore_X(byte(lunghezza_riga));
                 gotoxy(x,y);
                 Tasto__Giu();
                 end;
HideMouse;
ShowMouse;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Destra;
var old_x,old_x_min:integer;
    old_no_update,update_video:boolean;
label next;
begin
old_x_min:=x_min;
old_x:=x;
if ( binario and (x_riga<lunghezza_riga) and (x_riga<length(testo[iy])) ) or ( (not binario) and (x_riga<length(testo[iy])) ) then
   begin
   Set_Cursore_X(x_riga+1); {non scende}
   if old_x<80 then
      begin
      x:=old_x+1;
      x_reale:=x;
      end;
   if old_x_min<>x_min then Evidenzia_Selezione;
   Exit;
   end;
if binario and (x_riga>=lunghezza_riga) then
   begin
   if (iy<ymax) then
                begin
                Set_Cursore_X(1);
                inc(iy);
                inc(y);
                x_min:=1;
                if y=riga_menu then
                               begin
                               y:=riga_menu-1;
                               update_video:=true;
                               end;
                if old_x_min-x_min>79 then update_video:=true;
                if update_video then Evidenzia_Selezione;
                end
               else Tasto__Giu(); {iy=ymax}
   Exit;
   end;
if CL then
   begin
   if (x_riga=lunghezza_riga+1)and(ymax=MaxR) then exit;
   if (x_riga=length(testo[iy]))and(iy<=MaxR) then {dovrebbe scendere}
      if x_riga<lunghezza_riga+1 then
                  begin
                  if vera_tastiera then
                     begin
                     vera_tastiera:=false;
                     if FreeAnnulla(1) then
                         begin
                         Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'LD')));
                         Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
                         end;
                     end;
                  Tasto__Tastiera(' ');
                  end
                 else if (x_riga=lunghezza_riga+1)and(iy<=MaxR) then
                          if iy=ymax then Tasto__Invio()
                                     else goto next;
   end
  else
   begin
   next:
   if (x_riga=length(testo[iy]))and(iy<ymax) then {dovrebbe scendere}
              begin
              inc(iy);
              inc(y);
              if y=riga_menu then
                 begin
                 y:=riga_menu-1;
                 Evidenzia_Selezione;
                 end;
              Set_Cursore_X(1);
              x_min:=1;
              old_no_update:=no_update;
              no_update:=(old_x_min=x_min);   // ver 2.73
              if not no_update then Evidenzia_Selezione;
              no_update:=old_no_update;
              end;
   end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

function Tasto__Su():boolean;    { update ver 1.81 , 2.25 }
var old_x_min,old_x_riga,old_iy:integer;
    update_video:boolean;
begin
update_video:=false;
old_iy:=iy;
old_x_riga:=x_riga;
old_x_min:=x_min;
if binario then
   begin
   if iy>1 then
           begin
           dec(iy);
           dec(y);
           if x_riga>length(testo[iy]) then
                begin
                x_riga:=length(testo[iy]);
                if old_x_riga>x_riga then x:=byte(max(1,x-(old_x_riga-x_riga)));
                if x_riga<x_min then
                   begin
                   update_video:=true;
                   x_min:=x_riga-x+1;
                   end;
                if old_x_riga-x_riga>79 then update_video:=true;
                end;
           if y=0 then
                  begin
                  y:=1;
                  update_video:=true;
                  end;
           if update_video then Evidenzia_Selezione;
           end
          else
           begin
           if tot=0 then Exit(true);
           if modifica then
                        begin {nella parte superiore}
                        Need_Save;
                        case Tasti_SNA(30,riga_menu+4) of
                             'A': ;  {non fa nulla: ESC}
                             'N': begin
                                  modifica:=false;
                                  gotoxy(3,riga_menu+2);
                                  write('                                                                           ');
                                  gotoxy(1,riga_menu+4);
                                  write('                                                ');
                                  tot:=tot-lunghezza_riga*MaxR;
                                  if tot<0 then tot:=0;
                                  Apertura_Bin;
                                  Tasto__Ctrl_Fine;
                                  end;
                             'S': begin
                                  gotoxy(1,riga_menu+4);
                                  write('                                                ');
                                  if SL then
                                        begin
                                        SL_Error;  // ver 2.52
                                        Exit;
                                        end
                                       else Salva;
                                  if IOF then {salvataggio corretto}
                                          begin
                                          gotoxy(1,riga_menu+1);
                                          write('                              ');
                                          tot:=tot-lunghezza_riga*MaxR;
                                          if tot<0 then tot:=0;
                                          Apertura_Bin;
                                          Tasto__Ctrl_Fine;
                                          end
                                         else Attrib;
                                  end;
                             end; {case}
                        end
                       else  {non modifica}
                        begin
                        tot:=tot-lunghezza_riga*MaxR;
                        if tot<0 then tot:=0;
                        Apertura_Bin;
                        Tasto__CTRL_Fine;
                        end;
           Grafica;
           Info;
           end;
   end
  else   {non binario}
   begin
   if iy<2 then Exit(true);
   dec(iy);
   dec(y);
   if CL then
         begin
         if vera_tastiera and (x_riga>length(testo[iy])) and FreeAnnulla(1) then
            begin
            Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+zero(inttostr(y+1),2)+zero(inttostr(iy+1),4)+'LS'+' '+char(length(testo[iy])) )));
            Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
            end;
         while x_riga>length(testo[iy]) do Insert(' ',testo[iy],length(testo[iy])+1)
         end
        else   // no CL
         begin
         x_riga:=byte(min(x_riga,length(testo[iy])));
         fix_position;
         x:=byte(max(x-(old_x_riga-x_riga),1));
         x_reale:=x;
         if x_min>x_riga then x_min:=x_riga;
         end;
   if y=0 then
          begin
          y:=1;
          Evidenzia_Selezione;
          end;
   end;
Tasto__Su:=(old_iy=iy);
if old_x_min<>x_min then Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure ReDo__CL(riga:string);        // ver 3.15
var a,b:longint;
    old_no_update,old_cl:boolean;
begin
a:=Annulla_Txt.numelementi();
b:=Annulla_selezione.numelementi();
undo__x_ripristina(riga);
y:=byte(StrToInt(copy(riga,4,2)));
iy:=StrToInt(copy(riga,6,4));
old_no_update:=no_update;
no_update:=true;
old_cl:=cl; // ver 3.40
cl:=true;   // ver 3.40
case riga[11] of
      'G': Tasto__Giu();
      'S': Tasto__Su();
      'D': Tasto__Destra;
      end;
cl:=old_cl; // ver 3.40
no_update:=old_no_update;
while a<Annulla_Txt.numelementi() do Annulla_Txt.cancella_iniziale;
while b<Annulla_selezione.numelementi() do Annulla_selezione.cancella_iniziale;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Canc(update_video:boolean);
var i,a,b,ii,old_ymax:integer;
    old_char:char;
    intersezione_:boolean;
begin
Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
if (x_riga=length(testo[iy])) and ( length(testo[iy+1])+length(testo[iy])-1<=lunghezza_riga+1 )
   and (iy<ymax) then {comprime e sale di una riga}
       begin
       {$ifdef TxtVideo}
       _start:=iy;
       _end:=maxr+1;
       {$endif}
       if vera_tastiera and FreeAnnulla(1) then Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'C')));
       if (selezionato.x1<>0) and (iy=selezionato.y1-1) then
               begin
               inc(selezionato.x1,length(testo[iy])-1);
               if selezionato.y1=selezionato.y2 then inc(selezionato.x2,length(testo[iy])-1);
               end;
       testo[iy]:=testo[iy]+copy_end(testo[iy+1],2);
       for i:=iy+1 to ymax do testo[i]:=testo[i+1];
       testo[ymax]:=#13;
       dec(ymax);
       modifica:=true;
       if selezionato.x1<>0 then
          if (selezionato.y2<iy) or ((selezionato.y2=iy)and(x_riga>selezionato.x2)) then else  // CANC + giu' della selezione
          if iy<selezionato.y1 then
                             begin
                             if selezione_quadrata and (x_riga<>1) then Azzera_Selezione;
                             dec(selezionato.y1); // CANC + su' della selezione
                             dec(selezionato.y2);
                             end
                            else
                             begin
                             if selezione_quadrata then Azzera_Selezione;
                             dec(selezionato.y2); // CANC dentro la selezione
                             if selezionato.y2=iy then inc(selezionato.x2,x_riga-1);
                             end;
       if update_video then Evidenzia_Selezione;
       hidemouse;
       Showmouse;
       Exit;
       end;
if (x_riga=length(testo[iy]))and(iy=ymax) then sonoro;
if (x_riga<length(testo[iy]))and(length(testo[iy])<lunghezza_riga+1) then
   begin
   intersezione_:=(selezionato.x1>0) and intersezione(iy,iy,selezionato.y1,selezionato.y2);
   if intersezione_ and (selezionato.y2=iy)and(selezionato.x2<x_riga) then intersezione_:=false;
   if intersezione_ then
      begin
      if (iy=selezionato.y1) and (x_riga<selezionato.x1) then dec(selezionato.x1);
      if (iy=selezionato.y2) then dec(selezionato.x2)
                             else
                              if selezione_quadrata then
                                 begin
                                 if x_riga<=selezionato.x2 then dec(selezionato.x2);
                                 if (x_riga<selezionato.x2)or(selezionato.x1>selezionato.x2) then Azzera_Selezione;
                                 end;
      if (selezionato.y2=selezionato.y1) and (selezionato.x2<selezionato.x1) then Azzera_Selezione;
      end;
   if vera_tastiera and FreeAnnulla(1) then Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'C'+testo[iy][x_riga+1])));
   if selezione_quadrata and (iy=selezionato.y2) and (x_riga<selezionato.x2) then Azzera_Selezione; // add ver 2.25
   delete(testo[iy],x_riga+1,1); {in una stessa riga}
   modifica:=true;
   if update_video then Evidenzia_Selezione;
   Exit;
   end;

if (x_riga<length(testo[iy]))and(length(testo[iy])=lunghezza_riga+1) then  {in righe successive}
     begin
     a:=iy;
     old_char:=testo[iy][x_riga+1];
     old_ymax:=ymax;
     delete(testo[iy],x_riga+1,1);
     modifica:=true;
     b:=0;
     repeat
      inc(b);
     until length(testo[a+b])<lunghezza_riga+1;
     {$ifdef TxtVideo}
     _start:=iy;
     _end:=_start+b;
     {$endif}
     if selezionato.x1<>0 then
        if (x_riga<selezionato.x1)and(selezionato.y1=iy)and(selezionato.y2>b+iy)
           then // la selezione e' piu' lunga delle righe successive modificate
             dec(selezionato.x1)
           else
     if (x_riga<selezionato.x1)and(selezionato.y1=iy)and(selezionato.y2<=b+iy)
           then // la selezione non e' piu' lunga delle righe successive modificate, e mi trovo prima della selezione
             begin
             dec(selezionato.x1);
             dec(selezionato.x2);
             if selezionato.x2=0 then
                   begin
                   dec(selezionato.y2);
                   selezionato.x2:=byte(lunghezza_riga);
                   end;
             end else
     if (x_riga>=selezionato.x1)and(selezionato.y1=iy)and(selezionato.y2<=b+iy)
           then // la selezione non e' piu' lunga delle righe successive modificate
             begin
             if ((selezionato.x2>=x_riga)and(selezionato.y1=selezionato.y2)) or (selezionato.y2>selezionato.y1) then dec(selezionato.x2);
             if selezionato.x2=0 then
                   begin
                   dec(selezionato.y2);
                   selezionato.x2:=byte(lunghezza_riga);
                   end;
             end else
     if (selezionato.y1<iy)and(iy<selezionato.y2)and(iy+b>=selezionato.y2) then { update ver 1.90 }  // sono dentro la selezione esclusi gli estremi
             begin
             dec(selezionato.x2);
             if selezionato.x2=0 then
                   begin
                   dec(selezionato.y2);
                   selezionato.x2:=byte(lunghezza_riga);
                   end;
             end else
     if (selezionato.x2>=x_riga) and (iy=selezionato.y2) then  // l'estremo in basso
            begin
            dec(selezionato.x2);
            if selezionato.x2=0 then
                   begin
                   dec(selezionato.y2);
                   selezionato.x2:=byte(lunghezza_riga);
                   end;
            end else
     if (iy<selezionato.y1)and(selezionato.y2<=b+iy) then
              begin
              dec(selezionato.x1);
              if selezionato.x1=0 then
                   begin
                   dec(selezionato.y1);
                   selezionato.x1:=byte(lunghezza_riga);
                   end;
              dec(selezionato.x2);
              if selezionato.x2=0 then
                   begin
                   dec(selezionato.y2);
                   selezionato.x2:=byte(lunghezza_riga);
                   end;
              end else
     if (iy<selezionato.y1)and(selezionato.y1<b+iy)and(selezionato.y2>b+iy) then
              begin
              dec(selezionato.x1);
              if selezionato.x1=0 then
                   begin
                   dec(selezionato.y1);
                   selezionato.x1:=byte(lunghezza_riga);
                   end;
              end else
     if (iy<selezionato.y1)and(selezionato.y1<=b+iy)and(selezionato.y2>b+iy) then
              begin
              dec(selezionato.x1);
              if selezionato.x1=0 then
                   begin
                   dec(selezionato.y1);
                   selezionato.x1:=byte(lunghezza_riga);
                   end;
              end else;

     if (selezionato.y2=selezionato.y1) and (selezionato.x2<selezionato.x1) then Azzera_Selezione;
     if ((length(testo[a])>1)and(a<ymax)) then
        begin
        for ii:=1 to b do
            begin
            if length(testo[a+1])>1 then
               begin
               testo[a]:=testo[a]+testo[a+1][2];
               delete(testo[a+1],2,1);
               if testo[a+1]='' then testo[a+1]:=#13;
               if testo[a+1]=#13 then
                     begin
                     for i:=a+1 to ymax do
                         begin
                         if (selezionato.x1<>0) then
                                   begin
                                   if (i+1=selezionato.y1) then dec(selezionato.y1);
                                   if (i+1=selezionato.y2) then dec(selezionato.y2);
                                   end;
                         testo[i]:=testo[i+1];
                         end;
                     dec(a);
                     testo[ymax]:=#13;
                     dec(ymax);
                     {$ifdef TxtVideo}
                     _end:=maxr+1;
                     {$endif}
                     end;
               if testo[a+1]='' then testo[a+1]:=#13;
               end;
            inc(a);
            end;
        end;
     if update_video then Evidenzia_Selezione;
     if vera_tastiera and FreeAnnulla(1) then Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'C'+old_char+zero(inttostr(b),4)+zero(inttostr(old_ymax),4))));
     end;
if (x_riga=length(testo[iy])) and ((length(testo[iy+1])+length(testo[iy])-1>lunghezza_riga+1))
   and (iy<ymax) then if cl then
                            begin
                            cl:=false;
                            Tasto__Destra;
                            cl:=true;
                            end
                           else Tasto__Destra; {cursore scende sotto se a fine riga: non puo' cancellare}
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Redo__Canc;
var a,b:longint;
begin
a:=Annulla_Txt.numelementi();
b:=Annulla_selezione.numelementi();
Tasto__Canc(false); //true= update screen
while a<Annulla_Txt.numelementi() do Annulla_Txt.cancella_iniziale;
while b<Annulla_selezione.numelementi() do Annulla_selezione.cancella_iniziale;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_speciale__Taglia_Righe(taglia:boolean);   {taglia/elimina righe da -> a }
var c:char;
    a,b,i,ii,L_intersez:int64;
    messaggio:shortstring;
begin
if SL then
      begin
      SL_Error;
      Exit;
      end;
if binario then
   begin
   No_ASCII;
   Exit;
   end;
Da_A_Graph;
colore;
if taglia then messaggio:=Lingue.get_txt(18)   // 'Taglia il testo'
          else messaggio:=Lingue.get_txt(19);  // 'Elimina il testo'
gotoxy(40-length(messaggio) div 2,riga_menu+2);
ShowMouse;
i:=1;
ii:=ymax;               //   'Dalla riga: '  'Alla riga: '
if not Da_A_2(i,ii,1,ymax,Lingue.get_txt(20),Lingue.get_txt(21),messaggio) then exit;
if (i=1)and(ymax=1)and(testo[1]=#13) then Exit;
Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
if selezionato.x1<>0 then  // ver 1.85
   begin
   L_intersez:=Lunghezza_Intersezione(i,ii,selezionato.y1,selezionato.y2);
   if L_intersez<>0 then
      begin
      if (i=selezionato.y1)and(selezionato.y2=ii) then Azzera_Selezione
          else
           begin
           dec(selezionato.y2,L_intersez);
           if selezionato.y2+L_intersez=ii then selezionato.x2:=length(testo[selezionato.y2])-1;
           if selezionato.y1=i then selezionato.x1:=1;
           end
      end else
   if ii<selezionato.y1 then // taglio prima della selezione
      begin
      dec(selezionato.y1,ii-i+1);
      dec(selezionato.y2,ii-i+1);
      end;
   end;
b:=i;
normale;
if taglia then
   begin
   if not Din_Mem_Free(ii-i+1) then Exit;
   nuovi_appunti(appunti_usato);
   a:=ii;
   while a>=i do
         begin
         Appunti[appunti_usato].input(Copy_end(testo[a],2));
         dec(a);
         end;
   end;
if taglia then c:='t' else c:='e';
if FreeAnnulla(ii-i+1) then
   begin      {le righe piu' in basso (+grandi) sono le prime in annulla}
   Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+#1+#1+Zero(IntToStr(y),2)+Zero(IntToStr(ii),4)+c+Copy_end(testo[ii],2))));
   if (i=1)and(ii=ymax) then Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+#1+#1+'000001R'+inttostr(ymax))));
   a:=ii-1;
   while a>=i do
         begin
         Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+#1+#1+Zero(IntToStr(y),2)+Zero(IntToStr(a),4)+c+Copy_end(testo[a],2))));
         dec(a);
         end;
   end;
modifica:=true;
a:=ii+1;
while a<=ymax do
      begin
      testo[i]:=testo[a];
      inc(i);
      inc(a);
      end;
iy:=b-10;
if iy<1 then iy:=1;
y:=1;
Set_Cursore_X(1);
ymax:=ymax-(ii-b+1);
if ymax=0 then
          begin
          ymax:=1;
          y:=1;
          testo[1]:=#13;
          init;
          end;
init;
Evidenzia_Selezione;
i:=1;
while i<=10 do
      begin
      if iy<b then Tasto__Giu();
      inc(i);
      end;
if taglia then stato_appunti.nuovo_stato_appunti(1); // ver 2.53
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_Cerca__Vai;  // posizionati sulla Riga/Pagina/Byte     update  1.84
var x_,y_,mox,moy,lastD,lastU,posto,old_stato_,stato_:byte;
    c,old_stringa:string;
    p_att,p_max,n,iii:longint;
    ii:int64;
    first,insert,cliccato:boolean;
    i:word;
const stringa:string='';  // valore fisso del precedente input
const S1:char='=';  { F=foglio R=riga B=byte O=paragrafo }
const S2:char='R';  { +=Avanti -=Indietro ==Posizionati }
label next,keyboard,ricomincia;
{$define zero_:= begin
                 lastD:=0;
                 lastU:=0;
                 end}
begin
first:=true;
old_stato_:=255;
stato_:=1;
old_stringa:=stringa;
ricomincia:

hidemouse;
if binario then
            begin
            pulisci1;
            gotoxy(1,riga_menu+4);
            clreol;
            end
           else da_a_graph;
if binario then
   begin
   gotoxy(1,riga_menu+1);
   textcolor(yellow);
   write(Lingue.get_txt(22));   // 'Byte attuale '
   textcolor(white);
   write(Dim_Punto(num_byte()+tot)); {*** calcola la posizione del byte attuale}
   textcolor(yellow);
   write(Lingue.get_txt(23));    // '  Byte massimo '
   textcolor(white);
   write(Dim_Punto(file_size_byte));
   end;
colore;
gotoxy(1,riga_menu+3);
write(Lingue.get_txt(24));   // 'Posizionati:'
gotoxy(52,riga_menu+1);
write(Lingue.get_txt(25));   //  '( ) Riga      ( )'
write(Lingue.get_txt(26));   //  ' Avanti    '
gotoxy(35,riga_menu+2);
write(Lingue.get_txt(27));   // '                 ( ) Pagina    ( )'
write(Lingue.get_txt(28));   // ' Indietro  '
gotoxy(35,riga_menu+3);
if binario then write(Lingue.get_txt(29))   // '                 ( ) Byte      ( )'
           else write(Lingue.get_txt(539)); // '                 ( ) Paragrafo ( )'
write(Lingue.get_txt(30));   // ' Posizionati'
textcolor(12);
gotoxy(Lingue.get_pos_rosso(26),riga_menu+1);
write(Lingue.get_char(26));  // A
gotoxy(Lingue.get_pos_rosso(28),riga_menu+2);
write(Lingue.get_char(28));  // I
gotoxy(Lingue.get_pos_rosso(30),riga_menu+3);
write(Lingue.get_char(30));  // n
gotoxy(Lingue.get_pos_rosso(25),riga_menu+1);
write(Lingue.get_char(25));  // R
gotoxy(Lingue.get_pos_rosso(27),riga_menu+2);
write(Lingue.get_char(27));  // P
if binario then
    begin
    gotoxy(Lingue.get_pos_rosso(29),riga_menu+3);
    write(Lingue.get_char(29));  // B
    end
   else
    begin
    gotoxy(Lingue.get_pos_rosso(539),riga_menu+3);
    write(Lingue.get_char(539));  // 'o'
    end;
ShowMouse;
Pre_Tasti(35,riga_menu+3);
colore;
gotoxy(1,riga_menu+4);
write('                                             ');
ShowMouse;
if first then
   begin
   x_:=0;
   y_:=0;
   posto:=1;
   insert:=false;
   first:=false;
   end;
if binario and (S2='O') then S2:='B';
if (not binario) and (S2='B') then S2:='O';
if first then c:=S2;
textcolor(lightgreen);
gotoxy(1,riga_menu+4);
write(stringa);
gotoxy(1,riga_menu+4);
Aggiorna2(s1);
Aggiorna1(s2);
if not first then
   begin
   if stato_=2 then
                begin
                lo_statoXY(stato_);
                cursorOff;
                end
               else
                begin
                gotoxy(x_,y_);
                cursorOn;
                end;
   end;
repeat
i:=0;
next:
 textcolor(lightgreen);
 if stato_=1 then
              begin
              if i=0 then old_stringa:=stringa; // i<>0 se ci sono stati errori precedenti in input
              gotoxy(1,riga_menu+4);
              stringa:=ReadString(stringa,1,20,0,topo,true,mancino,insert,lastD,lastU,posto);
              if (lastD=0)and(lastU=7) then // Shift+Tab
                 begin
                 lastU:=72;
                 lastD:=255;
                 end;
              if lastD=255 then
                  if upcase(char(lastU))=Lingue.get_charUp(25) then lastU:=82 {R} else
                  if upcase(char(lastU))=Lingue.get_charUp(27) then lastU:=80 {P} else
                  if upcase(char(lastU))=Lingue.get_charUp(29) then lastU:=66 {B} else
                  if upcase(char(lastU))=Lingue.get_charUp(26) then lastU:=65 {A} else
                  if upcase(char(lastU))=Lingue.get_charUp(28) then lastU:=73 {I} else
                  if upcase(char(lastU))=Lingue.get_charUp(30) then lastU:=78 {N} else
                  if upcase(char(lastU))=Lingue.get_charUp(539) then lastU:=79; {O}
              goto keyboard;
              end
             else Zero_;
 if (PollKeyEvent<>0) or (not topo) then
               begin
               c:=KeyEventToString(TranslateKeyEvent(GetKeyEvent));
               if (pos('SHIFT ',c)<>0)and(length(c)=7) then c:=upcase(c[7]);
               if from_alt_to_char(c)<>#0 then c:=from_alt_to_char(c);
               if length(c)=1 then c:=upcase(c);
               if (c=Lingue.get_charUp(29){'B'}) and (not binario) then continue;
               if (c=Lingue.get_charUp(539){'o'}) and binario then continue;
               if c=#32 then         // spazio
                        begin
                        lastU:=32;
                        lastD:=0;
                        end else
               if (c='Right') or (c='Down') or (c=#9) then      // freccia giu' + Tab
                        begin
                        lastU:=9;
                        lastD:=0;
                        end else
               if (c='Left') or(c='Up') or (c='SHIFT Key with scancode 3840') then  // freccia su + Shift+Tab
                        begin
                        lastU:=72;
                        lastD:=255;
                        end else
               if c=#13 then         // invio
                        begin
                        lastD:=0;
                        lastU:=13;
                        x_:=whereX;
                        y_:=whereY;
                        end else
               if c=#27 then         // esc
                        begin
                        lastD:=0;
                        lastU:=27;
                        stringa:=old_stringa;
                        Exit;
                        end else
               if c=Lingue.get_charUp(25) then  // 'R'
                        begin
                        S2:='R';
                        lastD:=255;
                        lastU:=19;
                        c:='R';
                        end else
               if c=Lingue.get_charUp(27) then // 'P'
                        begin
                        S2:='P';
                        lastD:=255;
                        lastU:=25;
                        c:='P';
                        end else
               if c=Lingue.get_charUp(29) then // 'B'
                        begin
                        S2:='B';
                        lastD:=255;
                        lastU:=48;
                        c:='B';
                        end else
               if c=Lingue.get_charUp(539) then // 'O'
                        begin
                        S2:='O';
                        lastD:=255;
                        lastU:=79;
                        c:='O';
                        end else
               if c=Lingue.get_charUp(26) then  // 'A'
                        begin
                        lastD:=255;
                        lastU:=ord('A');
                        c:='A';
                        end else
               if c=Lingue.get_charUp(28) then  // 'I'
                        begin
                        lastD:=255;
                        lastU:=ord('I');
                        c:='I';
                        end else
               if c=Lingue.get_charUp(30) then
                        begin
                        lastD:=255;
                        lastU:=ord('N');
                        c:='N';
                        end;
               // was   if (length(c)=1) and (c[1] in ['N','I','A','B','P','R','O']) then
               if (length(c)=1) and (c[1] in [Lingue.get_charUp(30),Lingue.get_charUp(29),Lingue.get_charUp(25),
                  Lingue.get_charUp(28),Lingue.get_charUp(27),Lingue.get_charUp(26),Lingue.get_charUp(539)]) then
                        begin
                        pulisci_quadre;
                        cursorOn;
                        end;
               end
              else
               begin  // controllo mouse
               {$ifdef Go32v2}
                cliccato:=Doppio_Click.Mouse_Up(mox,moy,stato);
               {$else}
                cliccato:=Doppio_Click.Mouse_Down(mox,moy,stato);
               {$endif}
               if cliccato then stato:=1
                           else stato:=0;
               if stato=1 then
                          begin
                          lastU:=mox;
                          lastD:=moy;
                          end;
               end;
 keyboard:
 if (lastU=32)and(lastD=0) then  // spazio
      begin
      case stato_ of
           2: if stringa='' then Exit
                            else break;
           3: Exit;
           4: begin
              lastU:=53;     // emula pressione su R
              lastD:=riga_menu+1;
              end;
           5: begin
              lastU:=53;     // emula pressione su P
              lastD:=riga_menu+2;
              end;
           6: begin
              lastU:=53; // emula pressione su B o O
              lastD:=riga_menu+3;
              end;
           7: begin
              lastU:=67;     // emula pressione su +
              lastD:=riga_menu+1;
              end;
           8: begin
              lastU:=67;     // emula pressione su -
              lastD:=riga_menu+2;
              end;
           9: begin
              lastU:=67;     // emula pressione su =
              lastD:=riga_menu+3;
              end;
           end;
      lo_statoXY(stato_);
      end;
 if (lastU<21)and(lastD=riga_menu+4) then
     begin        // click sull'area del readstring
     old_stato_:=stato_;
     pulisci_quadre;
     stato_:=1;
     goto next;
     end;
 if (lastU=72)and(lastD=255) then  // freccia su
      begin
      if stato_=2 then
            begin
            old_stato_:=stato_;
            stato_:=1;
            pulisci_quadre;
            goto next;
            end;
      if stato_<>2 then
                   begin
                   old_stato_:=stato_;
                   if stato_<2 then stato_:=8
                               else dec(stato_,2);
                   end;
      lastD:=0;
      lastU:=9;
      end;
 if (lastU>34)and(lastU<39)and(lastD=riga_menu+3) then  // tasto OK
                                         if stringa<>'' then
                                                         begin
                                                         x_:=whereX;
                                                         y_:=whereY;
                                                         Break;
                                                         end
                                                        else
                                                         begin
                                                         stringa:=old_stringa;
                                                         Exit;  {esce: input annullato}
                                                         end;
 if (lastD=0)and(lastU=13)and(stato_=3) then
      begin
      stringa:=old_stringa;
      Exit;  {esce: input annullato}
      end;
 if (lastD=0)and(lastU=13)and(stringa<>'') then Break;  {input accettato}
 if (lastD=0)and ((lastU=27)or(lastU=13)) and (stringa='') then
    begin
    stringa:=old_stringa;
    Exit;  {esce: input annullato}
    end;
 if (lastD=0)and(lastU=9) then   // TAB
                          begin
                          Zero_;
                          old_stato_:=stato_;
                          inc(stato_);  {tab}
                          if stato_>9 then
                                      begin
                                      old_stato_:=stato_;
                                      stato_:=1;
                                      end;
                          if stato_ in [2,3] then cursorOff
                                             else
                                              begin
                                              cursorOff;
                                              pulisci_quadre;
                                              cursorOn;
                                              end;
                          lo_statoXY(stato_);
                          end;
 if (lastD=0)and(lastU=27)and(stringa<>'') then {ESC}
                              begin
                              stringa:='';
                              gotoxy(1,riga_menu+4);
                              write('                                                               ');
                              stato_:=1;
                              end;
 if (lastU>40)and(lastU<46)and(lastD=riga_menu+3) then
    begin
    stringa:=old_stringa;
    Exit; {ESC}
    end;
 if ((lastU=53)and(lastD=riga_menu+1)) or ((lastU=82) and (lastD=255)) then {emula pressione su R}
             begin
             lastD:=255;
             lastU:=19;
             end;
 if ((lastU=53)and(lastD=riga_menu+2)) or ((lastU=80) and (lastD=255)) then {emula pressione su P}
             begin
             lastD:=255;
             lastU:=25;
             end;
 if ((lastU=53)and(lastD=riga_menu+3)) then {emula click su 'B' o 'O'}
             begin
             lastD:=255;
             if binario then lastU:=48
                        else lastU:=79;
             end;
 if (lastU=66) and (lastD=255) then {emula pressione su B}
             begin
             lastD:=255;
             if binario then lastU:=48;
             end;
 if (lastU=79) and (lastD=255) then {emula pressione su O}
             begin
             lastD:=255;
             if not binario then lastU:=79;
             end;
 if ((lastU=67)and(lastD=riga_menu+1)) or ((lastU=65) and (lastD=255)) then
             begin
             old_stato_:=stato_;
             stato_:=7;
             s1:='+';
             Aggiorna2(s1); // 'A'
             end;
 if ((lastU=67)and(lastD=riga_menu+2)) or ((lastU=73) and (lastD=255)) then
             begin
             old_stato_:=stato_;
             stato_:=8;
             s1:='-';
             Aggiorna2(s1); // 'I'
             end;
 if ((lastU=67)and(lastD=riga_menu+3)) or ((lastU=78) and (lastD=255)) then
             begin
             old_stato_:=stato_;
             stato_:=9;
             s1:='=';
             Aggiorna2(s1); // 'N'
             end;
 if lastD=255 then  {ALT}
    begin
    colore;
    case lastU of
      79: begin
          old_stato_:=stato_;
          stato_:=6;
          S2:='O';
          if not binario then
                      begin
                      c:='O';
                      Aggiorna1(S2);
                      end;
          end;
      48: begin
          old_stato_:=stato_;
          stato_:=6;
          S2:='B';
          if binario then
                      begin
                      c:='B';
                      Aggiorna1(S2);
                      end;
          end;
      25: begin
          old_stato_:=stato_;
          stato_:=5;
          S2:='P';
          Aggiorna1(S2);
          end;
      19: begin
          old_stato_:=stato_;
          stato_:=4;
          S2:='R';
          Aggiorna1(S2);
          end;
      end;
    if stato_=1 then gotoxy(posto,riga_menu+4);
    end;
 if (stato=1)and(old_stato_<>stato_) then
            begin
            old_stato_:=stato_;
            pulisci_quadre;
            lo_statoXY(stato_);
            hidemouse;
            showmouse;
            if stato_>3 then cursorON;
            end;
until false;

n:=0;
for i:=1 to length(stringa) do
    if not (stringa[i] in ['0'..'9']) then
                      begin
                      n:=1;    {errore}
                      Break;
                      end;
i:=byte(n);
if i=0 then Val_Try(stringa,n,i);
if i<>0 then    {il numero inserito non ha senso}
        begin
        sonoro;
        goto next;
        end;
case S2 of          {il numero inserito ha senso}
    'P': begin             {pagina}
         if S1='+' then n:=foglio(iy)+n
                   else if S1='-' then n:=foglio(iy)-n;
         if (n>0)and(n<=foglio(ymax)) then
                 begin
                 iy:=(riga_menu-1)*n-(riga_menu-2);
                 y:=1;
                 x:=1;
                 x_riga:=1;
                 x_min:=1;
                 Evidenzia_Selezione;
                 old_stringa:=stringa;
                 end
                else
                 begin
                 sonoro;
                 goto next;
                 end;
         goto ricomincia;
         end;
    'R': begin             {riga}
         if s1='+' then n:=iy+n
                   else if s1='-' then n:=iy-n;
         if (n>0)and(n<=ymax) then
                 begin
                 iy:=n;
                 y:=1;
                 x:=1;
                 x_riga:=1;
                 x_min:=1;
                 Evidenzia_Selezione;
                 old_stringa:=stringa;
                 end
                else
                 begin
                 sonoro;
                 goto next;
                 end;
         goto ricomincia;
         end;
    'O': begin             {paragrafo}
         get_pragrafo_attuale_e_max(p_att,p_max); // ver 3.22
         if s1='+' then p_att:=p_att+n
                   else if s1='-' then p_att:=p_att-n
                                  else p_att:=n;
         if (p_att>0)and(p_att<=p_max) then
                 begin
                 x:=1;
                 x_riga:=1;
                 iy:=vai_al_paragrafo(p_att);
                 y:=byte(min(y,iy));
                 Evidenzia_Selezione;
                 old_stringa:=stringa;
                 end
                else
                 begin
                 sonoro;
                 goto next;
                 end;
         goto ricomincia;
         end;
    'B': begin
         if s1='+' then n:=tot+num_byte()+n
                   else if s1='-' then n:=tot+num_byte()-n;
         dec(n); {perche' parte da 0}
         ii:=Exist(percorso+nomefile);
         if ii<0 then Open_Error4 else
         if (ii<n+1)or(n<0) then  {punta oltre la dimensione del file}
                    begin
                    sonoro;
                    goto next;
                    end
                  else
                    begin    {iii contiene il massimo byte caricato in memoria}
                    iii:=tot+(ymax-1)*lunghezza_riga+length(testo[ymax])-1;
                    if (tot<=n)and(n<iii) then // si sposta dentro la parte di file gi… caricato
                      else
                       begin  // si sposta dentro una parte di file da caricare
                       tot:=n-(lunghezza_riga*MaxR div 2);
                       if tot<0 then tot:=0;   {punta a meta' testo prima}
                       Grafica;
                       Apertura_Bin;           {apre}
                       end;
                    iy:=((n-tot)div lunghezza_riga)+1;
                    y:=iy mod (riga_menu-1);
                    if y=0 then y:=riga_menu-1;
                    Set_Cursore_X((n-tot)-((iy-1)*lunghezza_riga)+1);
                    selezionato.x1:=byte(x_riga);
                    selezionato.x2:=byte(x_riga);
                    selezionato.y1:=iy;
                    selezionato.y2:=iy;
                    Evidenzia_Selezione;
                    old_stringa:=stringa;
                    end;
         goto ricomincia;
         end;
     end; {del case}
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Incolla_Attuale_in_Testo;
var i:integer;
    old_ins,aggiorna:boolean;
    app,undo:string;
begin
aggiorna:=false;
old_ins:=ins;
ins:=false;
normale;
gotoxy(x,y);
if ymax+num_elementi_appunti>MaxR then
    begin
    mess_err_inc;
    grafica;
    updatescreen(true); // ver 2.88
    end
   else
    begin
    app:=get_stringa_appunti(1);
    if app='' then
              begin
              ins:=old_ins;
              Exit; // la conversione da Esa a Txt e' tutta stringa non incollabile
              end;
    if dentro_selezione then M_modifica__Taglia_selezione(false); // esegue elimina 2.25
    Azzera_Selezione;
    aggiorna:=true;
    if (num_elementi_appunti=1) then
       begin
       if FreeAnnulla(1) then
          if integer(length(app)+length(testo[iy]))<=lunghezza_riga
             then
              begin
              Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+Zero(IntToStr(y),2)+Zero(inttostr(iy),4)+'I'+' '+char(length(app))+' '+char(length(testo[iy])))));
              Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
              end
             else
              begin
              Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+Zero(IntToStr(y),2)+Zero(inttostr(iy),4)+'Icb'+' '+char(length(app))+Zero(IntToStr(ymax),4))));
              Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
              end;
       if integer(length(app)+length(testo[iy]))>lunghezza_riga then
          begin
          if (iy<ymax) then // update ver 1.85 , 2.58
             begin
             inc(ymax);
             for i:=ymax downto iy+2 do testo[i]:=testo[i-1];
             testo[iy+1]:=#13;
             end;
          end;
       modifica:=true;
       for i:=1 to length(app) do
           if app<>#13 then
                        begin
                        no_update:=true;
                        Tasto__Tastiera(app[i]);
                        no_update:=false;
                        aggiorna:=true;
                        end
                       else
                        begin
                        vera_tastiera:=true;
                        Tasto__Invio();
                        vera_tastiera:=false;
                        Exit;
                        end;
       end;
    if (num_elementi_appunti>1) then
       begin
       undo:='1'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'i';
       if x_riga<>length(testo[iy]) then
           begin
           no_update:=true;
           Tasto__Invio();
           no_update:=false;
           dec(iy);
           dec(y);
           if y=0 then y:=1;
           Set_Cursore_X(length(testo[iy]));
           aggiorna:=true;
           undo:=undo+'V';
           end
          else undo:=undo+' ';
       if (ymax=1)and(testo[1]=#13) then
            begin
            dec(iy);
            dec(ymax);
            end
           else for i:=ymax downto iy+1 do testo[i+num_elementi_appunti]:=testo[i];
       ymax:=ymax+num_elementi_appunti;
       if FreeAnnulla(1) then
          begin
          Annulla_Txt.input_iniziale(strnew(stringtopchar(undo+zero(IntToStr(num_elementi_appunti),4))));
          Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
          end;
       while ymax+num_elementi_appunti>length(testo)-2 do setlength(testo,(length(testo)-2)*2+2); // ver 2.88
       for i:=1 to num_elementi_appunti do
              begin
              inc(iy);
              testo[iy]:=get_stringa_appunti(i);
              if copy(testo[iy],1,1)<>#13 then testo[iy]:=#13+testo[iy];
              end;
       Set_Cursore_X(length(testo[iy]));
       modifica:=true;
       end;
    end;
ins:=old_ins;
if aggiorna then Evidenzia_Selezione; {occorre se c'e' stato un incolla effettuato}
gotoxy(x,y);
tast_vuota;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Incolla_Attuale_in_Binario;  // ver 2.30
var i,j:longint;
    s,undo:string;
    old_x_riga,old_ymax:integer;
begin    // posso incollare solo a fine file (in coda) e se c'e' memoria a sufficienza
if not is_last_block then Exit;  // devo essere all'ultimo blocco
if not ( (iy=ymax)and(x_riga=length(testo[iy])) ) then Exit;  // devo essere alla fine del file in memoria
if free_testo_esa<Appunti[appunti_usato].Get_mem_usata then
   begin
   mess_err_inc;
   exit; // ver 2.88
   end;
normale;
gotoxy(x,y);
old_ymax:=ymax;
Azzera_Selezione;
undo:='1'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'1';
for i:=1 to num_elementi_appunti do
    begin
    s:=get_stringa_appunti(i);
    for j:=1 to length(s) do
        if length(testo[ymax])=lunghezza_riga+1 then
                                                begin
                                                inc(ymax);
                                                inc(iy);
                                                testo[ymax]:=#13+s[j];
                                                end
                                               else
                                                testo[ymax]:=testo[ymax]+s[j];
    end;
old_x_riga:=x_riga;
x_riga:=length(testo[ymax]);
if ymax=old_ymax then x:=byte(min(x+(x_riga-old_x_riga),80))
                 else x:=byte(min(x_riga,80));
x_min:=x_riga-x+1;
y:=byte(min(ymax,riga_menu-1));  // aggiorna X e Y
modifica:=true;
Evidenzia_Selezione;
tast_vuota;
if not FreeAnnulla(1) then Exit;    // preparo undo
Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
Annulla_Txt.input_iniziale(strnew(stringtopchar(undo)));
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_speciale__incolla_tutto; // ver 3.14
var i,old_appunti_usato,nuove_righe:integer;
    old_no_update:boolean;
begin
if SL then
      begin
      SL_Error;
      Exit;
      end;
old_appunti_usato:=appunti_usato;
nuove_righe:=0;
for i:=0 to length(appunti)-1 do inc(nuove_righe,Appunti[i].numelementi);
if Ymax+length(appunti)+nuove_righe>maxR then
   begin
   mess_err_inc;
   grafica;
   updatescreen(true);
   exit;
   end;

Annulla_Txt.input_iniziale(strnew(stringtopchar('1        A'))); // inizio incolla tutto
Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));

FreeAnnulla(nuove_righe);
old_no_update:=no_update;
no_update:=true;
for i:=1 to length(appunti) do
    begin
    if (i>1)or(length(appunti)>1) then
       begin
       vera_tastiera:=true;
       Tasto__Invio();
       vera_tastiera:=false;
       end;
    appunti_usato:=i-1;
    incolla_attuale_in_testo;
    end;
no_update:=true;
no_update:=old_no_update;
Evidenzia_selezione;

Annulla_Txt.input_iniziale(strnew(stringtopchar('1        a'))); // fine incolla tutto
Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));

appunti_usato:=old_appunti_usato;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_modifica__Incolla_Lista;  // ver 2.30 , 2.58 , 2.67 CTRL+V , 3.30
label again;
begin
if sono_Appunti() then Exit; // ver 3.28
if SL then
      begin
      SL_Error;
      Exit;
      end;
again:
case seleziona_appunti() of
     0: Exit;
     1: if binario then incolla_attuale_in_binario
                   else incolla_attuale_in_testo;
     2: M_speciale__incolla_tutto;
     3: if length(appunti)>0 then goto again;
     end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_modifica__Incolla_Ultimo;  // ver 2.67  Shift+Ins
// incolla l'ultimo appunto precedentemente scelto (o il primo se e' unico)
begin
if sono_Appunti() then Exit; // ver 3.28
if length(appunti)=0 then Exit;
if SL then
      begin
      SL_Error;
      Exit;
      end;
if binario then
       begin
       if not is_last_block then Exit;  // devo essere all'ultimo blocco
       if not ( (iy=ymax)and(x_riga=length(testo[iy])) ) then Exit;  // devo essere all'ultimo byte
       end;
if binario then incolla_attuale_in_binario
           else incolla_attuale_in_testo;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_speciale__Incolla_In_Riga(tutto:boolean);   { incolla a partire dalla riga Nø }
var i:integer;
begin
if SL then
      begin
      SL_Error;
      Exit;
      end;
ShowMouse;
Da_A_Graph;
if tutto then
         begin
         gotoxy(40-Lingue.get_length_txt(31) div 2,riga_menu+2);
         write(Lingue.get_txt(31));  // 'Incolla tutti gli appunti'
         end
        else
         begin
         gotoxy(40-Lingue.get_length_txt(32) div 2,riga_menu+2);
         write(Lingue.get_txt(32));   // 'Incolla gli appunti'
         end;
gotoxy(1,riga_menu+3);
write(Lingue.get_txt(33));  // 'A partire dalla riga:'
textcolor(yellow);
i:=1;
str_int(i,0,ymax);  // update ver 2.53
gotoxy(23,riga_menu+3);
write(i);
ShowMouse;
if i=0 then Exit;  {operazione di incolla annullata}
Set_Cursore_X(1);
iy:=i;
y:=iy mod (riga_menu-1);
if y=0 then y:=riga_menu-1;
if tutto then M_speciale__Incolla_tutto
         else M_modifica__incolla_Ultimo;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Selezione_Con_Mouse;  {ver 2.0, update 2.10}
var s_x,old_x:byte;
    s_iy,old_iy,app:integer;
    old_cl,cliccato:boolean;
    old_selezionato2:selez;
begin
{$ifndef go32v2} exit; {$endif}
old_selezionato2:=selezionato;       // 2.10
if selezionato.x1<>0 then
   begin
   Azzera_Selezione;
   Evidenzia_Selezione;
   end;
cliccato:=Doppio_Click.Mouse_Down(mox,moy,stato);
if cliccato then stato:=1
            else stato:=0;
if stato<>1 then Exit;
if (mox<max_larghezza)and(moy<riga_menu) then
                       begin
                       app:=iy;
                       x_riga:=mox+x_min-1;
                       x:=mox;
                       selezionato.x1:=byte(x_riga);
                       selezionato.y1:=Min((iy-y)+moy,ymax);
                       iy:=selezionato.y1;
                       y:=(iy-app)+y;
                       if x_riga>=length(testo[iy]) then
                          begin
                          x_riga:=length(testo[iy]);
                          x_min:=max(1,x_riga-79);
                          x:=x_riga-x_min+1;
                          Azzera_Selezione;
                          Exit;
                          end;
                       gotoxy(x,y);
                       textcolor(yellow);
                       textbackground(blue);
                       if binario then gotoxy(23,riga_menu+3)
                                  else gotoxy(23,riga_menu+4);
                       write(Lingue.get_txt(34));  // '    Inizio Selezione'
                       if binario then gotoxy(43,riga_menu+3)
                                  else gotoxy(43,riga_menu+4);
                       write('= Y:    X:');
                       textcolor(white);
                       if binario then gotoxy(53,riga_menu+3)
                                  else gotoxy(53,riga_menu+4);
                       write(x_riga);
                       if binario then gotoxy(47,riga_menu+3)
                                  else gotoxy(47,riga_menu+4);
                       write(iy);
                       normale;
                       end
                      else Exit;
selezionato.x2:=selezionato.x1;
s_x:=selezionato.x1;
selezionato.y2:=selezionato.y1;
s_iy:=selezionato.y1;
old_x:=255;  {valore errato che forza Evidenzia_Selezione}
old_iy:=iy;

repeat
 cliccato:=Doppio_Click.Mouse_Down(mox,moy,stato);
 if cliccato then stato:=1
             else stato:=0;
 if (stato=1)and(mox=max_larghezza)and(moy=1) then
        begin
        old_CL:=cl;
        cl:=false;
        Tasto__Su();
        cl:=old_CL;
        gotoxy(x,y);
        ShowMouse;
        ShowMouse;
        Delay2(ClickDelay);
        end;
 if ((stato=1)and(mox=max_larghezza)and(moy=riga_menu-1)) or ((stato=1)and(moy>riga_menu-1)) then
        begin
        old_CL:=cl;
        cl:=false;
        Tasto__Giu();
        cl:=old_CL;
        gotoxy(x,y);
        ShowMouse;
        ShowMouse;
        Delay2(ClickDelay);
        end;

 if moy>riga_menu-1 then moy:=riga_menu-1;
 app:=iy;
 selezionato.y2:=Min((iy-y)+moy,ymax);
 iy:=selezionato.y2;
 y:=(iy-app)+y;
 x_riga:=mox+x_min-1;
 x:=mox;
 selezionato.x2:=byte(x_riga);
 if (selezionato.y1=selezionato.y2)and(selezionato.x1-1=selezionato.x2)and
    (mox>=length(testo[iy])) then Azzera_Selezione;
 selezionato.x1:=s_x;
 selezionato.y1:=s_iy;
 scambio; {obbligatorio}
 gotoxy(x,y);
 HideMouse;
 ShowMouse;
 if (old_x<>x) or (old_iy<>iy) then
            begin
            old_x:=x;
            old_iy:=iy;
            adiacente:=false;
            Evidenzia_Selezione;
            ShowMouse;
            ShowMouse;
            end;
 {$ifdef go32v2}
  cliccato:=Doppio_Click.Mouse_Up(mox,moy,stato);
 {$else}
  cliccato:=Doppio_Click.Mouse_Down(mox,moy,stato);
 {$endif}
 if cliccato then stato:=1
             else stato:=0;
until stato=1;
colore;
if binario then gotoxy(27,riga_menu+3)       {grafica off di inizio selezione}
           else gotoxy(27,riga_menu+4);
write('                            ');
stato:=0;  {per non attivare la barra verticale di destra}
if (selezionato.y2=iy)and(selezionato.x2>=length(testo[iy]))and(selezionato.x2>1) then
   begin
   dec(selezionato.x2);
   while x_riga>length(testo[iy])-1 do  // add ver 2.92
     begin
     dec(x_riga);
     dec(x);
     x:=byte(max(x,1));
     x_riga:=max(x_riga,1);
     if (x_riga=1)or(x=1)then break;
     end;
   if (selezionato.x2<selezionato.x1)and(selezionato.y2=selezionato.y1) then Azzera_Selezione;
   Evidenzia_Selezione;
   end;
if (selezionato.x2=selezionato.x1)and(selezionato.y1=selezionato.y2) then
   begin
   selezionato:=old_selezionato2;  // 2.10, era Azzera_Selezione
   Evidenzia_Selezione;
   Exit;
   end;
if (mox=selezionato.x2)and(moy=selezionato.y2) then // seleziono verso il basso
   if (selezionato.x2>0)and(selezionato.x1>0) then
       begin
       if mox>length(testo[iy])-1 then Exit;
       if length(testo[selezionato.y2])=0 then dec(selezionato.x2);
       if selezionato.x2=0 then
                       begin
                       dec(selezionato.y2);
                       selezionato.x2:=length(testo[selezionato.y2])-1;
                       end;
       if not selezione_quadrata then Evidenzia_Selezione;  // aggiunto l' IF in ver 2.25
       end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_modifica__Seleziona_Tutto; // ver 2.45
begin
if testo_vuoto then Exit;
selezionato.x1:=1;
selezionato.y1:=1;
selezionato.x2:=length(testo[ymax])-1;
selezionato.y2:=ymax;
Evidenzia_selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Click_Testo{$ifndef go32v2}(cliccato: boolean){$endif};
var old_iy,deltaY,i,old_x_min,old_x_riga:integer;
    mox_ok,moy_ok,old_y,old_x,old_l:byte;
    ok,old_cl{$ifdef go32v2},cliccato{$endif}:boolean;
begin
old_x_min:=x_min;
old_x:=x;
old_x_riga:=x_riga;
ShowMouse;
ok:=false;
{$ifdef go32v2}
cliccato:=Doppio_Click.Mouse_Down(mox,moy,stato);
{$endif}
if cliccato then stato:=1
            else stato:=0;
if stato=1 then
           begin
           mox_ok:=mox;
           moy_ok:=moy;
           ok:=true;
           Undo__Tastiera; { ver 1.80 }
           if mox=max_larghezza then     // ver 2.61
              begin
              Doppio_Click.empty_mouse;
              Exit; // possibile click su barra verticale: non deve avere effetto di selezione
              end;
           end;
if Doppio_Click.More_Click(5) then M_modifica__Seleziona_Tutto
   else
if Doppio_Click.More_Click(4) then seleziona_paragrafo  // ver 3.01
   else
if Doppio_Click.More_Click(3) then Seleziona_Riga_Attuale
   else
if Doppio_Click.Double_Click then DoppioClick;
if Doppio_Click.move then Doppio_Click.empty_mouse;

old_iy:=iy;
old_y:=y;
old_cl:=cl;
cl:=false;
if ok and (stato=1)and(moy_ok<riga_menu)and(mox_ok<max_larghezza) then
      begin
      mox:=mox_ok;
      moy:=moy_ok;
      deltaY:=y-moy;
      x:=1;
      x_reale:=x;
      x_min:=1;
      x_riga:=1;
      if deltaY>0 then for i:=1 to deltaY do Tasto__Su();
      if deltaY<0 then
         begin
         for i:=-1 downto deltaY do Tasto__Giu();
         showmouse;
         end;
      if old_CL then
                begin
                cl:=true;
                if FreeAnnulla(1) then
                               begin
                               Undo__Tastiera;
                               old_l:=length(testo[iy]);
                               no_update:=true;
                               while length(testo[iy])<mox+old_x_min-1 do
                                     begin
                                     if x_riga>=lunghezza_riga then Break; // update ver 1.85
                                     Tasto__Destra;
                                     end;
                               no_update:=false;
                               x_min:=old_x_min;
                               x:=mox;
                               x_riga:=x_min+x-1;
                               x_reale:=x;
                               Evidenzia_Selezione;
                               Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'M'+zero(inttostr(old_l),3)
                                   +zero(inttostr(old_x),3)+zero(inttostr(old_y),2)+zero(inttostr(old_iy),4)+zero(inttostr(old_x_riga),3)+zero(inttostr(x_riga),3)+zero(inttostr(length(testo[iy])),3) )));
                               Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
                               end;
                info;
                end
               else // no old_CL
                begin
                x_min:=old_x_min;
                if x_min>length(testo[iy]) then
                               begin
                               x_riga:=length(testo[iy]);
                               x_min:=x_riga-mox+1;
                               if x_min+mox>length(testo[iy]) then x_min:=1;
                               end
                              else
                               begin
                               x_riga:=min(length(testo[iy]),x_min+mox-1);
                               if x_min>=x_riga then x_min:=max(x_riga-mox+1,1); // ver 2.69 con IF
                               end;
                if (x_riga-x_min>79) then x_min:=max(x_riga-79,1)
                   else
                    if (x_riga<x_min) then x_min:=1;
                x:=byte(max(x_riga-x_min+1,1));
                x_reale:=x;
                if old_x_min<>x_min then
                   begin
                   Evidenzia_Selezione;
                   aspetto_rilascio;
                   end;
                end;
      Selezione_Con_Mouse;
      end;
{$ifdef go32v2}                          // click invertito
if mancino then cliccato:=Doppio_Click.Mouse_Up_L(mox,moy,stato)
           else cliccato:=Doppio_Click.Mouse_Up_R(mox,moy,stato);
if cliccato then stato:=1
            else stato:=0;
if (stato=1)and(selezionato.x1<>0)and(mox>1)and(mox<max_larghezza)and(moy<riga_menu) then
   begin
   Azzera_Selezione;
   evidenzia_selezione;
   end;
{$endif}

if (stato=1)and(mox>1)and(mox<max_larghezza)and(moy<riga_menu) then
   if (ShiftStateToString(PollShiftStateEvent(),False)='SHIFT') then
      begin  // ver 2.92  Shift + Click ?
      Azzera_Selezione;
      selezionato.x1:=old_x_min+old_x-1;
      selezionato.y1:=old_iy;
      selezionato.x2:=byte(x_riga);
      selezionato.y2:=iy;
      if selezionato.y1>selezionato.y2 then
         begin
         exchange(selezionato.y1,selezionato.y2);
         exchange(selezionato.x1,selezionato.x2);
         end else
      if (selezionato.y1=selezionato.y2)and(selezionato.x1>selezionato.x2) then exchange(selezionato.x1,selezionato.x2);
      evidenzia_selezione;
      end;
if (old_y<>y)or(old_x<>x)or(old_x_min<>x_min) then Info;
if (not binario) and (iy<>old_iy) then
             begin
             hidemouse;
             showmouse;
             end;
cl:=old_cl;
init;
gotoxy(x,y);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Ctrl_Destra;
var stringa:string;
    xx,old_x_min,iyy:integer;
begin
if (x_riga=length(testo[ymax]))and(iy=ymax) then Exit;
if (length(testo[iy])<3) then
      begin
      Tasto__Destra;
      Exit;
      end;
old_x_min:=x_min;
stringa:=testo[iy];
convert(stringa);
xx:=x_riga+1;
iyy:=iy;
repeat
 inc(xx);
 if (xx-1<length(stringa))and(stringa[xx]<>#13)and(xx>length(stringa))and(iyy<ymax) then
      begin
      inc(iyy);
      stringa:=testo[iyy];
      convert(stringa);
      x_riga:=1;
      x_min:=1;
      xx:=1;
      inc(y);
      if y=riga_menu then
            begin
            y:=riga_menu-1;
            Tasto__Giu();
            Evidenzia_Selezione;
            end;
      x:=byte(max(1,xx-x_min+1));
      gotoxy(x,y);
      end;
until ((iyy>=ymax) and (xx>=length(stringa))) or (xx>length(stringa)) or (stringa[xx]<>#13);
if xx>length(stringa) then  // ver 2.69
   begin
   Tasto__Destra;
   Exit;
   end;
if iyy>ymax then
     begin
     Set_Cursore_X(length(testo[ymax]));
     iy:=ymax;
     end
    else
     begin
     x_riga:=xx-1;
     if x_min>x_riga then
                begin
                x_min:=x_riga;
                x:=1;
                x_reale:=x;
                end;
     fix_position;
     x:=byte(max(1,x_riga-x_min+1));
     iy:=iyy;
     end;
x_reale:=x;
if (iyy=ymax)and(stringa[xx]=#13) then Set_Cursore_X(length(testo[ymax])); {limite estremo}
if (binario and (x_riga=lunghezza_riga+1) ) then
   begin
   Tasto__Destra;
   if x_riga<>1 then
           begin
           Set_Cursore_X(byte(lunghezza_riga));
           Tasto__Giu();
           end;
   end;
if old_x_min<>x_min then Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Ctrl_Sinistra;
var stringa:string;
    old_x_riga,xx,old_x_min,old_iy,iyy:integer;
begin
if (iy=1) and (x_riga=1) then
                    begin
                    if binario then Tasto__Su();
                    Exit;
                    end;
if length(testo[iy])<3 then
      begin
      Tasto__Sinistra;
      Exit;
      end;
old_iy:=iy;
old_x_min:=x_min;
old_x_riga:=x_riga;
stringa:=testo[iy];
convert(stringa);
xx:=x_riga;
iyy:=iy;
repeat
 dec(xx);
 if xx=0 then
    begin
    Tasto__Sinistra; // ver 2.69
    Exit;
    end;
 if (stringa[xx]<>#13)and(xx<=1)and(iyy>0) then
      begin
      dec(iyy);
      stringa:=testo[iyy];
      convert(stringa);
      xx:=length(stringa);
      if y>1 then dec(y)
             else if iyy>=1 then Tasto__Su();
      end;
until (stringa[xx]<>#13) or ((iyy<1) and (xx>=1)) or ((iyy>1) and (xx=1)) {add ver 2.88};
if iyy<1 then
     begin
     Set_Cursore_X(1);
     iy:=1;
     end
    else
     begin
     x_riga:=max(xx-1,1);
     if x_min>x_riga then x_min:=x_riga;
     if (old_x_riga-x_riga<80)and(old_x_riga-x_riga>1) then x:=byte(max(x-(old_x_riga-x_riga),1))
                                                       else x:=byte(min(80,x_riga));
     x_reale:=x;
     x_min:=max(x_riga-x+1,1);
     if x_min>x_riga then x_min:=x_riga;
     iy:=iyy;
     end;
if binario and (x_riga=lunghezza_riga+1) then Set_Cursore_X(x_riga-1);
if (old_x_min<>x_min)or(old_iy<>iy) then Evidenzia_Selezione
                                    else gotoxy(x,y);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Click_Verticale_si_pag;
var quanto:byte;
begin
if verticale<moy then
                  begin
                  quanto:=ymax div (riga_menu-2);
                  if quanto=0 then quanto:=1;
                  if iy=ymax then Exit;
                  iy:=iy+quanto;
                  if iy>ymax then
                            begin
                            iy:=ymax;
                            y:=(riga_menu-1);
                            end;
                  if ymax<riga_menu then y:=byte(iy);
                  if x>length(testo[iy]) then Set_Cursore_X(length(testo[iy]));
                  delay2(clickdelay);
                  evidenzia_selezione;
                  end
                 else if verticale>moy then
                       begin
                       quanto:=ymax div (riga_menu-2);
                       if quanto=0 then quanto:=1;
                       if iy=1 then Exit;
                       iy:=iy-(quanto);
                       if iy<1 then
                              begin
                              iy:=1;
                              y:=1;
                              end;
                       if x>length(testo[iy]) then Set_Cursore_X(length(testo[iy]));
                       delay2(clickdelay);
                       evidenzia_selezione;
                       end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Click_Verticale_no_pag;
var quanto,old_iy:integer;
begin
if (iy=ymax)and(x=length(testo[iy]))and(moy=riga_menu-2) then Exit;
if (iy=1)and(x=1)and(moy=2) then Exit;
old_iy:=iy;
quanto:=ymax div (riga_menu-2);
if quanto=0 then quanto:=1;
iy:=moy * quanto-1; //originale: senza -1
if moy=2 then iy:=1;
if moy=riga_menu-2 then
          begin
          Tasto__CTRL_Fine;
          info;
          Exit;
          end;
if iy>ymax then iy:=ymax;
if iy=old_iy then Exit;
Evidenzia_Selezione;
y:=1;
Set_Cursore_X(1);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Click_Verticale;
begin
if barra_pag then Click_Verticale_si_pag
             else Click_Verticale_no_pag;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Ctrl_Shift_Sinistra;
begin
if (iy=1) and (x_riga=1) then Exit;
old_selezionato:=selezionato;
selezionato.y2:=iy;
selezionato.x2:=byte(x_riga);
if x_riga>1 then dec(selezionato.x2);
no_update:=true;
Tasto__Ctrl_Sinistra;
no_update:=false;
selezionato.y1:=iy;
selezionato.x1:=byte(x_riga);
if (selezionato.x1=length(testo[iy])) and (testo[iy]<>#13) then
   begin
   selezionato.y1:=iy+1;
   selezionato.x1:=1;
   end;
adiacente:=old_selezionato.x1<>0;
testo[0]:='ctrl_shift_sinistra';
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Shift_Destra;
begin
if (iy=ymax) and (x_riga=length(testo[iy])) then Exit;
if (x_riga=length(testo[iy])) and (wherex<79) and cl and (x_riga<>1) then // update ver 1.90
         begin
         Tasto__Destra;
         Tasto__Sinistra;
         Tasto__Shift_Destra;
         Exit;
         end;
old_selezionato:=selezionato;
selezionato.x1:=byte(x_riga);
selezionato.y1:=iy;
selezionato.x2:=byte(x_riga);
selezionato.y2:=iy;
no_update:=true;
Tasto__Destra;
no_update:=false;
if old_selezionato.x1<>0 then adiacente:=true;
testo[0]:='shift_destra';
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Ctrl_Shift_Destra;
begin
if (iy=ymax)and(x_riga=length(testo[ymax])) then Exit;
old_selezionato:=selezionato;
if (x_riga=length(testo[iy])) and (length(testo[iy])>1) then
   begin
   Tasto__Shift_Destra;
   Exit;
   end;
selezionato.y1:=iy;
selezionato.x1:=byte(x_riga);
no_update:=true;
Tasto__Ctrl_Destra;
no_update:=false;
selezionato.y2:=iy;
selezionato.x2:=byte(x_riga);
if (length(testo[iy])>1) then dec(selezionato.x2);
if (selezionato.y1=ymax)and(selezionato.x2=length(testo[ymax])) then dec(selezionato.x2);
if (selezionato.x1=1) and (selezionato.y1=1) then else adiacente:=true;
testo[0]:='ctrl_shift_destra';
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Ctrl_Shift_Fine;
begin
if (x_riga=length(testo[iy]))and(iy=ymax) then Exit; {se e' alla fine non fa nulla}
old_selezionato:=selezionato;
if x_riga=length(testo[iy]) then Tasto__Destra;
selezionato.x1:=byte(x_riga);
selezionato.y1:=iy;
selezionato.x2:=length(testo[ymax]);
if selezionato.x2>1 then dec(selezionato.x2); {non decrementa se e' = #13}
selezionato.y2:=ymax;
adiacente:=true;
if (x_riga=1)and(iy=1)and(old_selezionato.x1=0) then old_selezionato.x1:=1;
testo[0]:='ctrl_shift_fine';
no_update:=true;
Tasto__Ctrl_Fine;
no_update:=false;
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Shift_Sinistra;
var condizione:boolean;
begin
if (iy=1) and (x_riga=1) then Exit;
condizione:=binario and (x_riga=1);
old_selezionato:=selezionato;
testo[0]:='shift_sinistra';
if x_riga=1 then
        begin
        if (testo[iy-1]=#13) then
              if (selezionato.x1=1)and(selezionato.y1=iy) then selezionato.y1:=iy-1
                                                          else
                                                           begin
                                                           Tasto__Sinistra;
                                                           selezionato.x1:=1;
                                                           selezionato.y1:=iy;
                                                           selezionato.x2:=1;
                                                           selezionato.y2:=iy;
                                                           Adiacente:=true; // update ver 1.90
                                                           Evidenzia_Selezione;
                                                           Exit;
                                                           end;
        Tasto__Sinistra;
        end
       else  // x_riga era <> 1
        begin
        Tasto__Sinistra;
        selezionato.x1:=byte(x_riga);
        selezionato.y1:=iy;
        selezionato.x2:=byte(x_riga);
        selezionato.y2:=iy;
        adiacente:=true;
        Evidenzia_Selezione;
        end;
if condizione then Set_Cursore_X(lunghezza_riga+1);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Shift_Su;  {update ver 1.85}
begin
if iy=1 then Exit;
old_selezionato:=selezionato;
selezionato.x2:=byte(x_riga); {se la riga= solo #13}
if x_riga>1 then selezionato.y2:=iy
            else
             begin  // la selezione sale di una riga
             selezionato.x2:=byte(max(length(testo[iy-1])-1,1));
             selezionato.y2:=iy-1;
             end;
no_update:=true;
vera_tastiera:=true;// ver 3.40 fix bug
Tasto__Su();
vera_tastiera:=false; // ver 3.40 fix bug
no_update:=false;
selezionato.y1:=iy;
selezionato.x1:=byte(x_riga);
if selezionato.x2=length(testo[selezionato.y2])-1 then
                           else if (selezionato.x2>1) then dec(selezionato.x2);
if x_riga>selezionato.x1 then inc(selezionato.x1);
if (selezionato.x1=length(testo[iy])) and (testo[iy]<>#13) then
   begin
   selezionato.y1:=iy+1;
   selezionato.x1:=1;
   end;
adiacente:=true;
testo[0]:='shift_su';
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Ctrl_Shift_Pag_Giu;
begin
if (y=riga_menu-1) and (x_riga=length(testo[iy])) then Exit;
old_selezionato:=selezionato;
if (length(testo[iy])>1)and(length(testo[iy])=x_riga) then Tasto__Destra;
selezionato.x1:=byte(x_riga);
selezionato.y1:=iy;
if (x_riga=1)and(iy=1)and(old_selezionato.x1=0) then old_selezionato.x1:=1;
Tasto__Ctrl_Pag_Giu;
selezionato.y2:=iy;
selezionato.x2:=byte(x_riga);
if selezionato.x2>1 then dec(selezionato.x2);
adiacente:=true;
testo[0]:='ctrl_shift_pag_giu';
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Shift_Pag_Giu;
begin
if (length(testo[iy])>1)and(length(testo[iy])=x_riga) then Tasto__Destra;
if (x_riga=length(testo[iy])) and (iy=ymax) then Exit;
old_selezionato:=selezionato;
selezionato.x1:=byte(x_riga);
selezionato.y1:=iy;
if old_selezionato.x1=0 then   {se prima no selezione, occorre eseguire queste righe}
     begin
     selezionato.x2:=byte(x_riga);
     selezionato.y2:=iy;
     old_selezionato.y1:=selezionato.y1;
     old_selezionato.y2:=selezionato.y2;
     old_selezionato.x1:=selezionato.x1;
     old_selezionato.x2:=selezionato.x2;
     end;
Tasto__Pag_Giu();
selezionato.y2:=iy;
selezionato.x2:=byte(x_riga);
dec(selezionato.x2);
if selezionato.x2=0 then
   begin
   dec(selezionato.y2);
   selezionato.x2:=length(testo[selezionato.y2]);
   end;
adiacente:=true;
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Shift_Giu; { update ver 1.85 }
var old_x_riga,old_iy:integer;
begin
if iy=ymax then Exit;
old_selezionato:=selezionato;
old_x_riga:=x_riga;
old_iy:=iy;
Tasto__Giu();
selezionato.x1:=byte(old_x_riga);
selezionato.y1:=old_iy;
if (length(testo[selezionato.y1])>1)and(length(testo[selezionato.y1])=x_riga) then
   begin
   inc(selezionato.y1);
   selezionato.x1:=1;
   end;

selezionato.y2:=iy;
selezionato.x2:=byte(x_riga);
if ((x_riga=length(testo[iy])) or (length(testo[iy])=1)) then
                                                         else if not selezione_quadrata then dec(selezionato.x2);
if (selezionato.x2>=length(testo[iy])) and (testo[iy-1]<>#13) then dec(selezionato.x2);
if selezionato.x2=0 then {conseguenza della riga precedente (if...)}
                    begin
                    dec(selezionato.y2);
                    selezionato.x2:=length(testo[selezionato.y2])-1;
                    end;
if old_selezionato.x1=0 then if (testo[iy-1]<>#13) then old_selezionato.x1:=1 {solo per 1,1 e selezione mai fatta}
                                                   else
                                                    begin
                                                    selezionato.x1:=selezionato.x2; {solo per 1,1 e selezione mai fatta}
                                                    selezionato.y1:=selezionato.y2;
                                                    end;
adiacente:=true;
testo[0]:='shift_giu';
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure CercaInBinario;
var pos_start,pos_end,posizione,stop{pausa}:int64;
    salva_next_length:integer;
label restart;
begin
IOF:=false;  {lettura errata}
if sotto_ then pos_start:=num_byte()+tot+1
          else pos_end:=num_byte()+tot-1;
restart:

Pulisci1;
{$ifdef TxtCrt}
gotoxy(1,riga_menu+1);
write(Lingue.get_txt(35));   // 'Ricerca stringa in corso...'
{$else}
outtextxy(0,riga_menu,'                                                                                   ',0,blue,white);
outtextxy(1,riga_menu,Lingue.get_txt(35),0,blue,white);
{$endif}
gotoxy(1,riga_menu+4);
write('                                                                         ');
if sotto_ then posizione:=CercaInFile(percorso+nomefile,cerco,false,jolly,ignora,pos_start,-1,stop)
          else posizione:=CercaInFile(percorso+nomefile,cerco,true,jolly,ignora,1,pos_end,stop);
if (posizione=-1)or(posizione=-4) then
    begin
    Not_Found; {stringa non trovata}
    Exit;
    end else
if (posizione=-7) then
    begin
    hidemouse;
    gotoxy(1,riga_menu+2);
    write('                                                                          ');
    gotoxy(1,riga_menu+3);
    write('                                                                          ');
    gotoxy(2,riga_menu+3);
    write(Lingue.get_txt(36));  // 'Ricerca in pausa. Continuare ?'
    if Tasti_SN(35,riga_menu+3)='S' then
                                    begin
                                    if sotto_ then pos_start:=stop
                                              else pos_end:=stop;
                                    goto restart;
                                    end
                                   else Exit;
    end else
if (posizione=-5) then Exit else {errore in lettura, riprova=no}
if (posizione=-6) then Exit; {tasto ESC}

IOF:=true; {lettura corretta}
tot:=posizione-1-(lunghezza_riga*MaxR div 2);
if tot<0 then tot:=0;   {punta a meta' testo prima}
Grafica;
salva_next_length:=next_length_ESA;  // anche se ho cambiato la lunghezza della
next_length_ESA:=lunghezza_riga;     //  riga alla prossima apertura del file, non
Apertura_Bin;                        //  devo modificare la lunghezza di quello
next_length_ESA:=salva_next_length;  //  attuale durante la ricerca
iy:=((posizione-tot)div lunghezza_riga)+1;
y:=iy mod (riga_menu-1);
if y=0 then y:=riga_menu-1;     {e si posiziona dove indicato}
Set_Cursore_X((posizione-tot)-((iy-1)*lunghezza_riga));
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Tastiera_UnoS(c:char);  { update ver 1.80 }
var i:byte;
    NewLine:string;
    old_ins:boolean;
label Normale;
begin
if ord(c) in unprintable then Exit;
if (unoS=false)or(c=' ') then
  begin
  normale:
  vera_tastiera:=true;
  Tasto__Tastiera(c);
  vera_tastiera:=false;
  Exit;
  end;
NewLine:=testo[iy];  {preparo riga per il test}
for i:=length(testo[iy]) to lunghezza_riga do NewLine:=NewLine+#2;
if iy<ymax then NewLine:=NewLine+copy(testo[iy+1],2,2)
           else NewLine:=NewLine+#2+#2;
if copy(NewLine,x_riga+1,2)='  ' then
   begin
   if FreeAnnulla(1) then
       begin
       Annulla_Txt.input_iniziale(strnew(stringtopchar('0'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'U'+c)));
       Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
       end;
   old_ins:=ins;
   ins:=true;
   Tasto__Tastiera(c);
   ins:=old_ins;
   Evidenzia_Selezione;
   end
  else goto Normale;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Canc_UnoS;
var t,c:string;
    first:boolean;
    l:byte;
begin
if (iy=ymax) then
   begin
   sonoro;
   Exit;
   end;
if (testo[iy]=#13) or (length(testo[iy])+length(testo[iy+1])-1<lunghezza_riga+1) then
   begin                             // update ver 1.81
   vera_tastiera:=true;
   Tasto__Canc(true);
   vera_tastiera:=false;
   Exit;
   end;
Azzera_Selezione;
first:=true;
l:=length(testo[iy]);
t:=#0; {va bene qualunque cosa}
while t<>'' do
      begin
      Testa_Coda(Copy_end(testo[iy+1],2),' ',t,c);
      if (t='')or(length(testo[iy]+t)>=lunghezza_riga+1) then
         if first then
                  begin
                  vera_tastiera:=true;
                  Tasto__Canc(true);
                  vera_tastiera:=false;
                  Evidenzia_Selezione;
                  Exit;
                  end
                else Break;
      first:=false;
      testo[iy]:=testo[iy]+t;
      testo[iy+1]:=#13+c;
      end;
if FreeAnnulla(1) then
   begin
   if vera_tastiera then Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'b'+zero(inttostr(length(testo[iy])-l),3) )))  // back-space unoS
                    else Annulla_Txt.input_iniziale(strnew(stringtopchar('1'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'c'+zero(inttostr(length(testo[iy])-l),3) ))); // canc unoS
   Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
   end;
modifica:=true;
Evidenzia_Selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Back_Space_UnoS;
var old_iy:integer;
begin
if iy=1 then
        begin
        sonoro;
        Exit;
        end;
old_iy:=iy;
Tasto__Sinistra;
vera_tastiera:=true;
Tasto__Canc_UnoS;
vera_tastiera:=false;
if iy=old_iy then Tasto__Sinistra;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Undo__Canc(riga:string);   // struttura 0|1 x y iy C [char [ymax]]
var i:integer;                { ver 1.80 , update  3.15 }
    old_ins:boolean;
begin
undo__x_ripristina(riga);
y:=byte(StrToInt(copy(riga,4,2)));
iy:=StrToInt(copy(riga,6,4));
case length(riga) of
      10: begin    // 2 righe furono fuse in 1
          inc(ymax);
          for i:=ymax-1 downto iy+1 do testo[i+1]:=testo[i];
          testo[iy+1]:=#13+copy_end(testo[iy],x_riga+1);
          setlength(testo[iy],x_riga);
          end;
      11: insert(riga[11],testo[iy],x_riga+1);  // reinserisco carattere
      19: begin    // si ripercuote su piu' righe
          if ymax<StrToInt(copy(riga,16,4)) then
             begin
             ymax:=StrToInt(copy(riga,16,4));
             for i:=ymax-1 downto iy+StrToInt(copy(riga,12,4)) do testo[i+1]:=testo[i];
             testo[iy+StrToInt(copy(riga,12,4))]:=#13;
             end;
          old_ins:=ins;
          ins:=false;
          no_update:=true;
          Tasto__Tastiera(riga[11]);
          no_update:=false;
          ins:=old_ins;
          undo__x_ripristina(riga);
          y:=byte(StrToInt(copy(riga,4,2)));
          iy:=StrToInt(copy(riga,6,4));
          end;
      end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Redo__Scrivi(riga:string);  // ver 3.15
var a,b:longint;
begin
a:=Annulla_Txt.numelementi();
b:=Annulla_selezione.numelementi();
no_update:=true;
Tasto__Tastiera_UnoS(riga[length(riga)]);
no_update:=false;
while a<Annulla_Txt.numelementi() do Annulla_Txt.cancella_iniziale;
while b<Annulla_selezione.numelementi() do Annulla_selezione.cancella_iniziale;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Redo__Incolla_Riga; // ver 3.15
var a,b:longint;
begin
a:=Annulla_Txt.numelementi();
b:=Annulla_selezione.numelementi();
M_modifica__Incolla_Ultimo;
while a<Annulla_Txt.numelementi() do Annulla_Txt.cancella_iniziale;
while b<Annulla_selezione.numelementi() do Annulla_selezione.cancella_iniziale;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Redo__Incolla_Tutto; // ver 3.15
var a,b:longint;
begin
a:=Annulla_Txt.numelementi();
b:=Annulla_selezione.numelementi();
M_speciale__incolla_tutto; // ver 3.14
while a<Annulla_Txt.numelementi() do Annulla_Txt.cancella_iniziale;
while b<Annulla_selezione.numelementi() do Annulla_selezione.cancella_iniziale;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Redo__Canc_UnoS; // ver 3.15
var a,b:longint;
begin
a:=Annulla_Txt.numelementi();
b:=Annulla_selezione.numelementi();
Tasto__Canc_UnoS;
while a<Annulla_Txt.numelementi() do Annulla_Txt.cancella_iniziale;
while b<Annulla_selezione.numelementi() do Annulla_selezione.cancella_iniziale;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_modifica__Annulla_Undo(ann:boolean);    // ver 1.80 , update 2.25 , 2.30
var p,selez:ptrx;  // ann= true: annulla,  ann= false: ripristina
    old_riga,riga,sel:string;
    first,incolla_tutto:boolean;
    old_x,old_y:byte;
    old_iy,old_x_min,old_x_riga:integer;
begin
first:=true;  // regola: Se ripristina non Š vuoto e c'Š nuovo anulla, allora azzero ripristina
incolla_tutto:=false;
repeat
 if ann then p:=Annulla_Txt.l
        else p:=Ripristina_Txt.l;
 if p=nil then Exit;
 riga:=strpas(p^.info);
 if ann then selez:=Annulla_Selezione.l
        else selez:=Ripristina_Selezione.l;
 sel:=strpas(selez^.info);
 if first then
    begin
    old_x_min:=x_min;
    old_x_riga:=x_riga;
    old_x:=x;
    old_iy:=iy;
    old_y:=y;
    if not (riga[10] in ['A','a']) then undo__x_ripristina(riga);
    if (length(riga)=11) and (riga[10]='B') and ann then  // per back-space
       begin
       x_riga:=x_riga-1;
       x:=byte(max(x-1,1));
       fix_position;
       end;
    if not (riga[10] in ['A','a']) then
       begin
       y:=byte(StrToInt(copy(riga,4,2)));
       iy:=StrToInt(copy(riga,6,4));
       gotoxy(x,y);
       end;
    case riga[10] of
         'i','I','C','<','>','^','|','c','M','F','q','1',  '+','-','S',#9,'ñ','0','2': // add +-S#9ñ02 ver 3.04
              if (old_x<>x)or(old_iy<>iy)or(old_x_min<>x_min)or(old_x_riga<>x_riga) then
                 begin
                 if (riga[10]='M') and (not ann) then {nulla} else
                 if not incolla_tutto then
                                      begin
                                      Evidenzia_Selezione;
                                      Exit;
                                      end;
                 end;
         'Y': ; // cambio numero colonne  ver 3.26
         'E','T':
              if (old_x<>x)or(old_iy<>iy)or(old_x_min<>x_min) then
                 if not incolla_tutto then
                                      begin
                                      Evidenzia_Selezione;
                                      Exit;
                                      end;
         'V': if (old_iy<>iy+1) and ann then // ver 3.15
                                begin
                                inc(iy);
                                if y<riga_menu-1 then inc(y);
                                Set_Cursore_X(1);
                                if not incolla_tutto then
                                   begin
                                   Evidenzia_Selezione;
                                   Exit;
                                   end;
                                end;
         'b': if (old_x<>x)or(old_iy<>iy) then
                                          begin
                                          Tasto__Destra;
                                          if not incolla_tutto then
                                             begin
                                             Evidenzia_Selezione;
                                             Exit;
                                             end;
                                          end;
         'B': if (old_x<>x)or(old_iy<>iy) then
                 if not incolla_tutto then
                                      begin
                                      Evidenzia_Selezione;
                                      Exit;
                                      end;
         'L' : if ann then
               case riga[11] of
                    'D' : if (old_x<>min(x+1,80))or(old_iy<>iy)or(old_x_riga<>x_riga+1) then
                                          begin
                                          x:=byte(min(80,x+1));
                                          x_riga:=x_riga+1;
                                          x_min:=x_riga-x+1;
                                          if not incolla_tutto then
                                             begin
                                             Evidenzia_Selezione;
                                             Exit;
                                             end;
                                          end;
                    'S' : if (old_x<>x)or(old_iy<>iy-1)or(old_x_riga<>x_riga) then
                                          begin
                                          dec(iy);
                                          if y>1 then dec(y);
                                          if not incolla_tutto then
                                             begin
                                             Evidenzia_Selezione;
                                             Exit;
                                             end;
                                          end;
                    'G' : if (old_x<>x)or(old_iy<>iy+1) then
                                          begin
                                          inc(iy);
                                          if y<riga_menu-1 then inc(y);
                                          if not incolla_tutto then
                                             begin
                                             Evidenzia_Selezione;
                                             Exit;
                                             end;
                                          end;
                    end;
         'X','x','U':
           if (riga[10] in ['X','x','U'])and(not ann) then // add ver 3.15
              begin
              if (old_iy<>iy)or(old_x_min<>x_min)or(old_x<>x)or(old_y<>y) then
                 begin
                 Evidenzia_Selezione; // ver 2.92
                 Exit;
                 end;
              end
              else
           if (old_iy=iy)and(old_x_min=x_min+1)and(x_riga>=max_larghezza) then else    // max_larghezza==80
              begin
              if ( (old_iy<>iy)or(old_x_min<>x_min) ) and (x_riga<max_larghezza) then
                           begin
                           inc(x);
                           inc(x_riga);
                           if x>80 then
                              begin
                              inc(x_min);
                              x:=80;
                              end;
                           if not incolla_tutto then
                              begin
                              Evidenzia_Selezione;
                              Exit;
                              end;
                           end;
              if old_x<>x+1 then
                           begin
                           inc(x);
                           inc(x_riga);
                           if x>80 then
                              begin
                              inc(x_min);
                              x:=80;
                              end;
                           if not incolla_tutto then
                                 begin
                                 if (old_x_min<>x_min) then Evidenzia_Selezione; // ver 2.92
                                 Exit;
                                 end;
                           end;
              end;
         'e','t': if (old_iy<>iy) then
                                  begin
                                  Set_Cursore_X(1);
                                  y:=old_y;
                                  if iy<=ymax then   // ver 3.03
                                     if not incolla_tutto then
                                        begin
                                        Evidenzia_Selezione;
                                        Exit;
                                        end;
                                  end
                                 else   // old_iy=iy
                                  if x_riga<>1 then
                                             begin
                                             Set_Cursore_X(1);
                                             if not incolla_tutto then
                                                begin
                                                Evidenzia_Selezione;
                                                Exit;
                                                end;
                                             end
                                            else y:=old_y;
         end;
    end;
 case riga[10] of
     'Y':  if ann then lunghezza_riga:=ord(riga[11])
                  else lunghezza_riga:=ord(riga[12]); // ver 3.26
     'F' : if ann then Undo__F1_F2(riga,ann)
                  else Redo__F1_F2(riga,ann);
     'I' : if ann then Undo__Incolla_Riga(riga)
                  else Redo__Incolla_Riga;
     'i' : if ann then Undo__Incolla_Righe(riga)
                  else Redo__Incolla_Riga;
     'R' : Recover(riga);  // usato da taglia/elimina
     'X' : if ann then Undo__Scrivi(riga)
                  else Redo__Scrivi(riga);
     'V' : if ann then Undo__Invio(riga)
                  else Redo__Invio;
     'C' : if ann then Undo__Canc(riga)
                  else Redo__Canc;
     'B' : if ann then Undo__Back_Space(riga)
                  else Redo__Back_Space;
     'x' : if ann then Undo__Insert(riga)
                  else Redo__Insert(riga);
     'L' : if ann then Undo__CL(riga)
                  else Redo__CL(riga);
     'U' : if ann then Undo__UnoS(riga)
                  else Redo__UnoS(riga);
     'M' : if ann then Undo__Mouse_CL(riga)
                  else Redo__Mouse_CL(riga);
     '<' : if ann then Undo__Formattato_Sinistra(riga)
                  else Redo__Formattato(1,iy);
     '>' : if ann then Undo__Formattato_Destra(riga)
                  else Redo__Formattato(2,iy);
     '^' : if ann then Undo__Formattato_Centra(riga)
                  else Redo__Formattato(3,iy);
     '|' : if ann then Undo__Formattato_Giustifica(riga)
                  else Redo__Formattato(4,iy);
     '+','-','S',#9,'ñ','0','2':
          if ann then Undo__Formattato_Giustifica(riga)
                 else Redo__Menu_Formattato(riga);
     'q' : if ann then Undo__TE_Selezione_Quadrata(riga)  // ver 2.25
                  else Redo__TE_Quadrato;
     'c','b' : if ann then Undo__Canc_UnoS(riga)
                      else Redo__Canc_UnoS;
     'e','t' : if ann then Undo__TE_Righe(riga,first)
                      else Redo__TE_Righe;
     'E','T' : if ann then Undo__TE_Selezione(riga,first)
                      else Redo__TE_Esa(true);
     '1' : if ann then Undo__I_Esa            // ver 2.30
                  else Redo__Incolla_Riga;
     '3','7' : if ann then Undo__TE_Esa(riga)
                      else Redo__TE_Esa2;
     'A' : if ann then incolla_tutto:=false
                  else Redo__Incolla_Tutto; // ver 3.15
     'a' : incolla_tutto:=true;
     end;
 if ann then
         begin
         Annulla_Txt.cancella_iniziale;
         Ripristina_Txt.input_iniziale(strnew(stringtopchar(riga)));
         Ripristina_Selezione.input_iniziale(strnew(stringtopchar(sel)));
         end
        else    // parte di REDO
         begin
         Ripristina_Txt.cancella_iniziale;
         if not (riga[10] in ['E','T','q']) then Annulla_Txt.input_iniziale(strnew(stringtopchar(riga)));
         Annulla_Selezione.input_iniziale(strnew(stringtopchar(sel)));
         end;
 Undo__Selezione(true);
 if ann then while Annulla_Txt.numElementi<Annulla_Selezione.numElementi do Annulla_Selezione.cancella_iniziale
        else while Ripristina_Txt.numElementi<Ripristina_Selezione.numElementi do Ripristina_Selezione.cancella_iniziale;
 if salvato=Annulla_Txt.l then modifica:=false
                          else modifica:=true;
 if Annulla_Selezione.numElementi()=0 then Azzera_Selezione; // update 2.45
 if incolla_tutto then Continue;
 if riga[10] in ['L','V','C','<','>','^','|','e','t','X','x','U'] then
    begin
    old_riga:=riga;
    if (not ann) and (Ripristina_Txt.numElementi()>0) then
       begin
       riga:=strpas((Ripristina_Txt.l)^.info);
       if (riga[10] in ['<','>','^','|','X','x','U']) then
             if (riga[10]=old_riga[10]) then
                             begin
                             first:=false;
                             y:=byte(StrToInt(copy(riga,4,2)));
                             iy:=StrToInt(copy(riga,6,4));
                             if riga[10] in ['X','x','U'] then
                                             begin
                                             x:=ord(riga[2]);
                                             x_min:=ord(riga[3]);
                                             x_riga:=x+x_min-1;
                                             if ((riga[1]='0')and(old_riga[1]='1')and(riga[10]=old_riga[10])) or (copy(old_riga,6,4)<>copy(riga,6,4)) or (riga[10]<>old_riga[10]) then
                                                begin
                                                Evidenzia_Selezione;
                                                break;
                                                end;
                                             end;
                             continue;
                             end
                            else    // riga[10]=old_riga[10]
                             begin
                             Evidenzia_Selezione;
                             break;
                             end;
       if (old_riga[10] in ['e','t']) then continue;
       if (riga[10] in ['V','C']) and (riga[10]=old_riga[10]) then continue; // aggiunta ver 3.30
       if (riga[10]='L')and(riga[10]=old_riga[10])and(copy(riga,11,1)=copy(old_riga,11,1))
          and ( ( (copy(riga,6,4)=copy(old_riga,6,4))and(riga[11]='D') )
                or  ( (strtoint(copy(riga,6,4))=strtoint(copy(old_riga,6,4))-1)and(riga[11]='S') )
                or  ( (strtoint(copy(riga,6,4))=strtoint(copy(old_riga,6,4))+1)and(riga[11]='G') ) )
          then
           begin
           first:=false;
           continue;
           end;
       end;
    if ann and (Annulla_Txt.numElementi()>0) then
       begin
       riga:=strpas((Annulla_Txt.l)^.info);
       if (riga[10] in ['<','>','^','|'])and(riga[10]=old_riga[10]) then
                             begin
                             first:=false;
                             continue;
                             end;
       if (riga[10]='L')and(riga[10]=old_riga[10])and(copy(riga,11,1)=copy(old_riga,11,1))
          and ( ( (copy(riga,6,4)=copy(old_riga,6,4))and(riga[11]='D') )
                or  ( (strtoint(copy(riga,6,4))=strtoint(copy(old_riga,6,4))+1)and(riga[11]='S') )
                or  ( (strtoint(copy(riga,6,4))=strtoint(copy(old_riga,6,4))-1)and(riga[11]='G') ) )
          then
           begin
           first:=false;
           continue;
           end;
       if (riga[10] in ['C','B'])and(riga[1]='0') then continue;
       if (riga[10] in ['V','t','e']) then continue;
       end;
    end;
 if (not ann) and (riga[10] in ['E','T']) then azzera_selezione;
 if (riga[1]='1')or(not ann and (Ripristina_Txt.numElementi()=0))or(ann and (Annulla_Txt.numElementi()=0)) then
    begin
    init;
    Evidenzia_Selezione;
    Exit;
    end;
until false;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Sostituisci; { update ver 1.8 }
var i:byte;
    old_ins:boolean;
    elementi:longint;
begin
normale;
if (iy>selezionato.y2)or((iy=selezionato.y2)and(x>selezionato.x2)) then else Azzera_Selezione;
if FreeAnnulla( ( length(cerco)+length(sostituto) )div 4 {*25 div 100}+1 ) then vera_tastiera:=true;
elementi:=Annulla_Txt.numelementi;
old_ins:=ins;
ins:=false;
for i:=1 to length(cerco) do Tasto__Canc(true);
for i:=1 to length(sostituto) do
    if Tasto__Tastiera(sostituto[i]) then // righe insufficienti per continuare la sostituzione
             begin
             stato:=4; // non ha senso per il mouse: indica che il messaggio di righe finite deve essere ignorato
             while elementi<>Annulla_Txt.numelementi do M_modifica__Annulla_Undo(true);
             break;
             end;
vera_tastiera:=false;
ins:=old_ins;
ShowMouse;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Sostituzioni(c:char);
label Inizio,Ancora;
var niy,i,b:integer;
    posto,nx,a,app:byte;
    cerca_tmp,sostituto_tmp:string;
begin
posto:=0;
case c of
     '4': Inizio:
         begin
         Anteprima_Sostituisci;
         cerca_tmp:=cerco;
         cerco:=cerca(false,cerco,posto);
         if cerco='' then
                      begin
                      cerco:=cerca_tmp;
                      Exit;
                      end
                     else
                      begin
                      Post_Sostituisci;
                      posto:=0;
                      sostituto_tmp:=cerca(false,sostituto,posto);
                      if sostituto_tmp='' then
                                          begin
                                          cerco:=cerca_tmp;
                                          Exit;
                                          end
                                         else sostituto:=sostituto_tmp;
                      end;
         if binario and (length(sostituto)<>length(cerco)) then
             begin
             Err_Sostituto;
             Exit;
             end;
 Ancora:
         i:=0;
         repeat
          a:=x;
          b:=iy;
          c:=#0;
          if sotto_ then CercaMaMi_Giu
                    else CercaMaMi_Su;
          if (a=x) and (b=iy) then break;
          if sostituto='' then Exit;
          anteprima_sostituisci;
          post_sostituisci;
          colore;
          gotoxy(Lingue.get_length_txt(45)+1,riga_menu+3);
          write('"');
          textcolor(10);
          write(sostituto);
          textcolor(white);
          write('"');
          clreol;
          gotoxy(1,riga_menu+2);
          write('            ');
          gotoxy(14,riga_menu+1);
          write('"');
          textcolor(10);
          textbackground(blue);
          write(cerco);
          textcolor(white);
          write('"');
          clreol;
          gotoxy(14,riga_menu+2);
          write(Lingue.get_txt(37));  // 'Jolly ?    - Parola intera ?    - Direzione   - Ignora Mai/Min ?'
          textcolor(13);
          gotoxy(22,riga_menu+2);
          if Jolly then write(Lingue.get_txt(38))     {jolly}  // 'Si'
                   else write(Lingue.get_txt(39));             // 'No'
          gotoxy(79,riga_menu+2);
          if ignora then write(Lingue.get_txt(38))    {ignora}
                    else write(Lingue.get_txt(39));
          gotoxy(43,riga_menu+2);
          if pInt then write(Lingue.get_txt(38))      {pInt}
                  else write(Lingue.get_txt(39));
          gotoxy(58,riga_menu+2);
          if sotto_ then write(c_fD)  // freccia 'Sotto'
                    else write(c_fU); // freccia 'Sopra'
          HideMouse;
          colore;
          {$ifdef TxtCrt}
          gotoxy(25,riga_menu+4);
          write(Lingue.get_txt(42));  // ' Sostituire? '
          {$endif}
          {$ifdef TxtVideo}
          gotoxy(28,riga_menu+4);
          write(Lingue.get_txt(43));  // 'Cambiare? '
          {$endif}
          c:=Tasti_SNA(39,riga_menu+4);
          textbackground(blue);
          {$ifdef TxtCrt}
          gotoxy(25,riga_menu+4);
          {$endif}
          {$ifdef TxtVideo}
          gotoxy(28,riga_menu+4);
          {$endif}
          write('                                ');
          if ((a<>x) or (b<>iy)) and sotto_ and (c='S') then
                             begin {posso sostituire}
                             for app:=1 to length(cerco) do
                                   begin
                                   Tasto__Sinistra;
                                   if (x=1)and(app<length(cerco)) then Tasto__Sinistra; {sale riga}
                                   end;
                             sostituisci;
                             inc(i);
                             end;
          if ((a<>x) or (b<>iy)) and (sotto_=false) and (c='S') then
                             begin               {posso sostituire}
                             nx:=x;
                             niy:=iy;
                             sostituisci;
                             Set_Cursore_X(nx);
                             if iy<>niy then
                                        begin
                                        iy:=niy;
                                        dec(y);
                                        end;
                             inc(i);
                             end;
          if c='A' then
                   begin {stessa posizione simula}
                   a:=x; {successivi non trovati}
                   b:=iy;
                   end;
         until ((a=x) and (b=iy)) or (tutto=false);
         {$ifdef TxtVideo}
         if i<>0 then
                 begin
                 Azzera_Selezione;
                 evidenzia_selezione; // aggiorno il testo selezionato
                 end;
         {$endif}
         if tutto and (i>0) then resoconto(i);
         if tutto and (i=0) and (c=#0) then not_found;
         end;

     '5': if (cerco='')or(sostituto='') then goto Inizio
                      else
                      begin
                      pulisci1;
                      gotoxy(1,riga_menu+1);
                      write(Lingue.get_txt(44));  // 'Sostituisci:'
                      gotoxy(1,riga_menu+3);
                      write(Lingue.get_txt(45)+'                      ');  // 'Con la stringa: '
                      goto Ancora;
                      end;
     end; {case}
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_Cerca__sostituzioni(c:char);  // ver 2.54
var old_sc:boolean;
begin
old_sc:=sc;
sc:=false;
if binario then No_ASCII
           else Sostituzioni(c);
sc:=old_sc;
{$ifdef TxtVideo}
if cerco='' then ForceUpdateXY(0,riga_menu-1,ScreenWidth*5);
{$endif}
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Menu_Cerca(c:byte);  // update 1.84
label F3a,F3b;
var old_cerco:string;
    old_x,old_iy:integer;
    quick:boolean;
    posto:byte;
begin
old_cerco:=cerco;
quick:=false;
if modifica and binario and (c<>0) then
                        begin
                        CercaSalva;
                        Exit;
                        end;
case c of
      1: M_Cerca__Vai;
      2: begin
         F3a:
         hidemouse;
         {$ifdef TxtCrt}
         Anteprima_Cerca(true);
         {$endif}
         posto:=0;
         repeat
          info(true);
          Anteprima_Cerca(true);
          gotoxy(x,y);
          posto:=0; // emula la prima volta
          cerco:=cerca(true,cerco,posto);
          if per_riga and (trim(cerco)='') and (cerco<>'') then goto F3a;
          if cerco='' then
                      begin
                      cerco:=old_cerco;
                      {$ifdef TxtVideo}
                      ForceUpdateXY(0,riga_menu-1,ScreenWidth*5);
                      {$endif}
                      break;
                      end
                     else old_cerco:=cerco;
          F3b:
          old_x:=x;
          old_iy:=iy;
          if binario then CercaInBinario // no ricerca dentro selezione in binario
                     else if sotto_ then CercaMaMi_Giu
                                    else CercaMaMi_Su;
         until selezione or sc or ((old_x=x)and(old_iy=iy)) or quick or binario;
         end;
      3: if cerco='' then goto F3a
                     else
                      begin
                      quick:=true;
                      goto F3b;
                      end;
      4: M_Cerca__Sostituzioni(char(c+48));  // ver 2.54
      5: M_Cerca__Sostituzioni(char(c+48));  // ver 2.54
  end; // del case
{$ifdef TxtVideo}
updatescreen(true);
{$endif}
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__F1_F2(ks:string);   // ver 1.83    update ver 2.00
var s,new_S:string;
begin
if x_riga+1>length(testo[iy]) then Exit;
if wherex>79 then Exit;  // il testo da modificare deve essere visibile
if FreeAnnulla(1) then
   begin
   if Annulla_Txt.numelementi>0 then
                  begin
                  s:=strpas((Annulla_Txt.l)^.info);
                  Annulla_Txt.cancella_iniziale;
                  Annulla_Selezione.cancella_iniziale;
                  end
                 else s:='';
   new_S:='1'+undo__x_prepara()+zero(inttostr(y),2)+zero(inttostr(iy),4)+'F'+testo[iy][x_riga+1];   // il nuovo annulla
   if (ks='F1')and(testo[iy][x_riga+1]=#255) then new_S:=new_S+'--';
   if s<>'' then
        begin
        Annulla_Txt.input_iniziale(strnew(stringtopchar(s)));  // valore precedente di annulla di tipo diverso da quello attuale: valido
        Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
        end;
   end;
modifica:=true;
if binario then
   begin
   if (ks='F1') then
                if ord(testo[iy][x_riga+1])<255 then inc(testo[iy][x_riga+1])
                                                else testo[iy][x_riga+1]:=#0 else
   if (ks='F2') then
                if ord(testo[iy][x_riga+1])>0 then dec(testo[iy][x_riga+1])
                                              else testo[iy][x_riga+1]:=#255;
   end
  else // not binario
   repeat
   if (ks='F1') then
                if ord(testo[iy][x_riga+1])<255 then inc(testo[iy][x_riga+1])
                                                else testo[iy][x_riga+1]:=#32 else
   if (ks='F2') then
                if ord(testo[iy][x_riga+1])>32 then dec(testo[iy][x_riga+1])
                                               else testo[iy][x_riga+1]:=#255;
   until not (ord(testo[iy][x_riga+1]) in unprintable);
if FreeAnnulla(1) then
   begin
   if ( copy(s,1,10)<>copy(new_s,1,10) ) or
      ( (copy(s,1,10)=copy(new_s,1,10)) and (length(s)=10) ) // gestione speciale per il carattere #0
       then
        begin
        Annulla_Txt.input_iniziale(strnew(stringtopchar(new_S+testo[iy][x_riga+1])));
        Annulla_Selezione.input_iniziale(strnew(stringtopchar(La_selezione)));
        end
       else
        begin
        Annulla_Txt.cancella_iniziale;
        Annulla_Txt.input_iniziale(strnew(stringtopchar(copy(S,1,11)+testo[iy][x_riga+1])));
        end;
   end;

{$ifdef TxtCrt}
gotoxy(x,y);
if dentro_selezione() then
                      begin
                      textcolor(0);
                      textbackground(7);
                      end;
writeBin(testo[iy][x_riga+1]);
{$endif}
{$ifdef TxtVideo}
writeBinXY(x-1,y-1,testo[iy][x_riga+1]);
{$endif}
info;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_modifica__deseleziona;  // ver 2.54
begin
Azzera_Selezione;
evidenzia_selezione;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_modifica__Mostra_Nascondi_Appunti;  // ver 3.28
var i:longint;
begin
if sono_Appunti() then
   begin
   modifica:=false;
   M_file__Chiudi();
   Exit;
   end;
M_file__Nuovo_2(false);
nomefile:='*** '+Lingue.get_txt(550)+' ***';
percorso:='';
multi_file[posizione_file_attuale].nomefile:=nomefile;
multi_file[posizione_file_attuale].percorso:=percorso;
multi_file[posizione_file_attuale].aperto:=false;
for i:=1 to length(appunti) do
    begin
    testo[ymax]:=#13+nomefile+'  '+IntToStr(i)+'/'+IntToStr(length(appunti));
    inc(ymax);
    iy:=ymax;
    testo[ymax]:=#13;
    Tasto__Fine();
    iy:=ymax;
    appunti_usato:=i-1;
    incolla_attuale_in_testo;
    Tasto__Invio();
    if (i>1)or(length(appunti)>1) then Tasto__Invio();
    end;
modifica:=false;
Annulla_Txt.Destroy;
Tasto__Ctrl_Inizio;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure menu_modifica(menu__y:byte);  // ver 2.00
begin
case menu__y of
     1: M_Modifica__Annulla_Undo(true);
     2: M_Modifica__Annulla_Undo(false);
     3: ;
     4: M_Modifica__Seleziona_Tutto;
     5: M_modifica__Deseleziona;
     6: ; // vuoto
     7: M_modifica__Taglia_Selezione(true);
     8: M_modifica__Copia_Selezione;
     9: M_modifica__Incolla_Ultimo;
    10: M_modifica__Incolla_Lista;
    11: M_modifica__Taglia_Selezione(false);  // elimina
    12: ;
    13: M_modifica__Mostra_Nascondi_Appunti;  // appunti 3.28
     end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

{$ifndef Linux}
procedure M_file__Stampa(menu__y:byte); // ver 2.10
begin
ListaY[1].Mostra;
listaX.stampa_selezionato;
menu__x:=9;
menu__y:=ListaY[9].costruisci;
Evidenzia_Selezione;
if menu__y=0 then
             begin
             {$ifdef TxtVideo}
             ListaX.stampa_selezionato;
             {$endif}
             Exit;
             end;
Grafica;
case menu__y of
     1: M_stampa__Stampante; // Seleziona_porta
     2: M_stampa__Numero_Copie;
     3: M_stampa__tutto;
     4: M_stampa__selezione;
     5: M_stampa__righe;
     6: M_stampa__fogli;
     7: M_stampa__foglio_attuale;
     end;
end;
{$endif}

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__salva_copia__totale_con_nome;  // ver 2.10
var binario_old,modifica_old:boolean;
    percorso_old,nomefile_old:string;
begin
binario_old:=binario;
modifica_old:=modifica;
percorso_old:=percorso;
nomefile_old:=nomefile;
binario:=true;
modifica:=false;
grafica;
Salva_Con_Nome(1);
binario:=binario_old;
modifica:=modifica_old;
percorso:=percorso_old;
nomefile:=nomefile_old;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__Riapri_in_esa_txt;   // ver 2.62 , 3.22
var old_lunghezza_riga:integer;
begin
if modifica then  // non posso riaprire un file modificato, devo prima salvarlo
   if not Error_Riapri_IN then Exit;   // ver 2.10
if not salva_multi_file(posizione_file_attuale) then  // aggiorno il file attuale
   begin
   Error_Multi_Files;
   exit;
   end;
binario:=not binario;
old_lunghezza_riga:=lunghezza_riga;
if binario then lunghezza_riga:=next_length_ESA  // non e' recenti/visualizza
           else lunghezza_riga:=next_length_TXT;
if binario then Apertura_Bin
           else Apertura_Txt;
if IOF then  // errore nel caricamento? se SI, ripristino
   begin
   Azzera_Selezione;
   ins:=binario;
   lunghezza_riga:=old_lunghezza_riga;
   end
  else ricarica_multi_file(posizione_file_attuale);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__Salva;   // ver 2.54
begin
if sono_Appunti() then Exit; // sono gli appunti ver 3.28
if Free then
         begin
         if nomefile<>'' then
                         if SL then
                               begin
                               SL_Error;  // ver 2.52
                               IOF:=true;
                               end
                              else Salva
                         else Salva_Con_Nome(0);
         if not IOF then Attrib;
         end
        else Hd_Low;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__Salva_con_nome;  // ver 2.54 , update 2.66
begin
Salva_Con_Nome(0);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_File__Salva_Copia__da_byte_a_byte; // ver 2.83
var a,b:int64;
    binario_old,modifica_old:boolean;
    percorso_old,nomefile_old,stringa:shortstring;
begin
da_a_graph;
a:=1;
b:=file_size_byte;
stringa:=Lingue.get_txt(46);   // 'Salva copia con nome da byte a byte'
while length(stringa)<max_larghezza do stringa:=' '+stringa+' ';
setlength(stringa,max_larghezza);
{$ifdef TxtCrt}
grafica;
{$endif}                       // 'Dal byte: '  'Al byte: '
if not Da_A_2(a,b,1,file_size_byte,Lingue.get_txt(47),Lingue.get_txt(48),stringa) then Exit;
da_a_graph;
pulisci1;
info;
{$ifdef TxtVideo}
stringa:='';
while length(stringa)<max_larghezza do stringa:=' '+stringa+' ';
OutTextXY(1,riga_menu,stringa,0,blue,white);
{$endif}
binario_old:=binario;
modifica_old:=modifica;
percorso_old:=percorso;
nomefile_old:=nomefile;
binario:=true;
modifica:=false;
Salva_Con_Nome(2,a,b);
binario:=binario_old;
modifica:=modifica_old;
percorso:=percorso_old;
nomefile:=nomefile_old;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_File__Salva_Copia__Selezione; // ver 2.83
var num_caratteri,num_file,riga,i,old_posizione_file,x1,y1,x2,y2:longint;
    inverti:boolean;
begin
inverti:=false;
num_file:=length(multi_file);
old_posizione_file:=posizione_file_attuale;
M_file__Nuovo_2(binario);
x2:=multi_file[old_posizione_file].selezionato.x2;
x1:=multi_file[old_posizione_file].selezionato.x1;
y1:=multi_file[old_posizione_file].selezionato.y1;
y2:=multi_file[old_posizione_file].selezionato.y2;
setlength(testo,y2-y1+3);
max_righe:=length(testo)-2;
if (y1>y2) or ( (y1=y2) and(x1>x2) ) then inverti:=true;
if inverti then
   begin
   exchange(x1,x2);
   exchange(y1,y2);
   end;

if y1=y2 then  // stessa riga   ver 3.10
          begin
          ymax:=1;
          testo[1]:=#13+copy(multi_file[old_posizione_file].testo[y1],x1+1,x2-x1+1);
          end
         else
if selezione_quadrata then
     begin
     if (y1<y2) and (x1>x2) then
        begin
        exchange(x1,x2);
        inc(x1);
        end;
     i:=0;
     num_caratteri:=x2-x1+2;
     for riga:=y1 to y2 do
         begin
         inc(i);
         testo[i]:=copy(multi_file[old_posizione_file].testo[riga],x1,num_caratteri);
         end;
     ymax:=i;
     end
    else     // selezione normale
     begin
     i:=1;
     testo[1]:=#13+copy_end(multi_file[old_posizione_file].testo[y1],x1+1);
     for riga:=y1+1 to y2-1 do
         begin
         inc(i);
         testo[i]:=multi_file[old_posizione_file].testo[riga];
         end;
     testo[i+1]:=copy(multi_file[old_posizione_file].testo[y2],1,x2+1);
     ymax:=i+1;
     end;
evidenzia_selezione;
grafica;
Salva_Con_Nome(3);
M_file__Chiudi();
setlength(multi_file,num_file); // rimuove totalmente, come se non ci fosse mai stata l'operazione di copia selezione con nome
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__salva_copia;  // ver 2.83
var scelta:byte;
begin
ListaY[1].Mostra;
menu__x:=12;
listaX.stampa_selezionato;
ListaY[menu__x].Selezionabile(1,(nomefile<>''));
ListaY[menu__x].Selezionabile(2,(nomefile<>'')and binario and (not modifica) and (not Testo_Vuoto()) );
ListaY[menu__x].Selezionabile(3,(nomefile<>'')and (not non_selezione) );
scelta:=ListaY[menu__x].costruisci();
Evidenzia_Selezione;
case scelta of
     0: ;
     1: M_File__Salva_Copia__Totale_con_nome;
     2: M_File__Salva_Copia__da_byte_a_byte;
     3: M_File__Salva_Copia__Selezione;
     end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__Converti; // ver 2.77
var scelta:byte;
begin
ListaY[1].Mostra;
menu__x:=11;
listaX.stampa_selezionato;
ListaY[menu__x].Selezionabile(1,not binario);
ListaY[menu__x].Selezionabile(2,binario);
ListaY[menu__x].Selezionabile(3,not binario);   // txt > htm
ListaY[menu__x].Selezionabile(4,not binario);   // txt > rtf
scelta:=ListaY[menu__x].costruisci();
Evidenzia_Selezione;
case scelta of
     0: ;
     1: M_File__Converti__txt_esa;
     2: M_File__Converti__esa_txt;
     3: M_File__Converti__txt(true);     // per Html
     4: M_File__Converti__txt(false);    // per RTF       ver 2.96
     5: ; // separatore
     6: M_File__Converti__Configura(true);   // per Html
     7: M_File__Converti__Configura(false);  // per RTF   ver 2.96
     end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_file__Carica;   // ver 3.26
var scelta:byte;
    originale:string;
begin
ListaY[1].Mostra;
menu__x:=13;
listaX.stampa_selezionato;
ListaY[menu__x].Selezionabile(1,(nomefile<>'') and not sono_Appunti() ); // ricarica
ListaY[menu__x].Selezionabile(2,(nomefile<>'') and not sono_Appunti() ); // riapri in...
ListaY[menu__x].Selezionabile(3,(nomefile<>'') and not sono_Appunti() ); // ripeti apri in esadecimale
ListaY[menu__x].Selezionabile(4,(nomefile<>'') and not sono_Appunti() ); // ripeti apri come testo
if binario then ListaY[menu__x].AggiornaRiga(2,Lingue.get_txt(408),Lingue.get_charB(408))  // ' Riapri in TXT '
           else ListaY[menu__x].AggiornaRiga(2,Lingue.get_txt(409),Lingue.get_charB(409)); // ' Riapri in ESA '
originale:=Lingue.get_txt(545);
if binario then
            begin
            ListaY[menu__x].AggiornaRiga(3,Lingue.get_txt(543)+originale,Lingue.get_charB(543));  // ' Ripeti apri in esadecimale ' e
            ListaY[menu__x].AggiornaRiga(4,Lingue.get_txt(544),Lingue.get_charB(544));
            end
           else
            begin
            ListaY[menu__x].AggiornaRiga(3,Lingue.get_txt(543),Lingue.get_charB(543));
            ListaY[menu__x].AggiornaRiga(4,Lingue.get_txt(544)+originale,Lingue.get_charB(544)); // ' Ripeti apri come Testo ' T
            end;
ListaY[menu__x].Selezionabile(5,( (binario and (nomefile<>'') and (not modifica)) or (not binario) ) and not sono_Appunti() );  // Cambia_numero_di_colonne
ListaY[menu__x].AggiornaRiga(5,Lingue.get_txt(546)+'('+inttostr(lunghezza_riga)+')',Lingue.get_charB(546)); // ' Cambia numero di colonne ' c
scelta:=ListaY[menu__x].costruisci();
Evidenzia_Selezione;
case scelta of
     0: ;
     1: M_file__Ricarica;
     2: M_file__Riapri_in_esa_txt;
     3: M_file__Apri(percorso+nomefile,next_length_ESA,0,1);  // ripeti apri in esadecimale
     4: M_file__Apri(percorso+nomefile,next_length_TXT,0,2);  // ripeti apri come testo
     5: M_file__Cambia_numero_di_colonne;
     end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure menu_file(menu__y:byte);  // ver 2.00 , update 2.10 , 2.40 , 3.26
begin
case menu__y of
     1: M_file__Nuovo;  // sottomenu            // tot, binario=0|1|2
     2: M_file__Apri('',0{lunghezza riga definita dopo},0,0);
     3: M_file__Carica; // sottomenu
     4: ;
     5: M_file__Salva;
     6: M_file__Salva_con_nome;
     7: M_file__Salva_Tutti;
     8: M_file__Chiudi;
     9: M_file__Chiudi_Tutti;
    10: ;  // separatore
    11: M_file__cancella;
    12: M_file__salva_copia;  // sottomenu
    13: M_file__rinomina;
    14: ; // separatore
    15: M_file__Command_Shell;
    16: M_file__Converti;     // sottomenu
    17: {$ifndef Linux}M_file__Stampa(menu__y){$endif};  // sottomenu
    18: M_file__Esci;
    end;
Aggiorna_Campi_Menu;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_opzioni__Configurazione_predefinita; forward; // per ricorsione in ricarica con configurazione predefinita

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure menu_opzioni(menu__y:byte);
begin // ver 2.00 , 2.20 , 2.25 , 2.68 , 2.75 , 2.86
case menu__y of
     1: M_opzioni__Associa_Estensioni; // ver 2.75
     2: M_opzioni__Delimitatore_di_fine_riga;
     3: M_opzioni__formato_salva_file;
     4: M_opzioni__Velocita;
     5: M_opzioni__Memoria(true);
     6: M_opzioni__ASCII;
     7: ;  // separatore
     8: M_opzioni__Salva_Configurazione;          // ver 2.68
     9: M_opzioni__Salva_Configurazione_In;       // ver 2.68
    10: M_opzioni__Configurazione_predefinita;    // ver 3.11
    11: M_opzioni__Configura1;
    12: M_opzioni__Configura2;
    13: M_opzioni__Configura3;                    // ver 2.86
    14: M_opzioni__Cambia_Lingua;                 // ver 3.20
    15: ;  // separatore
    16: M_opzioni__Informazioni_sul_File;
    17: M_opzioni__Informazioni_su_Editor;
    18: M_opzioni__Informazioni_legali;
     end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure m_speciale__taglia(menu_selezione_speciale:byte; b:boolean);  // ver 3.03
begin
case menu_selezione_speciale of
     1: seleziona_paragrafo;
     2: M_speciale__Taglia_Riga_Attuale(b);
     3: Seleziona_parola;
     4: M_speciale__Taglia_Righe(b);
     end;
if menu_selezione_speciale in [1,3] then M_modifica__Taglia_Selezione(b);
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure menu_speciale(menu__y:byte);   // 2.00
begin
case menu__y of
  1..4: menu_selezione_speciale:=menu__y;
     5: ;
     6: m_speciale__taglia(menu_selezione_speciale,true);
     7: m_speciale__copia(menu_selezione_speciale);
     8: m_speciale__taglia(menu_selezione_speciale,false);
     9: m_speciale__seleziona(menu_selezione_speciale);
    10: ;
    11: M_speciale__Incolla_In_Riga(false);
    12: M_speciale__Incolla_In_Riga(true);
    13: M_speciale__Incolla_Tutto;    // ver 3.14
    14: M_speciale__Svuota_Appunti;   // ver 3.30
//    15: Evidenzia_Selezione; // Aggiorna Video   ver  3.03
     end;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Tasto__Shift_Invio(); // ver 3.40
var old_cl:boolean;
begin
if iy=ymax Then Exit;
old_cl:=cl;
cl:=true;
vera_tastiera:=true;
Tasto__Giu();
vera_tastiera:=false;
cl:=old_cl;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

{$define Click_su_MenuX:=
                         alt_menu;
                         aspetto_Rilascio;
                         goto F10;
}

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure Input;
var menu__y:byte;
    i:integer;
    cliccato:boolean;
label sotto,F10;

begin
sotto:
 HideMouse;
 Grafica;
 info;
 {$ifdef TxtVideo}
 updatescreen(true);
 {$endif}
 showmouse;
 showmouse;
 cliccato:=false;

repeat                          {gestione tasti / vero inizio del programma}
Barra_Verticale;
if whereY<riga_menu then normale;
if (PollKeyEvent=0) and topo then   // gestione del mouse
     begin
     sleep(5); // millesimi di secondo
     if (selezionato.y1<>0) and (selezionato.x1=0) then inc(selezionato.x1);
     {$ifdef go32v2}Click_Testo;{$endif}
     cliccato:=Doppio_Click.Mouse_Down(mox,moy,stato);
     {$ifndef go32v2}Click_Testo(cliccato);{$endif}
     if cliccato then stato:=1
                 else stato:=0;
     if stato=1 then
          begin
          if (mox=max_larghezza)and(verticale=riga_menu-2)and(moy=riga_menu-2) then Continue;
          if (mox>=(ListaX.Get_X(8)+length(ListaX.Get_nome(8))+2)) and (moy>=riga_menu) then Continue;
          if (mox>=ListaX.Get_X(8))and(moy=riga_menu+1) then
             begin    // Recenti
             listaX.selezionato:=8;
             Click_su_MenuX;
             end else
          if (mox>=ListaX.Get_X(7))and(moy=riga_menu+1) then
             begin    // Visualizza
             listaX.selezionato:=7;
             Click_su_MenuX;
             end else
          if (mox>=ListaX.Get_X(6))and(moy=riga_menu+1) then
             begin    // Opzioni
             listaX.selezionato:=6;
             Click_su_MenuX;
             end else
          if (mox>=ListaX.Get_X(5))and(moy=riga_menu+1) then
             begin    // Speciale
             listaX.selezionato:=5;
             Click_su_MenuX;
             end else
          if (mox>=ListaX.Get_X(4))and(moy=riga_menu+1) then
             begin    // Giustifica
             listaX.selezionato:=4;
             Click_su_MenuX;
             end else
          if (mox>=ListaX.Get_X(3))and(moy=riga_menu+1) then
             begin    // Cerca
             listaX.selezionato:=3;
             Click_su_MenuX;
             end else
          if (mox>=ListaX.Get_X(2))and(moy=riga_menu+1) then
             begin    // Modifica
             listaX.selezionato:=2;
             Click_su_MenuX;
             end else
          if (mox>=ListaX.Get_X(1))and(moy=riga_menu+1) then
             begin    // File
             listaX.selezionato:=1;
             Click_su_MenuX;
             end;
          if (moX=max_larghezza)and(moy=1) then
                                begin   // barra verticale, freccia verso alto
                                Tasto__Su();
                                info;
                                delay2(ClickDelay);
                                end;
          if (mox=max_larghezza)and(moy=riga_menu-1)and(iy<ymax) then // ver 3.15
                                begin  // barra verticale, freccia verso basso
                                Tasto__Giu();
                                info;
                                delay2(ClickDelay);
                                end;
          if (moX=max_larghezza)and(moy>1)and(moy<riga_menu-1) then Click_Verticale;
          end;
     end
    else     {tasto premuto}
     begin
     if ins then CursorBig else CursorOn;
     gotoxy(x,y);
     ks:=KeyEventToString(TranslateKeyEvent(GetKeyEvent));
     Doppio_Click.Empty_Mouse;
     chk_move(ks);
     if (ks='ALT F5') then Alt_F5 // mostra shell
                      else
     if (ks='ALT Key with scancode 3584') then {ALT+BackSpace}
        if Annulla_Txt.l=nil then continue
                             else M_modifica__Annulla_Undo(true) else
     if from_alt_to_char(ks)='F' then
        begin  // ALT+F
        listaX.selezionato:=1;
        alt_menu;
        goto F10;
        end else
        if from_alt_to_char(ks)=lingue.get_charUp(159) then
        begin  // ALT+M
        listaX.selezionato:=2;
        alt_menu;
        goto F10;
        end else
     if from_alt_to_char(ks)=lingue.get_charUp(160) then
        begin  // ALT+C
        listaX.selezionato:=3;
        alt_menu;
        goto F10;
        end else
     if from_alt_to_char(ks)=lingue.get_charUp(161) then
        begin // ALT+T
        listaX.selezionato:=4;
        alt_menu;
        goto F10;
        end else
     if from_alt_to_char(ks)=lingue.get_charUp(162) then
        begin // ALT+S
        listaX.selezionato:=5;
        alt_menu;
        goto F10;
        end else
     if from_alt_to_char(ks)=lingue.get_charUp(163) then
        begin // ALT+O
        listaX.selezionato:=6;
        alt_menu;
        goto F10;
        end else
     if from_alt_to_char(ks)=lingue.get_charUp(164) then
        begin // ALT+V
        listaX.selezionato:=7;
        alt_menu;
        goto F10;
        end else
     if from_alt_to_char(ks)=lingue.get_charUp(165) then
        begin // ALT+R
        listaX.selezionato:=8;
        alt_menu;
        goto F10;
        end else
     if (ks='SHIFT Up')or(ks='Up') then
        if Shift and ( (not binario) or (binario and (iy<=ymax)) ) then Tasto__Shift_Su
                                   else  {in tutti gli altri casi}
                                    begin
                                    vera_tastiera:=true;
                                    if Tasto__Su() then
                                       begin
                                       vera_tastiera:=false;
                                       Continue;
                                       end;
                                    vera_tastiera:=false;
                                    end else
     if (ks='SHIFT Down')or(ks='Down') then
        if Shift and ( (not binario) or (binario and (iy<ymax)) ) then Tasto__Shift_Giu
                                   else
                                    begin
                                    if not binario and (iy=ymax) Then Continue;
                                    vera_tastiera:=true;
                                    if Tasto__Giu() then
                                           begin
                                           vera_tastiera:=false;
                                           Continue;
                                           end;
                                    vera_tastiera:=false;
                                    end else
     if (ks='SHIFT Right')or(ks='Right') then
        if Shift and ( (not binario) or ( binario and not ((x_riga=lunghezza_riga+1) and (iy=MaxR)) ) ) then Tasto__Shift_Destra {un solo carattere alla volta}
                                   else if binario and (x_riga=lunghezza_riga+1) and (iy=MaxR) then Tasto__Giu()
                                                                                   else
                                                                                    begin
                                                                                    if (not binario) and (iy=ymax) and (x_riga=length(testo[iy])) and (ymax=maxR) then Continue; // aggiungibile alla 2.61 ma con anche altri cambiamenti
                                                                                    if binario and (iy=ymax) and (x_riga=length(testo[iy])) and (x_riga<lunghezza_riga) then Continue;
                                                                                    if (not binario) and (iy=ymax) and (x_riga=length(testo[iy])) and (not CL) then Continue;
                                                                                    vera_tastiera:=true;
                                                                                    Tasto__Destra;
                                                                                    vera_tastiera:=false;
                                                                                    end else
     if (ks='SHIFT Left')or(ks='Left') then
          begin
          if shift then
                    if binario then
                               begin
                               if (tot=0) and (iy=1) and (x_riga=1) then Continue else
                                  if (x_riga=1) and (iy=1) and (tot>0) then
                                      begin
                                      Tasto__Su();
                                      Set_Cursore_X(lunghezza_riga+1);
                                      end
                                     else Tasto__Shift_Sinistra
                               end
                              else Tasto__Shift_Sinistra {un solo carattere alla volta}
                   else  // no shift
                    if binario then
                               begin
                               if (tot=0) and (iy=1) and (x_riga=1) then Continue else
                                  if (x_riga=1) and (iy=1) and (tot>0) then Tasto__Su()
                                                                       else Tasto__Sinistra
                               end
                              else
                               if (iy=1) and (x_riga=1) then Continue
                                                        else Tasto__Sinistra
          end
         else
     if (ks='SHIFT Insert'){$ifdef Linux}or(ks='SHIFT Key with scancode 1280'){$endif} then M_modifica__Incolla_Ultimo else
     if (ks='CTRL '+#22)or(ks='SHIFT CTRL '+#22) then M_modifica__Incolla_Lista else //  Ctrl+V
     if (ks='Insert') then Tasto__Ins else
     if ((ks='SHIFT Delete')or(ks='Delete'){$ifdef Linux}or(ks='SHIFT Key with scancode 1792'){$endif}) then
        begin
        if sono_Appunti() then Continue;
        if SL then sl_Error else
        if Shift then M_modifica__Taglia_Selezione(true)   {Shift + Canc}
                 else
                  if UnoS and (x_riga=length(testo[iy])) then
                                                    begin
                                                    if iy<ymax then Tasto__Canc_UnoS
                                                               else Continue;
                                                    end
                                                   else
                                                    begin
                                                    if (x_riga=length(testo[iy]))and(iy=ymax) then Continue;
                                                    vera_tastiera:=true;
                                                    for i:=chk_tab_canc() downto 1 do Tasto__Canc(i=1);
                                                    vera_tastiera:=false;
                                                    end;
        end else
     if (ks='SHIFT Home')or(ks='Home') then
        if Shift then Tasto__Shift_Inizio
                 else if x_riga=1 then Continue
                                  else Tasto__Inizio else
     if (ks='SHIFT End')or(ks='End') then
        if Shift then Tasto__Shift_Fine
                 else if Tasto__Fine() then Continue else else
     if (ks='SHIFT PgUp')or(ks='PgUp') then
        if Shift then Tasto__Shift_Pag_Su
                 else if (iy>1) then Tasto__Pag_Su
                                else if Tasto__Su() then Continue else else // no refresh
     if (ks='SHIFT PgDn')or(ks='PgDn') then
        if Shift then if (iy<>ymax) then Tasto__Shift_Pag_Giu else
                 else if not binario then
                                     if Tasto__Pag_Giu() then Continue else // no refresh
                                                else if iy<>ymax then Tasto__Pag_Giu()
                                                                 else if Tasto__Giu() then Continue else else // no refresh
     if (ks='CTRL Key with scancode 29696')or(ks='SHIFT CTRL Key with scancode 29696')or(ks='SHIFT CTRL Right')or(ks='CTRL Right') then
        if Shift and (not binario) then Tasto__Ctrl_Shift_Destra
                                   else Tasto__Ctrl_Destra else
     if (ks='CTRL Key with scancode 29440')or(ks='SHIFT CTRL Key with scancode 29440')or(ks='SHIFT CTRL Left')or(ks='CTRL Left') then
        if Shift and (not binario) then Tasto__Ctrl_Shift_Sinistra
                                   else Tasto__Ctrl_Sinistra else
     if (ks='SHIFT CTRL Key with scancode 29952')or(ks='SHIFT CTRL End') then Tasto__Ctrl_Shift_Fine else
     if (ks='CTRL Key with scancode 29952')or(ks='CTRL End') then if not Tasto__Ctrl_Fine() then Continue else else
     if (ks='SHIFT CTRL Key with scancode 30464')or(ks='SHIFT CTRL Home') then Tasto__Ctrl_Shift_Inizio else
     if (ks='CTRL Key with scancode 30464')or(ks='CTRL Home') then if not Tasto__Ctrl_Inizio() then Continue else else
     if (ks='CTRL Key with scancode 33792')or(ks='CTRL PgUp') then if not Tasto__Ctrl_Pag_Su() then Continue else else
     if (ks='SHIFT CTRL Key with scancode 33792')or(ks='SHIFT CTRL PgUp') then Tasto__Ctrl_Shift_Pag_Su else
     if (ks='CTRL Key with scancode 30208')or(ks='CTRL PgDn') then if not Tasto__Ctrl_Pag_Giu() then Continue else else
     if (ks='SHIFT CTRL Key with scancode 30208')or(ks='SHIFT CTRL PgDn') then Tasto__Ctrl_Shift_Pag_Giu else
     if (ks='SHIFT Key with scancode 3840') then
             begin
             M_opzioni__Memoria(true);  // Shift+TAB
             {$ifdef TxtVideo}
             updatescreen(true);
             {$endif}
             Grafica;
             Info;
             end
            else
     if (ks='F3') then
                  begin       {F3 ripeti trova}
                  if testo_vuoto() then continue;
                  {$ifdef TxtVideo}
                  _start:=0;       // se viene modificato dopo Menu_Cerca, significa che la stringa e' stata trovata
                  {$endif}
                  Menu_Cerca(3);
                  goto sotto;
                  end else
     if (ks='F1')or(ks='F2') then Tasto__F1_F2(ks) else
     if (ks='F4') and not sono_Appunti() then
                  begin  {F4 ripeti sostituisci}
                  if testo_vuoto() then continue;
                  if sostituto='' then Menu_Cerca(4)
                                  else Menu_Cerca(5);
                  goto sotto;
                  end else
     if (ks='SHIFT CTRL Key with scancode 37888'){stile windows: CTRL+SHIFT+TAB} or (ks='F6'){stile IDE fp} then Prec_File_F6 else
     if ( (ks='SHIFT CTRL Key with scancode 37632')or(ks='CTRL Key with scancode 37632')or(ks='SHIFT CTRL Delete')or(ks='CTRL Delete')
          {$ifdef Linux}or(ks='SHIFT CTRL Key with scancode 1536')or(ks='CTRL Key with scancode 1536'){$endif} )
        and (selezionato.x1>0) and ( not sono_Appunti() )then M_modifica__Taglia_Selezione(false) {ctrl+canc} else
     if ( (ks='SHIFT CTRL Key with scancode 37376')or(ks='CTRL Key with scancode 37376')or(ks='CTRL Insert'{per win32})
          {$ifdef Linux}or(ks='SHIFT CTRL Key with scancode 1024')or(ks='CTRL Key with scancode 1024'){$endif} )
        and (selezionato.x1>0) and ( not sono_Appunti() ) then M_modifica__Copia_Selezione {ctrl+ins} else
     if (length(ks)=1) and (not binario) and ( (ord(ks[1]) in [8,9]) or (not (ord(ks[1]) in unprintable)) ) and influenza(ks[1]) then
                                              begin
                                              Azzera_Selezione;
                                              Evidenzia_Selezione;
                                              end else
     if (length(ks)=1) and binario and not sono_Appunti() then
                                   begin
                                   vera_tastiera:=true;
                                   Tasto__Tastiera(ks[1]);
                                   vera_tastiera:=false;
                                   end else
     if (not binario) and (ks='SHIFT '+#13) and not sono_Appunti() then   // ver 3.40
                        Tasto__Shift_Invio()
                        else
     if binario and (ks='SHIFT '+#13) and not sono_Appunti() then     {emula il carattere ASCII 0}
                                      begin
                                      vera_tastiera:=true;
                                      Tasto__Tastiera(#0);
                                      vera_tastiera:=false;
                                      end else
     if (ks='SHIFT '+#27) then
                        begin
                        if selezionato.x1=0 then Continue;
                        Azzera_Selezione;  {Azzera_Selezione forzato per la selezione}
                        Evidenzia_Selezione;
                        end else
     if (copy(ks,1,6)='SHIFT ') and not (ord(ks[7]) in unprintable) and not sono_Appunti() then Tasto__Tastiera_UnoS(ks[7]) else
     if (not binario) and (length(ks)=1) then
             begin
             if SL and (ord(ks[1]) in [8,13,32..255,9]) then SL_Error
                else
             case ord(ks[1]) of
                  8: if ( (x_riga=1)and(iy=1) ) or sono_Appunti() then Continue else
                     if UnoS and (x_riga=1) then Tasto__Back_Space_UnoS
                                       else
                                        begin
                                        vera_tastiera:=true; // superflui, perche' back_spacex viene usato solo qui' (1.80), ma per correttezza mantenuti
                                        for i:=chk_tab_back_space() downto 1 do Tasto__Back_space(i=1);
                                        vera_tastiera:=false;
                                        end;
                 13: begin
                     vera_tastiera:=true;
                     if not sono_Appunti() then Tasto__Invio();
                     vera_tastiera:=false;
                     end;
            32..255: if not sono_Appunti() then Tasto__Tastiera_UnoS(ks[1]); // controllo unprintable all'interno
                  9: begin
                     if sono_Appunti() then Continue;
                     vera_tastiera:=true;
                     for i:=1 to Tab_num do
                         if Tasto__Tastiera(#9) then break; {Tab}
                     Evidenzia_Selezione;
                     vera_tastiera:=false;
                     end;
                 27: Continue;
                 end;
             end else
     if (ks='F10') then
                   begin
                   menu__x:=byte(ListaX.costruisci);
                   F10:
                   Aggiorna_Campi_Menu;
                   if menu__x>0 then
                               begin
                               if menu__x=7 then menu__y:=byte(Lista_Visualizza.Costruisci(byte(max(1,ListaX.Get_X(8)-max(max_larghezza_menu_visualizza,11)-2)){pos X},
                                                               riga_menu+1-min(riga_menu-1,Lista_Visualizza.numElementi+3){pos Y}
                                                               ,byte(max(max_larghezza_menu_visualizza,11)){larghezza},topo,mancino,Lingue.get_txt(529),ClickDelay,byte(min(riga_menu-1,Lista_Visualizza.numElementi+3)){# righe})) // 'Files Aperti'
                                            else menu__y:=ListaY[menu__x].Costruisci;
                               end
                              else
                               begin    // esco dal menuX
                               ListaX.mostra;
                               CursorOn;
                               continue;
                               end;
                   {$ifdef TxtVideo}
                   listaX.mostra; // per riportare i giusti colori al menu
                   {$endif}
                   Evidenzia_Selezione;
                   if menu__x<>7 then testo[0]:=ListaY[menu__x].Ultimo_Tasto
                                 else testo[0]:=Lista_Visualizza.Ultimo_Tasto;
                   if pos('|',testo[0])>0 then // ho cliccato fuori dalla lista
                      begin
                      mox:=byte(StrToInt(copy(testo[0],1,pos('|',testo[0])-1)));
                      moy:=byte(StrToInt(copy(testo[0],pos('|',testo[0])+1,255)));
                      grafica;
                      info;
                      if (moy=riga_menu+1) and (mox>1) and (mox<ListaX.Get_X(8)+length(ListaX.Get_nome(8))+2) then
                         begin
                         if mox>=ListaX.Get_X(8) then if (menu__x<>8) then menu__x:=8 else continue else
                         if mox>=ListaX.Get_X(7) then if (menu__x<>7) then menu__x:=7 else continue else
                         if mox>=ListaX.Get_X(6) then if (menu__x<>6) then menu__x:=6 else continue else
                         if mox>=ListaX.Get_X(5) then if (menu__x<>5) then menu__x:=5 else continue else
                         if mox>=ListaX.Get_X(4) then if (menu__x<>4) then menu__x:=4 else continue else
                         if mox>=ListaX.Get_X(3) then if (menu__x<>3) then menu__x:=3 else continue else
                         if mox>=ListaX.Get_X(2) then if (menu__x<>2) then menu__x:=2 else continue else
                         if mox>=ListaX.Get_X(1) then if (menu__x<>1) then menu__x:=1;
                         ListaX.selezionato:=menu__x;
                         ListaX.stampa_selezionato;
                         goto F10;
                         end;
                      end else
                   if testo[0]='F10' then
                      begin
                      grafica;
                      info;
                      menu__x:=byte(ListaX.costruisci);
                      goto F10;
                      end else
                   if (testo[0]<>'destra')and(testo[0]<>'sinistra') then
                      begin
                      grafica;
                      info;
                      end;
                   case menu__x of
                        1: menu_file(menu__y);
                        2: menu_modifica(menu__y);
                        3: menu_cerca(menu__y);
                        4: begin
                           menu_Formattato(menu__y);
                           ListaX.Stampa_selezionato;
                           while menu__y in [1..5] do goto F10;
                           end;
                        5: begin
                           menu_speciale(menu__y);
                           ListaX.Stampa_selezionato;
                           while menu__y in [1..4] do goto F10;
                           end;
                        6: menu_opzioni(menu__y);
                        7: menu_visualizza(menu__y);
                        8: menu_recenti(menu__y);
                        end;
                   if (menu__x=9)and(ListaY[9].ultimo_tasto='esc') then
                        begin
                        menu__x:=1;
                        goto F10;
                        end;
                   {$ifdef TxtVideo}
                   if menu__y>0 then
                               begin
                               menu__y:=0;
                               ForceUpdateXY(0,riga_menu-1,ScreenWidth*5);
                               end;
                   {$endif}
                   Grafica; // necessario refresh (se ad esempio premo freccia dx/sx)
                   barra_verticale;
                   info;
                   if menu__x<>7 then testo[0]:=ListaY[menu__x].Ultimo_Tasto
                                 else testo[0]:=Lista_Visualizza.Ultimo_Tasto;
                   if menu__x in [9,10,11,12,13] then  // File: Stampa, Converti, Nuovo, Salva Copia, Carica
                      begin
                      if ListaY[menu__x].ultimo_tasto='esc' then
                               begin
                               listaX.stampa_selezionato;
                               menu__x:=1;
                               goto F10;
                               end;
                      if ListaY[menu__x].Ultimo_Tasto='destra' then
                               begin
                               testo[0]:='destra';
                               menu__x:=1; // sara' poi 2
                               ListaX.selezionato:=1;
                               end;
                      if ListaY[menu__x].Ultimo_Tasto='sinistra' then
                               begin
                               menu__x:=2; // sara' poi 1
                               ListaX.selezionato:=2;
                               testo[0]:='sinistra';
                               end;
                      end;
                   if testo[0]='destra' then
                      begin
                      inc(ListaX.selezionato);
                      inc(menu__x);
                      if ListaX.selezionato>ListaX.NumElementi then
                            begin
                            ListaX.selezionato:=1;
                            menu__x:=ListaX.selezionato;
                            end;
                      listaX.Stampa_Selezionato;
                      testo[0]:='';
                      goto F10;
                      end else
                   if testo[0]='sinistra' then
                      begin
                      dec(ListaX.selezionato);
                      dec(menu__x);
                      if ListaX.selezionato=0 then
                            begin
                            ListaX.selezionato:=ListaX.NumElementi;
                            menu__x:=ListaX.NumElementi;
                            end;
                      listaX.Stampa_Selezionato;
                      testo[0]:='';
                      goto F10;
                      end;
                   testo[0]:='';
             end else
     if (ks='ALT F4') then
        begin
        M_file__Esci;
        grafica;
        end else
     if (ks='ALT F3') {stile FP ide} or (ks='CTRL F4') {stile windows} then
        begin
        if M_file__Chiudi() then grafica;
        end else
     if (ks='CTRL Key with scancode 37888'){stile windows: CTRL+TAB} or (ks='F5'){stile IDE fp} then Next_File_F5 else
     if (ks='F12'){beta Test} then beta_test else;
     info;
     Svuota_Tastiera;
     end;
while Annulla_Selezione.numelementi>Annulla_Txt.numelementi do Annulla_Selezione.cancella_iniziale;
until False;   {e' la procedura ESCI che chiude il programma}
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

procedure M_opzioni__Configurazione_predefinita; // ver 3.11
begin
if files_non_salvati() then
   begin
   messaggio(1);
   Exit;
   end;
if upcase(M_opzioni__Memoria(false{configurazione predefinita}))='N' then Exit;
M_file__Chiudi_Tutti;
if not Editor_Ini.Configuazione_Predefinita() then
   begin
   messaggio(2);
   Exit;
   end;
Pre_Start_1;
Inizializzazione_2;
Visualizza_ini;
Svuota_Tastiera;
input;
end;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

begin  // main
Pre_Start_1;
Inizializzazione_2;
Visualizza_ini;
Multi_Terminale;
Svuota_Tastiera;
Input;
end.


{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}


Versione:    Data:       Modifica:
U=ufficiale
N=non ufficiale

3.3.0.1090   16/01/09    rimosso bug annulla su righe che vanno a capo consecutive;
3.3.0.1089   13/01/09    inizio rimozione bug annulla su righe che vanno a capo consecutive;
3.3.0.1088   12/01/09    cambia numero di colonne ottimizzato;
3.3.0.1087   11/01/09    menu con click su stessa voce, chiude il menu;
3.3.0.1086   06/01/09    setup della lingua integrato in editor.ini;
3.3.0.1085   03/01/09    setup della lingua finito;
3.3.0.1084   02/01/09    inizio avvio con setup della lingua;
3.3.0.1083   01/01/09    menu speciale / svuota appunti;
3.3.0.1082   30/12/08    mostra lista appunti con elimina tutto e incolla tutto;
3.2.8.1081 U 19/12/08    menu mostra appunti e visualizza corretti;
3.2.8.1080   02/12/08    menu mostra appunti parzialmente funzionante;
3.2.8.1079   01/12/08    continuo menu mostra appunti;
3.2.8.1078   29/11/08    inizio menu mostra appunti;
3.2.6.1077 U 25/11/08    fine cambia numero di colonne;
3.2.6.1076   24/11/08    continuo cambia numero di colonne formato testo;
3.2.6.1075   16/11/08    inizio cambia numero di colonne in esadecimale;
3.2.6.1074   14/11/08    ripeti apri in txt/Esa come originale + in opposto (2righe)
3.2.6.1073   11/11/08    sub menu File / Carica;
3.2.6.1072   02/11/08    completata pausa in file di testo;
3.2.6.1071   01/11/08    inizio pausa in file di testo;
3.2.5.1070 N 21/10/08    ricerca parola intera migliorata anche per riga;
3.2.5.1069   19/10/08    ricerca parola intera migliorata;
3.2.4.1068 U 05/10/08    duplica finito;
3.2.4.1067   04/10/08    duplica per il formato binario finito;
3.2.4.1067   03/10/08    duplica per il formato testo finito;
3.2.4.1066   28/09/08    inizio di duplica;
3.2.3.1065 N 27/09/08    ricerca per riga completata;
3.2.3.1065   26/09/08    ricerca per riga da sistemare nel file .ini;
3.2.3.1064   06/09/08    ricerca per riga con parola intera;
3.2.3.1063   05/09/08    ricerca per riga con ignora maiuscole/minuscole;
3.2.3.1062   02/09/08    ricerca per riga di base funzionante;
3.2.3.1061   01/09/08    input ricerca per riga finito;
3.2.3.1060   29/08/08    inizio ricerca per riga;
3.2.2.1059 U 26/08/08    menu cerca/vai a paragrafo;
3.2.1.1058 N 25/08/08    bug in annulla di F1 col carattere #0;
3.2.1.1057   24/08/08    correzioni anomalie grafiche;
3.2.1.1056   23/08/08    menu cerca/vai: bug al byte;
3.2.1.1055   22/08/08    menu cerca/vai: non esce dalla funzione se si preme ok;
3.2.1.1054   21/08/08    menu formattato: se Š attivo selezione e non c''Š selezione, tutto disattivato;
3.2.0.1053 U 20/08/08    ottimizzazioni varie;
3.2.0.1052   19/08/08    ottimizzazioni per multilingua;
3.2.0.1051   18/08/08    configurazione predefinita con language;
3.2.0.1050   15/08/08    ricarica lingua predefinita;
3.2.0.1049   09/08/08    correzioni in DOS;
3.2.0.1048   08/08/08    opzioni per converti in html;
3.2.0.1047   07/08/08    configura2 corretto;
3.2.0.1046   06/08/08    configura1 corretto;
3.2.0.1045   05/08/08    velocizzato riavvio con configurazione predefinita;
3.2.0.1044   03/08/08    shift+tab mancante in cerca/sostituisci
3.2.0.1043   02/08/08    ancora miglioramenti;
3.2.0.1042   30/07/08    ulteriori miglioramenti;
3.2.0.1041   29/07/08    migliore controllo nelle voci di menu: disabilitate se necessario;
3.2.0.1040   28/07/08    fine della traduzione;
3.2.0.1039   26/07/08    inizio conversione in inglese di T_Edit30;
3.2.0.1038   23/07/08    inizio conversione in inglese di T_Edit24;
3.2.0.1037   06/07/08    continuo conversione in inglese di T_Edit1x;
3.2.0.1036   05/07/08    inizio conversione in inglese di T_Edit1x;
3.2.0.1035   23/06/08    fine di multilingua in T_Edit30;
3.2.0.1034   20/06/08    inizio multilingua in T_Edit30;
3.2.0.1033   18/06/08    aggiunto ctrl+shit+tab per visualizzare file precedente;
3.2.0.1032   11/06/08    fine di multilingua in T_Edit24;
3.2.0.1031   07/06/08    continuo multilingua in T_Edit24;
3.2.0.1030   02/06/08    inizio multilingua in T_Edit24;
3.2.0.1029   26/05/08    multilingua in T_Edit20;
3.2.0.1028   26/03/08    continuo multilingua;
3.2.0.1028   25/03/08    fix bug: se testo vuoto, F3/F4 ora disattivato
3.2.0.1027   23/03/08    multilingua: fine di T_Edit1x;
3.2.0.1026   12/03/08    multilingua: continuo T_Edit1x;
3.2.0.1025   02/03/08    multilingua: inizio T_Edit1x;
3.2.0.1024   19/02/08    ancora continuo multilingua: finito Edit320;
3.2.0.1023   15/02/08    ancora continuo multilingua;
3.2.0.1022   10/02/08    continuo multilingua;
3.2.0.1021   05/02/08    inizio multilingua;
3.1.5.1020 U 27/01/08    SL scriveva in certi casi, anche quando non doveva;
3.1.5.1019   24/01/08    inizio rimozione codice di test;
3.1.5.1018   21/01/08    corretto tasto di scelta rapida shift+tab;
3.1.5.1017   15/01/08    ottimizzazioni varie;
3.1.5.1016   14/01/08    sistemato messaggio del tipo di ripristino;
3.1.5.1015   13/01/08    ripristino di cursore libero;
3.1.5.1014   01/01/08    corretto bug F1/F2 di ripristina per carattere 0;
3.1.5.1013   26/12/07    ripristino di UnoS;
3.1.5.1012   25/12/07    continuo ripristina di Insert;
3.1.5.1011   24/12/07    inizio ripristina di Insert;
3.1.5.1010   18/12/07    inizio ripristina di Mouse_CL;
3.1.5.1009   08/12/07    ripristina di Canc_UnoS;
3.1.5.1008   02/12/07    fine di ripristina scrittura normale;
3.1.5.1007   2?/11/07    ripristina di scrittura normale;
3.1.5.1006   25/11/07    ripristina di taglia selezione quadrata;
3.1.5.1005   20/11/07    rimossi piccoli bug: annulla_esa video era bad, messaggio SL non scompariva, freccia verso basso andava oltre con CL e non era anullabile;
3.1.5.1004   11/11/07    ripristina: correzione di alcuni bug;
3.1.5.1003   06/11/07    ripristina taglia selezione non quadrata;
3.1.5.1002   04/11/07    fine di tutti i ripristina formattato;
3.1.5.1001   03/11/07    inizio ripristina formattato destra;
3.1.5.1000   02/11/07    fine ripristina formattato sinistra;
3.1.5.999    01/11/07    continuo ripristina formattato;
3.1.5.998    28/09/07    inizio ripristina formattato;
3.1.5.997    25/09/07    ripristina per back_space;
3.1.5.996    23/09/07    ripristina per canc;
3.1.5.995    21/09/07    ripristina per invio ottimizzato;
3.1.5.994    19/09/07    continuo Ripristina per invio;
3.1.5.993    18/09/07    inizio Ripristina per invio;
3.1.5.992    14/09/07    inizio Ripristina;
3.1.4.991 U  12/09/07    incolla tutto in riga;
3.1.4.990    11/09/07    incolla tutto pare completo;
3.1.4.989    10/09/07    inizio di incolla tutto;
3.1.3.988 N  09/09/07    menu formattato: togli spazi doppi;
3.1.2.987 N  05/09/07    crea percorso inesistente quando sala;
3.1.1.986 N  04/09/07    avvia configurazione predefinita;
3.1.0.985 U  03/09/07    correzioni grafiche per Dos (32.000 righe);
3.1.0.984    02/09/07    corretto bug per salva selezione su una sola riga;
3.1.0.983    01/09/07    corretto bug per multifile;
3.1.0.982    31/08/07    fine spostamento codice;
3.1.0.981    29/08/07    inizio spostamento codice;
3.0.4.980    28/08/07    tipo di annulla formattato aggiornato;
3.0.4.979    27/08/07    menu formattato: inizio di annulla;
3.0.4.978    26/08/07    menu formattato: fine di normale;
3.0.4.977    25/08/07    menu formattato: continuo di normale;
3.0.4.976    24/08/07    menu formattato: inizio di normale;
3.0.4.975    23/08/07    menu formattato: selezione interna sistemata;
3.0.4.974    22/08/07    inizio modifica menu formattato;
3.0.3.973    21/08/07    fix bug chiudi esadecimale;
3.0.3.972    20/08/07    fine di rifacimento menu_speciale;
3.0.3.971    19/08/07    rifacimento menu_speciale;
3.0.2.970    18/08/07    fine stampa si/no/tutto;
3.0.2.969    17/08/07    inizio stampa si/no/tutto;
3.0.1.968    16/08/07    seleziona parola, riga attuale, righe...;
3.0.0.967 U  13/08/07    corretti simboli speciali per htm;

Versione:    Data:    Righe:   Mem:   Modifica:
U=ufficiale                    (Kb)
N=non ufficiale

2.9.6.966    08/08/07    ?       ?    rtf con size indipendente da html;
2.9.6.965    07/08/07    ?       ?    fine scrittura per rtf;
2.9.6.964    06/08/07    ?       ?    inizio scrittura per rtf;
2.9.6.963    05/08/07    ?       ?    continuo opzioni rtf con shift+tab;
2.9.6.962    04/08/07    ?       ?    continuo rtf;
2.9.6.961    03/08/07    ?       ?    inizio rtf;
2.9.5.960 U  02/08/07    ?       ?    fix bug per menu htm;
2.9.5.959    01/08/07    ?       ?    fine htm.font;
2.9.4.958    31/07/07    ?       ?    continuo htm.font;
2.9.4.957    29/07/07    ?       ?    inizio htm.font;
2.9.3.956    27/07/07    ?       ?    htm.sottolineato parzialmente completato;
2.9.3.955    10/06/07    ?       ?    continuo htm.sottolineato;
2.9.3.954    05/06/07    ?       ?    inizio htm.sottolineato;
2.9.2.953 N  01/05/07    ?       ?    corrette opzioni per conversione in Htm;
2.9.2.952    28/03/07    ?       ?    Shift+Click seleziona (no in DOS);
2.9.1.951 U  27/03/07    ?       ?    sistemazione recenti completata;
2.9.1.950    13/03/07    ?       ?    sistemazione recenti senza duplicati;
2.9.1.949    11/03/07    ?       ?    inizio recenti senza duplicati;
2.9.0.948 N  13/02/07    ?       ?    fine di shift+tab;
2.9.0.947    12/02/07    ?       ?    readstring2 con shift+tab;
2.9.0.946    11/02/07    ?       ?    continuo shift+tab;
2.9.0.945    06/02/07    ?       ?    inizio shift+tab;
2.8.9.944 N  05/02/07    ?       ?    fine pausa per caricamento files binari per DOS;
2.8.9.943    04/02/07    ?       ?    inizio pausa per caricamento files binari per DOS;
2.8.9.942    31/01/07    ?       ?    fine pausa per caricamento files binari;
2.8.9.941????18/01/07    ?       ?    continuo pausa per caricamento files;
2.8.9.940    01/03/06    ?       ?    inizio pausa per caricamento files;
2.8.8.939 N  18/02/06    ?       ?    corretto ctrl sinistra
2.8.8.938    16/02/06    ?       ?    opzione /MEM pare corretta;
2.8.8.937    15/02/06    ?       ?    corretti bug minori;
2.8.8.936    14/02/06    ?       ?    pare finito /MEM;
2.8.8.935    12/02/06    ?       ?    continuo /MEM;
2.8.8.934    11/02/06    ?       ?    inizio /MEM;
2.8.7.933 U  01/02/06    ?       ?    fine ricerca dentro ai files a 64bit;
2.8.7.932    31/01/06    ?       ?    inizio ricerca dentro ai files a 64bit;
2.8.7.931    30/01/06    ?       ?    salva copia con accesso ai files a 64bit;
2.8.7.930    29/01/06    ?       ?    continuo accesso ai files a 64bit;
2.8.7.929    28/01/06    ?       ?    inizio accesso ai files a 64bit;
2.8.6.928 N  27/01/06    ?       ?    con opzione /N da configura3;
2.8.5.927    25/01/06    ?       ?    con opzione /N per editor.ini;
2.8.5.926    24/01/06    ?       ?    con opzione /N da terminale;
2.8.4.925 N  16/01/06    ?       ?    associa estensione per files aperti con estensione sconosciuta;
2.8.3.924 U  12/01/06    ?       ?    ottimizzazioni varie;
2.8.3.923    11/01/06    ?       ?    menu sfoglia migliorato;
2.8.3.922    10/01/06    ?       ?    copia selezione quadrata finita;
2.8.3.921    08/01/06    ?       ?    copia selezione quadrata;
2.8.3.920    07/01/06    ?       ?    copia selezione funzionante, ma manca selezione quadrata;
2.8.3.919    06/01/06    ?       ?    rimossi bug minori;
2.8.3.918    05/01/06    ?       ?    debug funzionante di salva copia da byte a byte;
2.8.3.917    04/01/06    ?       ?    bug apertura visualizza da editor.ini;
2.8.3.916    03/01/06    ?       ?    debug di salva copia da byte a byte;
2.8.3.915    02/01/06    ?       ?    continuo salva copia da byte a byte;
2.8.3.914????01/01/06    ?       ?    inizio salva copia da byte a byte;
2.8.3.913    31/12/05    ?       ?    continuo input DA..A innovato;
2.8.3.912    30/12/05    ?       ?    inizio input DA..A innovato;
2.8.2.911 N  29/12/05    ?       ?    blockread con errore di I/O dava crash;
2.8.1.910 N  28/12/05    ?       ?    conversione per Htm solo del testo selezionato;
2.8.0.909 U  27/12/05    ?       ?    corretto bug per Shell/Apri;
2.8.0.908    23/12/05    ?       ?    sistemazione menu;
2.8.0.907    16/12/05    ?       ?    ultimazione htm;
2.8.0.906    15/12/05    ?       ?    inizio caricamento opzioni per htm da editor.ini;
2.8.0.905    14/12/05    ?       ?    debug opzioni per htm;
2.8.0.904    13/12/05    ?       ?    ancora opzioni per htm;
2.8.0.903    12/12/05    ?       ?    continuo opzioni per htm;
2.8.0.902    19/11/05    ?       ?    corretto bug per Opzioni mancanti con nuova associazione;
2.8.0.901    06/11/05    ?       ?    ancora configurazione htm da menu;
2.8.0.900    05/11/05    ?       ?    continuo configurazione htm da menu;
2.8.0.899    04/11/05    ?       ?    inizio configurazione htm da menu;
2.8.0.898    03/11/05    ?       ?    versione htm base pare funzionante;
2.8.0.897    02/11/05    ?       ?    rilevato bug per LineEnding da correggere;
2.8.0.896    01/11/05    ?       ?    continuo tag htm;
2.8.0.895    31/10/05    ?       ?    inizio tag htm;
2.7.7.894    29/10/05    ?       ?    -START inizio converti htm;
2.7.6.893 N  28/10/05    ?       ?    rimuove le opzioni errate da editor.ini e associa estensione nulla;
2.7.5.892 U  27/10/05    ?       ?    -STOP fine scrittura estensioni per editor.ini;
2.7.5.891    26/10/05    ?       ?    continuo scrittura estensioni per editor.ini;
2.7.5.890    23/10/05    ?       ?    inizio scrittura estensioni per editor.ini;
2.7.5.889    22/10/05    ?       ?    rimozione estensioni da editor.ini;
2.7.5.888    21/10/05    ?       ?    continuo associazione estensioni;
2.7.5.887    20/10/05    ?       ?    -START associazione estensioni;
2.7.4.886 N  19/10/05    ?       ?    corretto bug: si perdeva il pimo file senza nome dopo aver fatto Nuovo: start 2.61;
2.7.4.885    18/10/05    ?       ?    apertura errata di file omessi dalla lista;
2.7.4.884    14/10/05    ?       ?    piccole correzioni visive;
2.7.4.883    13/10/05    ?       ?    velocizzato scambio file per visualizza/f5/f6;
2.7.3.882    07/10/05    ?       ?    editor.ini aggiornato;
2.7.3.881    06/10/05    ?       ?    -STOP configura2 inizio editor.ini;
2.7.3.880    05/10/05    ?       ?    configura2 inizio lunghezza riga max txt/esa;
2.7.3.879    04/10/05    ?       ?    inizio integrazione di file= per editor.ini;
2.7.3.878    01/10/05    ?       ?    inizio con testo con array dinamici;
2.7.2.877    30/09/05    ?       ?    -START inizio modifica numero righe nel formato testo per file attuale;
2.7.0.876 U  29/09/05  4350      ?    corretto bug per apertura file non esistenti da editor.ini;
2.6.9.875 U  28/09/05    ?       ?    con /SF, le righe venivano scritte senza invio;
2.6.9.874    25/09/05    ?       ?    correzione piccoli bug;
2.6.9.873    24/09/05    ?       ?    fine correzione di bug sul mouse;
2.6.9.872    23/09/05    ?       ?    correzione di bug sul mouse;
2.6.9.871    22/09/05    ?       ?    sostituzione di widestring con H+ (causa bug OS/2);
2.6.9.870    20/09/05    ?       ?    -STOP menu nuovo esa/txt;
2.6.9.869    19/09/05    ?       ?    inizio rimozione /NN;
2.6.9.868    15/09/05    ?       ?    aggiornamento di Configura1 e editor.ini;
2.6.9.867    14/09/05    ?       ?    aggiornamento di Configura1;
2.6.9.866    13/09/05    ?       ?    -START separazione lunghezza esa/txt;
2.6.8.865 N  10/09/05    ?       ?    -STOP nel menu opzioni, aggiunti salva configurazione;
2.6.8.864    09/09/05    ?       ?    editor.ini inizio scrittura per salva configurazione/visualizza/recenti;
2.6.8.863    08/09/05    ?       ?    editor.ini con righe vuote non ripetute, commenti dopo i gruppi possibili  [gruppo] ; commento ;
2.6.8.862    07/09/05    ?       ?    -START editor.ini inizio salva configurazione/visualizza/recenti;
2.6.7.861 N  06/09/05    ?       ?    editor.ini con fine linea sempre #13+#10;
2.6.7.860    05/09/05    ?       ?    ctrl+v per incolla con scelta e incolla ultimo;
2.6.6.859 U  03/09/05  4300      ?    salva_con_nome non era possibile se il percorso era su CD;
2.6.6.858    25/08/05    ?       ?    editor.ini ora: la pipe risulta utilizzabile tra i commenti;
2.6.6.857    24/08/05    ?       ?    rimossa riga di troppo tra opzioni e recenti/visualizza (editor.ini);
2.6.6.856    19/08/05    ?       ?    ottimizzata apertura_bin per Crt, PopUpErr per Win32;
2.6.6.855    18/08/05    ?       ?    problemi per next_length binario, bug undo non applicato scrivendo oltre 80 colonne;
2.6.6.854    16/08/05    ?       ?    passando ad un nuovo blocco binario, la selezione non scompariva;
2.6.6.853    12/08/05    ?       ?    corretta selezione da riaprire;
2.6.6.852    10/08/05    ?       ?    corretto bug per trova, start ver 2.30;
2.6.6.851    04/08/05    ?       ?    nuovi parametri testati;
2.6.6.850    01/08/05    ?       ?    nuovi parametri da testare;
........ 28/07/2005  Laurea 88/110, Editor ver 2.61 e 2.62 ............
2.6.6.849    21/07/05    ?       ?    -STOP continuo lettura nuovi parametri recenti/visualizza di editor.ini;
2.6.6.848    19/07/05    ?       ?    inizio lettura nuovi parametri recenti/visualizza di editor.ini;
2.6.6.847    18/07/05    ?       ?    -START scrittura nuovi parametri recenti/visualizza di editor.ini;
2.6.5.846 U  15/07/05    ?       ?    -START -STOP gestione fino 254 colonne;
2.6.4.845 N  14/07/05    ?       ?    -START -STOP legge/salva selezione_quadrata editor.ini;
2.6.3.844 N  13/07/05    ?       ?    -START -STOP stampante ad oggetti;
2.6.2.843 N  10/07/05    ?       ?    -STOP coretto undo selezione quadrata con taglia, per CRT;
2.6.2.842    02/07/05    ?       ?    copia selezione quadrata Crt;
2.6.2.841    01/07/05    ?       ?    scrittura del testo con widestring;
2.6.2.840    29/06/05    ?       ?    selezione quadrata continuata per Crt;
2.6.2.839    28/06/05    ?       ?    integrato supporto automatico per mancino;
2.6.2.838    27/06/05    ?       ?    aggiunto sleep per SNA, SN ...;
2.6.2.837    22/06/05    ?       ?    continuo adattamento Crt: inizio selezione quadrata;
2.6.2.836    21/06/05    ?       ?    continuo adattamento Crt;
2.6.2.835    20/06/05    ?       ?    inizio adattamento Crt;
2.6.2.834    13/06/05    ?       ?    corretto bug per svuota memoria negli appunti;
2.6.2.833    12/06/05    ?       ?    correzione modifica lunghezza stringhe, con setlength;
2.6.2.832    11/06/05    ?       ?    correzione undo: fine cursore libero /CL;
2.6.2.831    09/06/05    ?       ?    correzione undo: inizio cursore libero /CL;
2.6.2.830    05/06/05    ?       ?    correzione undo: digitazione con tasto insert;
2.6.2.829    04/06/05    ?       ?    correzioni varie;
2.6.2.828    03/06/05    ?       ?    corretto ritorno da shell immediato per OS/2;
2.6.2.827    02/06/05    ?       ?    correzione undo: continuo taglia selezione tutto il testo ed eadecimale;
2.6.2.826    01/06/05    ?       ?    correzione undo: continuo taglia selezione;
2.6.2.825    31/05/05    ?       ?    correzione undo: taglia selezione;
2.6.2.824    30/05/05    ?       ?    correzione undo: taglia/incolla;
2.6.2.823    29/05/05    ?       ?    correzione undo: inizio per incolla;
2.6.2.822    28/05/05    ?       ?    correzione undo: allinea, canc, back_space;
2.6.2.821    27/05/05    ?       ?    correzione undo: F1, F2, invio, giustifica D,S,C;
2.6.2.820    26/05/05    ?       ?    correzione bug per /nn con tab oltre riga non controllato;
2.6.2.819    24/05/05    ?       ?    correzione bug per configura1;
2.6.2.818    23/05/05    ?       ?    correzione bug per cerca_trova;
2.6.2.817    21/05/05    ?       ?    correzione bug;
2.6.2.816    20/05/05    ?       ?    aggiornamento selezione: shift pag Up/Down;
2.6.2.815    19/05/05    ?       ?    aggiornamento selezione: shift ctrl dx/sx;
2.6.2.814    18/05/05    ?       ?    inizio aggiornamento selezione: shift dx/sx;
2.6.2.813    16/05/05    ?       ?    aggiornato editor.ini: gruppi RECENTI e VISUALIZZA;
2.6.2.812    15/05/05    ?       ?    FPC 2.0.0 , aggiornato il mouse;
2.6.2.811    14/05/05    ?       ?    aggiornato per esadecimale, vai, cerca, sostituisci;
2.6.2.810    13/05/05    ?       ?    aggiornato /nn per terminale, configura1 e editor.ini;
2.6.2.809    12/05/05    ?       ?    tasti: ctrl dx/sx e /US /CL
2.6.2.808    11/05/05    ?       ?    tasti: back_space/canc;
2.6.2.807    10/05/05    ?       ?    tasti: ctrl fine/inizio/PgUp/PgDn/invio/Tab;
2.6.2.806    09/05/05    ?       ?    tasti: dx/sx/su/giu;
2.6.2.805    08/05/05    ?       ?    tasti: Inizio e Fine;
2.6.2.804    07/05/05    ?       ?    -START riga lunga fino 255: alpha 1;
2.6.2.803    05/05/05    ?       ?    -STOP corretto bug: selezionava con multi_click su barra verticale;
2.6.1.802 U  04/05/05    ?       ?    editor.ini pare aggiornato correttamente;
2.6.1.801    03/05/05    ?       ?    scritturra recenti XY corretta;
2.6.1.800    01/05/05    ?       ?    apertura avvenuta per visualizza files aperti;
2.6.1.799    30/04/05    ?       ?    visualizza files aperti: scrittura;
2.6.1.798    29/04/05    ?       ?    inizio di visualizza files aperti;
2.6.1.797    28/04/05    ?       ?    files recenti chiusi;
2.6.1.796    27/04/05    ?       ?    aggiornamento opzioni, file_nuovi sempre con nome di numero crescente, e sfoglia con unita';
2.6.1.795    26/04/05    ?       ?    scrittura opzioni;
2.6.1.794    25/04/05    ?       ?    -START inizio di parametri per editor.ini salvabili: lettura opzioni;
2.6.1.793    24/04/05    ?       ?    inizio dei parametri XXX_ per editor.ini ;
2.6.1.792    23/04/05    ?       ?    aggiunto FindClose;
2.5.8.791 N  22/04/05    ?       ?    tolti i caratteri accentati; (giorno 21, dal prof)
2.5.8.790    19/04/05    ?       ?    ottimizzazioni per linux; (eletto Papa Benedetto 16ø tedesco 78 anni, 10ø anno dal primo computer(1995):486dx2s,66mhz,8ram,540HD,cd,9600bps,1video,sound)
2.5.8.789    18/04/05    ?       ?    -STOP multi-incolla per editor.ini e configura2;
2.5.8.788    16/04/05    ?       ?    inizio num_notes per multi-incolla;
2.5.8.787    15/04/05    ?       ?    multi-incolla di base testato;
2.5.8.786    14/04/05    ?       ?    multi-incolla di base finito;
2.5.8.785    13/04/05    ?       ?    inizio multi-incolla;
2.5.8.784    12/04/05    ?       ?    -START output a video ottimizzato, inizio multicopia;
2.5.7.783 N  11/04/05    ?       ?    corretti bug minori, unificati annulla TXT e ESA;
2.5.6.782 N  10/04/05    ?       ?    fine integrazione mouse win32, prova con os/2;
2.5.6.781    09/04/05    ?       ?    inizio reintegrazione mouse (Carlo e camilla, giuseppe e serafina);
2.5.6.780    08/04/05    ?       ?    -STOP corretto bug per configura2 e Vai (venerdi 2005/04/08- ore 10: funerali del PAPA Giovanni Paolo II);
2.5.6.779    07/04/05    ?       ?    revisione con solo keyboard per t_edit1x;
2.5.6.778    06/04/05    ?       ?    revisione con solo keyboard per sfoglia_file;
2.5.6.777    05/04/05    ?       ?    continuo revisione con solo keyboard;
2.5.6.776    04/04/05    ?       ?    -START inizio revisione con solo keyboard (sabato 2005/04/02- ore 21:37 muore il PAPA);
........ tastiera solo con Keyboard ............
2.5.6.775    31/03/05    ?       ?    inizio mouse multi_click per tutte le piattaforme;
2.5.5.774 N  29/03/05    ?       ?    -STOP corretto shift+ canc/ins;
2.5.5.773    27/03/05    ?       ?    terminale adattato;
2.5.5.772    26/03/05    ?       ?    attributi reinseriti;
2.5.5.771    23/03/05    ?       ?    fine correzioni CRT;
2.5.5.770    22/03/05    ?       ?    cambio dei caratteri non stampabili correttamente;
2.5.5.769    21/03/05    ?       ?    inizio CRT;
2.5.5.768    19/03/05    ?       ?    continuo rimozione #10;
2.5.5.767    18/03/05    ?       ?    inizio rimozione #10;
2.5.4.766 N  16/03/05    ?       ?    risolti piccoli bug;
2.5.4.765    15/03/05    ?       ?    editor.ini non veniva avviato;
2.5.4.764    14/03/05    ?       ?    percorso da linea di comando esteso con /...
2.5.4.763    13/03/05    ?       ?    con ValidNameLinux/OS2 per altro32;
2.5.4.762    12/03/05    ?       ?    rimossa stampa per Linux, costante max_larghezza;
2.5.4.761    11/03/05    ?       ?    inizio correzione anomalie per Linux;
2.5.4.760    10/03/05    ?       ?    corretto bug di visualizzazione, annullando il menu stampa
2.5.4.759    09/03/05    ?       ?    rimossa stampa e fix_note_editor per Linux;
2.5.4.758    08/03/05    ?       ?    -START inizio versione per Linux;
........ inizio versione per Linux ............
2.5.4.757    07/03/05    ?       ?    -STOP bug: menu_x scompariva parzialmente quando si faceva salva_con_nome;
2.5.3.756 N  04/03/05    ?       ?    fine versione per OS/2, corretto bug opzione /nn
2.5.2.755 N  03/03/05    ?       ?    continuo versione per OS/2: correzione #10+#8
2.5.2.754    02/03/05    ?       ?    patch per gotoxy di OS/2: OS2_fix.inc;
2.5.2.753    01/03/05    ?       ?    mclick2 ora non fa nulla nelle versioni non per DOS;
2.5.2.752    28/02/05    ?       ?    gotoxy per OS/2 non funziona correttamente;
2.5.2.751    27/02/05    ?       ?    -START inizio versione per OS/2;
........ inizio versione per OS/2 ............
2.5.2.750    26/02/05  4053      ?    82±Shift_Tab;
2.5.2.749    25/02/05    ?       ?    indicatore di modifica degli appunti;
2.5.2.748    20/02/05    ?       ?    corretto bug incolla in riga maxy+1;
2.5.2.747    16/02/05    ?       ?    fine SNAT aggiornando APRI;
2.5.2.746    15/02/05    ?       ?    continuo SNAT;
2.5.2.745    14/02/05    ?       ?    inizio SNAT;
2.5.2.744    13/02/05    ?       ?    corretto bug per "salva con nome";
2.5.2.743    25/01/05    ?       ?    fine modifica ASK, ora open_ASK;
2.5.2.742    24/01/05    ?       ?    corretta pertura da terminale invertita;
2.5.2.741    14/01/05    ?       ?    correzione bug piccoli;
2.5.2.740    13/01/05    ?       ?    ottimizzato pag_giu;
2.5.2.739    12/01/05    ?       ?    inizio modifica di ASK;
2.5.2.738    09/01/05    ?       ?    menu sistemato;
2.5.2.737    07/01/05    ?       ?    ricompilato per Windows;
2.5.2.736    06/01/05    ?       ?    attributi completati;
2.5.2.735    05/01/05    ?       ?    inizio integrazione di SALVA con attributi;
2.5.2.734    04/01/05    ?       ?    inizio assorbimento attributi;
2.5.2.733    03/01/05    ?       ?    file di zero byte senza cambio richiesta di tipo quando vengono aperti;
2.5.2.732    02/01/05    ?       ?    ottimizzazioni varie;
2.5.2.731????01/01/05    ?       ?    corretto bug mancato messaggio errore di file non trovato da terminale;
2.5.2.730    31/12/04    ?       ?    continuo debug integrazione menu visualizza;
2.5.2.729    30/12/04    ?       ?    inizio debug integrazione menu visualizza;
2.5.2.728    28/12/04    ?       ?    continuo integrazione menu visualizza;
2.5.2.727    21/12/04    ?       ?    inizio integrazione nuovo menu visualizza;
2.5.2.726    20/12/04    ?       ?    SNA/SN : tolto ritardo visivo della risposta;
2.5.0.725 U  29/11/04    ?       ?    ricarica txt, rimaneva la scritta;
2.5.0.724    26/11/04    ?       ?    aggiunta opzione /DEF;
2.5.0.723    24/11/04    ?       ?    correzione domanda inutile di definisci_tipo;
2.5.0.722    23/11/04    ?       ?    open_error2 rimosso;
2.5.0.721    22/11/04    ?       ?    integrazione totale di /ESA /TXT /ASK;
2.5.0.720    21/11/04    ?       ?    continuo molteplici multifile da terminale;
2.5.0.719    19/11/04    ?       ?    molteplici multifile da terminale;
2.4.5.718 U  18/11/04    ?       ?    rimozione bug versione precedente;
2.4.5.717    16/11/04    ?       ?    rimozioni bug nella setessa versione;
2.4.5.716    10/11/04    ?     1155   integrazione MClick2: doppio, triplo, quadruplo;
2.4.5.715    09/11/04    ?       ?    doppio click per sfoglia;
2.4.5.714    04/11/04    ?       ?    indicato il massimo numero di copie per la stampa;
2.4.5.713    03/11/04    ?       ?    menu rimuovi rercenti;
2.4.5.712    02/11/04    ?       ?    corretto vecchio bug per annulla_undo;
2.4.5.711    01/11/04    ?       ?    aggiunto dafault_path per editor.ini;
2.4.0.710 U  29/10/04    ?       ?    ultimi ritocchi;
2.4.0.709    28/10/04    ?       ?    corretto Dos/SysUtils per multi_teminale;
2.4.0.708    27/10/04    ?       ?    aggiornamento per win32;
2.4.0.707    26/10/04    ?     1080   corregione bug minori;
2.4.0.706    25/10/04    ?       ?    integrazione di caratteristiche secondarie della versione 3;
2.4.0.705    06/10/04    ?       ?    menuX/Y totalmente integrati;
2.4.0.704    05/10/04    ?       ?    ottimizzazione menuX/Y;
2.4.0.703    04/10/04    ?       ?    inizio movimento codice verso t_edit24;
2.4.0.702    03/10/04    ?       ?    inizio ripulitura;
2.4.0.701    02/10/04    ?       ?    fine correzioni di tipi incompatibili;
2.4.0.700    01/10/04    ?       ?    inizio correzioni di tipi incompatibili;
2.4.0.699    30/09/04    ?       ?    inizio multifile da terminale;
2.4.0.698    29/09/04    ?       ?    aggiunti al menu ALT+V , ALT+R;
2.4.0.697    28/09/04    ?       ?    inizio menu_recenti;
2.4.0.696    26/09/04    ?       ?    continuo menu visualizza;
2.4.0.695    24/09/04    ?       ?    inizio menu visualizza;
2.4.0.694    23/09/04    ?       ?    aggiornate librerie menu_x_v e menu_y_v;
2.4.0.693    22/09/04    ?       ?    menu integrato;
2.4.0.692    20/09/04    ?       ?    inizio menu recenti/visualizza;
2.4.0.691    19/09/04    ?       ?    menu chiudi/salva_tutti trasparente;
2.4.0.690    18/09/04    ?       ?    chiudi_tutti per multi_file;
2.4.0.689    16/09/04    ?       ?    perfezionamento di incolla per multi_file;
2.4.0.688    15/09/04    ?       ?    continuo di incolla per multi_file;
2.4.0.687    14/09/04    ?       ?    inizio di incolla per multi_file;
2.4.0.686    13/09/04    ?       ?    ottimizzazioni refresh per F5/F6;
2.4.0.685    12/09/04    ?       ?    correzione di esci per multi_file;
2.4.0.684    11/09/04    ?       ?    correzione di nuovo per multi_file;
2.4.0.683    10/09/04    ?       ?    continuo stesura di esci per multi_file;
2.4.0.682    09/09/04    ?       ?    prima stesura di esci per multi_file;
2.4.0.681    08/09/04    ?       ?    prima stesura di chiudi per multi_file;
2.4.0.680    07/09/04    ?       ?    prima stesura di salva_con_nome per multi_file;
2.4.0.679    06/09/04    ?       ?    messaggio di scrittura su disco protetto mancante, ora aggiunto;
2.4.0.678    05/09/04    ?       ?    prima stesura di apri per multi_file;
2.4.0.677    01/09/04    ?       ?    aggiunto ALT+F4;
2.4.0.676    31/08/04    ?       ?    inizio multifile;
2.3.0.675 U  23/08/04    ?       ?    fine taglia/elimina undo esadecimali;
2.3.0.674    22/08/04    ?       ?    continuo taglia/elimina undo esadecimali;
2.3.0.673    21/08/04    ?       ?    inizio taglia/elimina undo esadecimali;
2.3.0.672    18/08/04  5026      ?    fine copia/incolla appunti esadecimali;
2.3.0.671    10/08/04    ?       ?    inizio fase di test;
2.3.0.670    09/08/04    ?       ?    continuo appunti Esadecimali;
2.3.0.669    08/08/04    ?     1037   FPC 1.9.4, inizio appunti Esadecimali;
..... con FPC 1.9.4 ........ Ram/Fisica (Kb) ............
2.2.5.668 U  06/08/04  4973    ? /940 81±aggiunto ctrl+ins per WIN32;
2.2.5.667    05/08/04    ?     ? / ?  fine shift su con selezione quadrata;
2.2.5.666    04/08/04    ?     ? / ?  inizio shift su con selezione quadrata;
2.2.5.665    03/08/04    ?     ? / ?  shift giu corretto con selezione quadrata;
2.2.5.664    01/08/04    ?     ? / ?  indicato il tipo di annulla nel menu;
2.2.5.663    31/07/04    ?     ? / ?  inizio incolla dentro selezione;
2.2.5.662    25/07/04    ?     ? / ?  selezione quadrata esa per Win32;
2.2.5.661    24/07/04    ?     ? / ?  risoluzione di bug per selezione quadrata;
2.2.5.660    20/07/04    ?     ? / ?  continuo selezione quadrata per Win32;
2.2.5.659    19/07/04    ?     ? / ?  inizio selezione quadrata per Win32;
2.2.5.658    16/07/04  6387    ? / ?  ottimizzato Back_space con taglia quadrata;
2.2.5.657    13/07/04    ?     ? / ?  ottimizzato CancX con taglia quadrata;
2.2.5.656    11/07/04    ?     ? / ?  fine undo taglia quadrata;
2.2.5.655    09/07/04    ?     ? / ?  continuo undo taglia quadrata;
2.2.5.654    08/07/04    ?     ? / ?  inizio undo taglia quadrata;
2.2.5.653    07/07/04    ?     ? / ?  continuo copia quadrata;
2.2.5.652    06/07/04    ?     ? / ?  copia quadrata;
2.2.5.651    05/07/04    ?     ? / ?  fine selezione quadrata per DOS;
2.2.5.650    04/07/04    ?     ? / ?  continuo selezione quadrata;
2.2.5.649    03/07/04    ?     ? / ?  inizio selezione quadrata;
2.2.5.648    01/07/04    ?     ? / ?  continuo inizio configura2;
2.2.5.647    30/06/04    ?     ? / ?  inizio configura2;
2.2.5.646    28/06/04  6287    ? / ?  aggiunte informazioni in trova;
2.2.5.645    27/06/04  6287    ? / ?  80±fine ricerca verso sopra dentro selezione;
2.2.5.644    23/06/04  6451    ? / ?  ricerca verso sopra dentro selezione;
2.2.5.643    22/06/04  6451    ? /910 ricerca verso il basso dentro selezione;
2.2.5.642    21/06/04  6392    ? / ?  cursore X non ritorna ad 1 se U/D su righe + corte;
2.2.5.641    20/06/04  6264    ? / ?  fine Alt+F5;
2.2.5.640    19/06/04  6264    ? / ?  inizio Alt+F5;
2.2.5.639    18/06/04  6264    ? / ?  79±Home & End, in .ini;
2.2.0.638 U  25/04/04  6305    ? / ?  78±ricompilato per Win32;
2.2.0.637    14/04/04  6719    ? / ?  fine apri con supporto tasto Tab;
2.2.0.636    09/04/04  6719    ? / ?  continuo apri con supporto tasto Tab;
2.2.0.635    08/04/04  6719    ? / ?  inizio apri con supporto tasto Tab;
2.2.0.634    07/04/04  6719    ? / ?  salva con supporto tasto Tab;
2.2.0.633    06/04/04  6719    ? / ?  Tab con Canc e back_space;
2.2.0.632    31/03/04  6719    ? / ?  tab modificabile in .ini;
2.2.0.631    29/03/04  6719    ? / ?  continuo supporto mouse per mancini;
2.2.0.630    27/03/04  6719    ? / ?  inizio supporto mouse per mancini;
2.2.0.629    24/03/04  6719    ? / ?  click sulla barra verticale come pag_giu/su in .ini;
2.2.0.628    19/03/04  6719    ? / ?  stampante configurabile in .ini e da terminale;
2.2.0.627    14/03/04  6719    ? / ?  fine marcatore di fine riga, opzioni /D0 /D1 /D2
2.2.0.626    10/03/04  6719    ? / ?  inizio delimitatore di fine riga;
2.2.0.625    08/03/04  6719    ? / ?  note_editor in t_edit_2;
2.2.0.624    07/03/04  6719    ? / ?  tolto bug salva_con_nome e copia_file_con_nome;
2.2.0.623    23/02/04  6719    ? / ?  aggiunte informazioni iniziali;
2.2.0.622    22/02/04  6719    ? / ?  con menu multi stampante;
2.2.0.621    13/02/04  6719    ? / ?  Vai adattato per la multirisoluzione;
2.2.0.620    12/02/04  6719    ? / ?  SfogliaFile con multirisoluzione;
2.2.0.619    06/02/04  6719    ? / ?  fine oggetto per doppio click;
2.2.0.618    03/02/04  6719    ? / ?  continuo oggetto per doppio click;
2.2.0.617    02/02/04  6719    ? / ?  inizio oggetto per doppio click;
2.2.0.616    01/02/04  6719    ? / ?  77±verso T_Edit32;
2.2.0.615    30/01/04    ?     ? / ?  fine multirisoluzione per Go32v2;
2.2.0.614    28/01/04    ?     ? / ?  fine RunShell con opzioni;
2.2.0.613    26/01/04    ?     ? / ?  CommandShell: RunShell con opzioni;
2.2.0.612    25/01/04    ?     ? / ?  continuo multirisoluzione;
2.2.0.611    22/01/04    ?     ? / ?  inizio multirisoluzione;
2.2.0.610    19/01/04  6958    ? / ?  opzioni --> informazioni sul file;
2.2.0.609    15/01/04  6958    ? / ?  fine dei nuovi formati;
2.2.0.608    11/01/04  6958    ? / ?  apertura Big/Little Endian e UTF-8;
2.2.0.607    08/01/04  6873    ? / ?  scrittura Big/Little Endian e UTF-8;
2.2.0.606    07/01/04  6873    ? / ?  76±stampa spostata in T_edit32 e menu_file/stampa agevolato con cursori dx/sx;
2.1.0.605 U  05/01/04  6961    ? / ?  corretti bug nella tastiera versione win32;
2.1.0.604    04/01/04  6961    ? / ?  fine selezione ESA versione win32;
2.1.0.603????01/01/04  6961    ? / ?  inizio selezione ESA versione win32;
2.1.0.602    31/12/03  6961    ? / ?  aggiornamento versione win32;
2.1.0.601    30/12/03  6961    ? / ?  corretto bug crash con UndoSelezione;
2.1.0.600    27/12/03  6961    ? / ?  inizio Tab ovunque con Si,No,readstring2;
2.1.0.599    26/12/03  6961    ? / ?  75± bug lettura da CD per /Esa corretto;
2.1.0.598    24/12/03  6993    ? / ?  fine di rinomina;
2.1.0.597    07/12/03    ?     ? / ?  inizio di file -> rinomina;
2.1.0.596    04/12/03    ?     ? / ?  salva con nome: divisione con zero risolta
2.1.0.595    28/11/03    ?     ? / ?  con file -> salva copia;
2.1.0.594    25/11/03    ?     ? / ?  con file -> elemina;
2.1.0.593     ?/10/03    ?     ? / ?  tendenza per multipiattaforma con: TxtCrt e TxtVideo
2.1.0.592    26/09/03  6880    ? / ?  scrivo dentro selezione in ESA;
2.1.0.591    24/09/03  6880    ? / ?  selezione con mouse per Dos in ESA
2.1.0.590    18/09/03  6879    ? / ?  conversione da TXT ad ESA non fissa a 79 caratteri;
2.1.0.589    16/09/03  6872    ? / ?  abilita/disabilita mouse;
2.1.0.588    15/09/03  6843    ? / ?  stampa reintegrata;
2.1.0.587    13/09/03  6793    ? / ?  stampa reintegrata, ma da sistemare;
2.1.0.586    11/09/03  6761    ? / ?  riapri e ricarica, anche per file modificati;
2.1.0.585    10/09/03  6728    ? / ?  scrittura in esadecimale oltre la fine del file;
2.1.0.584    09/09/03  6728    ? / ?  conversione file senza nome in ESA e salvataggio file non esistente (nuovo) in ESA;
2.1.0.583    07/09/03  6712    ? / ?  inizio integrazione ...;
2.1.0.582    06/09/03  6702    ? / ?  continuo multifile: rimozione memoria;
2.1.0.581    19/08/03  6620    ? / ?  inizio multifile: salvataggio memoria;
2.0.0.580 U  31/07/03  6584    ? / ?  sistemazione per Win32 finita;
2.0.0.579    30/07/03  6584    ? / ?  salvataggio da sistemare per Win32;
2.0.0.578    28/07/03  6584    ? / ?  ottimizzazione di caricamento per Win32;
2.0.0.577    27/07/03  6580    ? / ?  inizio pausa nella ricerca per Win32;
2.0.0.576    25/07/03    ?     ? / ?  continuo selezione testo per Win32;
2.0.0.575    22/07/03    ?     ? / ?  sostituzione con selezione testo per Win32;
2.0.0.574    21/07/03  6568    ? /800 ricerca con selezione testo per Win32;
2.0.0.573    20/07/03  6568    ? /800 ctrl+shift+dx/sx non funziona;
2.0.0.572    19/07/03  6568    ? / ?  continuo selezione win32;
2.0.0.571    18/07/03    ?     ? / ?  inizio selezione win32;
2.0.0.570    16/07/03    ?     ? / ?  sistemazione per txtvideo;
2.0.0.569    15/07/03    ?     ? / ?  continuo versione per win32;
2.0.0.568    14/07/03    ?     ? / ?  bug undo con /cl /sf risolto;
2.0.0.567    02/06/03    ?     ? / ?  bug per riapertura ESA risolto;
2.0.0.566    27/05/03    ?     ? / ?  bug per F10 nel menuX risolto;
2.0.0.565    03/05/03    ?     ? / ?  conflitto readkey,keyboard risolto;
2.0.0.564    19/04/03    ?     ? / ?  menu con click, tutto integrato;
2.0.0.563    18/04/03    ?     ? / ?  doppio click per selezione testo;
2.0.0.562    13/04/03    ?     ? / ?  salva_con_nome /ESA anche se modificato;
2.0.0.561    11/04/03    ?     ? / ?  riprova file_non_trovato all'avvio;
2.0.0.560    01/04/03    ?     ? / ?  disabilito SPECIALE in /esa;
2.0.0.559    30/03/03    ?     ? / ?  creo .bak per salvataggio in esadecimale;
2.0.0.558    28/03/03    ?     ? / ?  ricerca esadecimale con riprova per errori di I/O;
2.0.0.557    27/03/03    ?     ? / ?  inizio pausa con riprova per errori in ESA;
2.0.0.556    23/03/03    ?     ? / ?  fine pausa per salva con nome in ESA;
2.0.0.555    22/03/03    ?     ? / ?  inizio pausa per salva con nome in ESA;
2.0.0.554    10/03/03    ?     ? / ?  inizio salva con nome in ESA;
2.0.0.553    09/03/03    ?     ? / ?  fine di ricerca con pausa;
2.0.0.552    08/03/03    ?     ? / ?  continuo ricerca con pausa;
2.0.0.551    07/03/03    ?     ? / ?  inizio ricerca con pausa;
2.0.0.550    04/03/03    ?     ? / ?  con file_ --> riapri...;
2.0.0.549    01/03/03    ?     ? / ?  con file_ --> ricarica;
2.0.0.548    28/02/03    ?     ? / ?  righe per menu_Y deselezionabili;
2.0.0.547    26/02/03    ?     ? / ?  funzione Grafica aggiornata;
2.0.0.546    25/02/03    ?     ? / ?  menu Speciale finito;
2.0.0.545    23/02/03  6415    ? / ?  aggiunta del menu Speciale;
2.0.0.544    20/02/03  6328    ? / ?  aggiunta dei tasti ALT+F/M/C/G/O;
2.0.0.543    18/02/03  6299    ? / ?  continuo del menuY;
2.0.0.542    14/02/03  6281    ? / ?  inizio del menuY;
2.0.0.541    13/02/03  6235    ? / ?  con libreria keyboard;
1.9.0.540 N  12/02/03  6235    ? / ?  inizio nuovo menu;
1.9.0.539    11/02/03  6160    ? / ?  correzione bug della versione precedente;
1.9.0.538    10/02/03  6160    ? / ?  ripristino della selezione dopo annulla;
1.9.0.537    09/02/03  6160    ? / ?  inizio ripristino della selezione dopo annulla
1.8.5.536 U  06/02/03    ?     ? / ?  deselezione shift+ctrl+inizio/fine e shift+inizio/fine;
1.8.5.535    05/02/03  5932    ? / ?  incolla_attuale a capo sistemato;
1.8.5.534    04/02/03  5929    ? / ?  ctrl_shift_sinistra annulla selezione;
1.8.5.533    02/02/03  5923    ? / ?  shift_sinistra annulla selezione;
1.8.5.532    31/01/03  5916    ? / ?  shift_destra annulla selezione;
1.8.5.531    30/01/03  5915    ? / ?  continuo di shift_giu/su annulla/contimua selezione;
1.8.5.530    28/01/03  5915    ? / ?  continuo di shift_giu annulla selezione;
1.8.5.529    27/01/03    ?     ? / ?  shift_giu annulla selezione;
1.8.5.528    25/01/03    ?     ? / ?  shift_su annulla selezione;
1.8.5.527    20/01/03    ?     ? / ?  revisione di taglia_righe;
1.8.5.526    19/01/03    ?     ? / ?  revisione di taglia_attuale;
1.8.5.525    18/01/03    ?     ? / ?  revisione di canc/back_space;
1.8.5.524    13/01/03  5912    ? / ?  continuo revisione di canc;
1.8.5.523    12/01/03  5847    ? / ?  revisione di canc;
1.8.5.522    11/01/03  5823    ? / ?  inizio selezione avanzata per invio;
1.8.5.521    10/01/03  5791    ? / ?  continuo: ultimi bug di canc;
1.8.5.520    09/01/03  5789    ? / ?  continuo sistemazione di canc;
1.8.5.519    08/01/03  5770    ? / ?  inizio sistemazione selezione del canc;
1.8.5.518    07/01/03  5755    ? / ?  back_space con selezione ottimizzato;
1.8.5.517    06/01/03  5740    ? / ?  ricerca con percntuale;
1.8.5.516????05/01/03  5726    ? / ?  opzione /I;
1.8.5.515    01/12/02    ?     ? / ?  selezione corretta per shift+?;
1.8.5.514    27/11/02    ?     ? / ?  la selezione scompare dove necessario;
1.8.5.513    25/11/02    ?     ? / ?  continuo selezione ottimizzata;
1.8.5.512    22/11/02    ?     ? / ?  ClickDelay per editor.ini;
1.8.5.511    18/11/02  5580    ? / ?  lunghezza righa massima impostabile anche col formato testo;
1.8.5.510    16/11/02  5580    ? / ?  F1/F2 anche nel formato testo;
1.8.5.509    14/11/02  5580    ? / ?  migliorati shift giu/su + selezione con mouse;
1.8.5.508    11/11/02  5580    ? / ?  bug: refresh cerca corretto;
...................pausa........................ per fare altri programmi
1.8.4.507    30/08/02  5577    ? / ?  fine versione Win32 velocizzata;
1.8.4.506    29/08/02  5577    ? / ?  SNA e SN per Win32;
1.8.4.505    27/08/02  5577    ? / ?  se .bak, ignorato il backup;
1.8.4.504    26/08/02  5577    ? / ?  fine di sfogliafile per win32;
1.8.4.503    19/08/02  5577    ? / ?  continuo di sfogliafile per win32;
1.8.4.502    18/08/02  5577    ? / ?  velocizzazione di sfogliafile per win32;
1.8.4.501    16/08/02  5577    ? / ?  menu completo per Win32;
1.8.4.500    15/08/02  5577    ? / ?  ottimizzazioni varie;
1.8.4.499    13/08/02  5577    ? / ?  continuo del menu: colori;
1.8.4.498    12/08/02  5577    ? / ?  continuo del menu;
1.8.4.497    07/08/02  5577    ? / ?  continuo con menu senza freccine esterne;
1.8.4.496    06/08/02  5577    ? / ?  continuo con ord32_255;
1.8.4.495    05/08/02    ?     ? / ?  continuo del testo;
1.8.4.494    04/08/02    ?     ? / ?  continuo del menu;
1.8.4.493    02/08/02    ?     ? / ?  continuo;
1.8.4.492    01/08/02    ?     ? / ?  inizio velocizzazione per Win32;
1.8.4.491    11/07/02  5494    ? /700 opzioni lanciabili dal prompt anche nel .ini;
1.8.4.490    28/06/02  5428    ? /700 74±fine di cerca/sostituisci con TAB;
1.8.4.489    27/06/02  5797    ? / ?  ottimizzazioni varie del menu_cerca;
1.8.4.488    26/06/02  5779    ? / ?  ottimizzazioni varie;
1.8.4.487    25/06/02    ?     ? / ?  cerca/sostituisci con TAB: invio da fare;
1.8.4.486    24/06/02  5761    ? / ?  continuo di cerca/sostituisci con TAB;
1.8.4.485    23/06/02  5715    ? / ?  cerca/sostituisci con TAB: spazio;
1.8.4.484    22/06/02  5695    ? / ?  inizio cerca/sostituisci con TAB;
1.8.4.483    20/06/02  5577    ? / ?  fine di VAI;
1.8.4.482    19/06/02  5495    ? / ?  continuo di VAI col tasto spazio;
1.8.4.481    18/06/02  5450    ? / ?  continuo di VAI con tab;
1.8.4.480    14/06/02  5378    ? / ?  inizio sistemazione VAI: con TAB;
1.8.4.479    13/06/02  5342    ? / ?  73±fine TIPO_;
1.8.4.478    12/06/02  5804    ? / ?  inizio pressione spazio per TIPO;
1.8.4.477    09/06/02  5795    ? / ?  tolto bug per lastmode;
1.8.4.476    08/06/02  5790    ? / ?  continuo di TIPO;
1.8.4.475    07/06/02  5758    ? / ?  TIPO con macro e tolti bug;
1.8.4.474    06/06/02  5707    ? / ?  continuo di TIPO con gli stati;
1.8.4.473    05/06/02    ?     ? / ?  sistemazione TIPO: con tab;
1.8.4.472    04/06/02    ?     ? / ?  modifica apertura_bin/txt;
1.8.4.471    02/06/02  5537    ? / ?  messaggio conto alla rovescia ottimizzato;
1.8.4.470    01/06/02  5510    ? / ?  inizio AutoDetect per editor.ini
1.8.3.469    30/05/02  5505    ? / ?  NFL ovunque;
1.8.3.468    29/05/02  5505    ? / ?  NFL corretti nella versione per Win32;
1.8.3.467    27/05/02  5505    ? / ?  ottimizzazione versione Win32 con NFL corretti;
1.8.3.466    26/05/02  5505    ? /660 posione Y del menu fissa completata; macro ON;
1.8.3.465    25/05/02    ?     ? / ?  fine del menu fisso;
1.8.3.464    24/05/02    ?     ? / ?  con inizio_fine del menu fisso;
1.8.3.463    23/05/02    ?     ? / ?  continuo y del menu fisso;
1.8.3.462    20/05/02  6293    ? / ?  inizio y del menu fisso;
1.8.3.461    19/05/02  6252    ? / ?  fine di F1_F2;
1.8.3.460    18/05/02  6252    ? / ?  inizio di F1_F2;
1.8.3.459    16/05/02  6223    ? / ?  fine SaveShell;
1.8.3.458    15/05/02  6199    ? / ?  continuo SaveShell;
1.8.3.457    13/05/02  6180    ? / ?  inizio SaveShell;
1.8.3.456    12/05/02  6180    ? / ?  /ASK al prompt ottimizzato;
1.8.3.455    10/05/02  6176    ? / ?  ottimizzazione di RunEdit;
1.8.3.454    08/05/02  6158    ? / ?  RunShell,RunEdit;
1.8.3.453    04/05/02  6132    ? / ?  codice verso t_edit32;
1.8.3.452    06/05/02    ?     ? / ?  risolto problema di nomi troppo lunghi: nomeLungo;
1.8.3.451    05/05/02    ?     ? / ?  fine /ASK;
1.8.3.450    01/05/02    ?     ? / ?  continuo /ASK;
1.8.3.449    16/04/02    ?     ? / ?  72±tolto bug annulla esadecimale, per il carattere zero;
1.8.3.448    10/04/02  6730    ? / ?  continuo modifica di TIPO: parte ALT+???;
1.8.3.447    09/04/02    ?     ? / ?  continuo modifica di TIPO: parte readstring;
1.8.3.446    01/04/02  6690    ? / ?  continuo modifica di TIPO;
1.8.3.445    31/03/02  6630    ? / ?  modifica di TIPO;
1.8.3.444    29/03/02  6589    ? /634 ASK per editor.ini;
1.8.3.443    28/03/02  6565    ? /634 ALT+N per sfoglia_file;
1.8.3.442    27/03/02  6565    ? / ?  giu / pag_giu alla fine senza refresh inutile;
1.8.3.441    26/03/02  6560    ? / ?  ALT+L per sfoglia_file;
1.8.2.440    01/03/02  6555    ? / ?  corretti bugs di editor.ini ;
1.8.2.439    28/02/02  6549    ? / ?  tolto bug salva_con_nome, Esc editor.ini per opzioni errate, variabli di ambiente per apri/salva
1.8.2.438    19/02/02  6545    ? / ?  no velocit… win32: compatibile con WinNT;
1.8.1.437    16/02/02  6534    ? / ?  opzioni /-esa /-txt;
1.8.1.436    15/02/02  6534    ? / ?  rimozione di due bug nel refresh video;
1.8.1.435    14/02/02  6531    ? / ?  ottimizzazioni varie;
1.8.1.434    13/02/02  6524    ? / ?  sistemazione colori nel men— per carateri evidenziati;
1.8.1.433    11/02/02    ?     ? / ?  continuo correzione bug;
1.8.1.432    09/02/02    ?     ? / ?  inizio correzione bug;
1.8.1.431    07/02/02    ?     ? / ?  riscontrati bug con annulla back_space;
1.8.1.430    06/02/02  6440    ? / ?  pi— velocit… con sostituisci per Windows;
1.8.1.429    05/02/02    ?     ? / ?  tasto alt valido con readstring per Windows;
1.8.1.428    03/02/02  6437    ? / ?  gestione esadecimale per Windows;
1.8.1.427    02/02/02  6433    ? / ?  gestione cerca / sostituisci per Windows;
1.8.1.426    31/01/02  6374    ? / ?  pi— velocit… con BackSpace per Windows;
1.8.1.425    28/01/02  6339    ? / ?  aggiunte impostazioni per Editor.ini
1.8.1.424    27/01/02  6331    ? / ?  continuo versione per Win32
1.8.1.423    16/01/02  6312    ? / ?  inizio versione per Win32
........ inizio versione per Windows a 32 bit ............
1.8.1.422    03/01/02  6312    ? / ?  tolti bug con invio veloce
1.8.1.421????01/01/02  6312    ? / ?  tolti bug out_of_range per velocit…;
1.8.1.420    23/12/01  6278    ? / ?  con opzioni /DM , /-DM;
1.8.0.419    20/12/01  6276    ? / ?  ottimizzazioni varie;
1.8.0.418    17/12/01  6266    ? / ?  tolti bug di annulla taglia_righe;
1.8.0.417    16/12/01    ?     ? / ?  fine multi input;
1.8.0.416    15/12/01  6232    ? /603 inizio multi input;
1.8.0.415    14/12/01  6172    ? / ?  71±{8280} men— modifica finito: codice spostato verso t_edit32;
1.8.0.414    13/12/01  6414    ? / ?  modifica velocit…: parte della tastiera finita;
1.8.0.413    12/12/01  6349    ? / ?  continuo modifica velocit…: graficamente migliore;
1.8.0.412    11/12/01  6278    ? / ?  continuo modifica velocit…;
1.8.0.411    10/12/01  6243    ? / ?  inizio modifica velocit…;
1.8.0.410    09/12/01  6182    ? / ?  fine modifica memoria;
1.8.0.409    02/12/01  6151    ? / ?  fine emulazione menu modifica;
1.8.0.408    01/12/01  6149    ? / ?  continuo supporto menu modifica;
1.8.0.407    29/11/01  6144    ? / ?  inizio supporto menu modifica;
1.8.0.406    25/11/01  6102    ? / ?  sistemazione undo_mouse;
1.8.0.405    22/11/01  6065    ? / ?  fine Undo di BackSpace UnoS;
1.8.0.404    20/11/01  6065    ? / ?  70± fine Undo_CancUnoS;
1.8.0.403    18/11/01    ?     ? / ?  bug mouse scomparso risolto e continuo Undo_CancUnoS;
1.8.0.402    11/11/01  6100    ? / ?  continuo Undo_CancUnoS;
1.8.0.401    04/11/01  6093    ? / ?  inizio Undo_CancUnoS;
1.8.0.400    02/11/01  6062    ? / ?  69± fine annulla sostituisci con emulazione CancX/Tastiera;
1.8.0.399    28/10/01  6138    ? / ?  continuo annulla sostituisci (giu/su) con modifica ymax;
1.8.0.398    27/10/01  6123    ? / ?  continuo annulla sostituisci (giu/su);
1.8.0.397    14/10/01  6108    ? / ?  continuo annulla sostituisci;
1.8.0.396    13/10/01  6089    ? / ?  sistemazione cercamami_su;
1.8.0.395    12/10/01  6088    ? / ?  inizio annulla sostituisci;
1.8.0.394    11/10/01  6063    ? / ?  ripristina modifica;
1.8.0.393    10/10/01  6047    ? / ?  continuo riposizionamento cursore;
1.8.0.392    09/10/01  6028    ? / ?  inizio riposizionamento cursore;
1.8.0.391    08/10/01  5970    ? / ?  Undo_MuoviAllinea;
1.8.0.390    07/10/01  5935    ? / ?  Undo_MuoviCentra;
1.8.0.389    06/10/01  5896    ? / ?  fine Undo_MuoviDestra;
1.8.0.388    05/10/01  5875    ? / ?  inizio Undo_MuoviDestra;
1.8.0.387    04/10/01  5837    ? / ?  inizio Undo_MuoviSinistra;
1.8.0.386    03/10/01  5800    ? / ?  ottimizzazioni selezione con mouse;
1.8.0.385    02/10/01  5788    ? / ?  ottimizzazioni varie;
1.8.0.384    01/10/01  5788    ? / ?  Undo_MouseCL;
1.8.0.383    27/09/01  5753    ? / ?  Undo_UnoS;
1.8.0.382    26/09/01  5727    ? /546 Undo_CL;
1.8.0.381    25/09/01  5626    ? / ?  Undo per esadecimale;
1.8.0.380    24/09/01  5623    ? / ?  Undo_Insert;
1.8.0.379    23/09/01  5578    ? / ?  68±fine Undo_BS, ottimizzazioni con FPC;
1.8.0.378    22/09/01  5609    ? / ?  fine Undo_CancX, inizio Undo_BS;
1.8.0.377    21/09/01  5563    ? / ?  inizio Undo_CancX;
1.8.0.376    20/09/01  5500    ? / ?  Undo_Invio;
1.8.0.375    19/09/01  5466    ? / ?  ottimizzazione del codice della pressione tasti;
1.8.0.374    18/09/01  5454    ? / ?  continuo annulla pressione tasti con ins:=falso;
1.8.0.373    17/09/01  5411    ? / ?  ottimizzazioni varie;
1.8.0.372    16/09/01  5411    ? / ?  gestione fine continuo pressione tasti per annulla
1.8.0.371    15/09/01  5401    ? / ?  continuo undotastiera;
1.8.0.370    14/09/01  5370    ? / ?  inizio undo per tastiera;
1.8.0.369    13/09/01  5361    ? / ?  correzione bug generici +- 1 riga: taglia_righe;
1.8.0.368    11/09/01  5361    ? / ?  continuo UndoI_Righe;
1.8.0.367    10/09/01  5353    ? / ?  inizio UndoI_Righe;
1.8.0.366    09/09/01  5335    ? / ?  fine annulla incolla di una riga;
1.8.0.365    08/09/01    ?     ? / ?  continuo;
1.8.0.364    07/09/01    ?     ? / ?  AnnullaUndo di Incolla: continuo;
1.8.0.363    06/09/01  5288    ? / ?  AnnullaUndo di Incolla: solo per una riga (inizio);
1.8.0.362    05/09/01  5275    ? /546 AnnullaUndo di Taglia/Elimina tutto completato;
1.8.0.361    04/09/01  5261    ? / ?  AnnullaUndo di Taglia/Elimina Selezione su righe diverse;
1.8.0.360    03/09/01  5220    ? / ?  inizio di AnnullaUndo;
1.8.0.359    01/09/01    ?     ? / ?  aggiunta di Ctrl+Canc/Ins, pure nella versione 1.61;
1.8.0.358    31/08/01  5168    ? / ?  fine annulla di Taglia/Elimina/Incolla;
1.8.0.357    30/08/01  5121    ? / ?  associazione di estensioni lunghe; inizio annulla di Taglia;
1.8.0.356    29/08/01  5063    ? / ?  inizio annulla;
1.8.0.355    28/08/01    ?     ? / ?  incolla velocizzato (ver 1.60);
1.8.0.354    27/08/01    ?     ? / ?  controllo memoria appunti dinamici (taglia) per annulla;
1.8.0.353    25/08/01  5061    ? / ?  controllo memoria appunti dinamici (copia) per annulla;
1.6.0.352    23/08/01  5037    ? /535 67±fine appunti dinamici: DinMemFree;
1.6.0.351    22/08/01  5131    ? / ?  66±inizio con appunti dinamici;
1.5.5.350    19/08/01  5171    ? / ?  fine associazione estensioni dinamiche;
1.5.5.349    18/08/01    ?     ? / ?  contiuo associazione estensioni dinamiche;
1.5.5.348    16/08/01  5165    ? / ?  inizio associazione estensioni dinamiche;
1.5.0.347    26/07/01  5158    ? / ?  65±non posso pi— superare il MaxR;
1.5.0.346    15/06/01  5178    ? / ?  opzione salva spazi finali;
1.5.0.345    14/06/01  5178    ? / ?  da ridefinire INFO -> TIPO;
1.5.0.344    13/06/01  5175    ? / ?  continuo definisci_tipo in apertura;
1.5.0.343    10/06/01  5166    ? / ?  64±menu formato file finito;
1.5.0.342    07/06/01  5185    ? / ?  continuo menu formato, menu tipo modificato;
1.5.0.341    03/06/01  5136    ? / ?  inizio menu formato, menu tipo modificato;
1.5.0.340    02/06/01    ?     ? / ?  inizio editor.ini (estensioni_note);
............ fine versione a 16 bit ............
1.4.0.339    22/05/01  5067    ? / ?  tolti bugs in apertura dal prompt;
1.4.0.338    26/04/01  5036    ? / ?  crea file in ESA vuoto;
1.4.0.337    25/04/01  5026    ? / ?  fine nomi di files lunghi;
1.4.0.336    14/04/01  5026    ? / ?  inizio nomi di files lunghi;
1.4.0.335    13/04/01  5010    ? / ?  nomi di files corti imposti;
1.4.0.334    12/04/01  5007    ? / ?  tolto bugs in shift pag giu /su;
1.4.0.333    10/04/01    ?     ? / ?  tolto bugs in shift giu e cerca giu in binario;
1.4.0.332    08/04/01    ?     ? / ?  testo[0..2401], per evitare accesso fuori dal vettore
1.4.0.331    06/04/01  4986    ? /500 inizio versione a 32 bit;
............ inizio versione a 32 bit ..........
1.4.0.330    31/03/01  4986   259/132 fine cerca oltre il massimo in ASCII;
1.4.0.329    28/03/01  4962   259/132 inizio cerca oltre il massimo in ASCII;
1.3.3.328    18/03/01  4938   255/125 ottimizzazioni di I/O;
1.3.3.327    15/03/01  4938   254/124 apertura txt e bin ovunque OK;
1.3.3.326    14/03/01  4921   254/124 vai al byte;
1.302.325    11/03/01  4913   254/124 63±readstring ovunque;
1.302.324    09/03/01  5035   255/126 ±tolto cambio percorso dal menu file;
1.302.323    07/03/01  5140   257/128 ±inizio readstring;
1.301.322    05/03/01  5196   257/128 ±continuo con SFOGLIAF;
1.301.321    04/03/01  5224   255/126 ±inizio con SFOGLIAF;
1.266.321    24/02/01  5357   171/113 aumento area stack necessariamente;
1.26?.320????11/02/01  5357   167/113 ±ottimizzazioni varie e opzioni inverse;
1.26?.319    26/10/00  5374   163/110 ±ottimizzazioni varie;
1.26?.318    14/10/00  5402   163/110 indicatore in binario di seek al byte;
1.26?.317    13/10/00  5396   163/109 Nuovo pre_tasti SN;
1.26?.316    12/10/00  5486    ? / ?  Nuovo pre_tasti SNA;
...................pausa........................ per fare altri programmi
1.26?.315    23/07/00  5729   161/107 {8249} fine del binario avanzato;
1.26?.314    21/07/00  5719   161/107 {8239} ottimizzazioni del binario avanzato;
1.26?.313    20/07/00  5686   161/107 {8206} ottimizzazioni varie;
1.26?.312    19/07/00  5704   161/106 {8159} tavola ASCII;
1.26?.311    16/07/00  5694   159/104 {8009} fine Jolly;
1.251.310    14/07/00    ?    158/103 inizio Jolly;
1.251.309    11/07/00  5694   158/103 {7943}ottimizzazioni varie;
1.251.308    01/07/00  5721   157/102 cambio percorso anche all'avvio e caratteri jolly;
1.251.307    21/06/00  5703   157/102 fine Back_Space_UnoS che sposta parole;
1.251.306    20/06/00  5665   157/102 fine Canc_UnoS che sposta parole;
1.251.305    18/06/00  5633   156/101 ±ottimizzazione delle selezioni con tasti;
1.251.304    17/06/00  5698   156/101 elimina appunti con Shift+Tab;
1.251.303    16/06/00  5662   156/101 fine nuova selezione testo con mouse;
1.251.302    15/06/00    ?    156/101 inizio nuova selezione testo con mouse;
1.251.301    11/06/00  5662   154/99  opzioni anche unite nel prompt;
1.251.300    09/06/00  5657   154/99  fine di salto al blocco ennesimo;
1.251.299    08/06/00    ?    152/96  continuo vai;
1.251.298    06/06/00  5633   152/96  ± inizio vai...;
1.251.297    02/06/00  5686   152/96  salvataggio automatico file grandi;
1.25*.296    01/06/00  5654   152/96  fine file grandi;
1.241.295    31/05/00  5655   151/95  ±{7295} continuo apertura file grandi;
1.241.294    27/05/00  5698   151/95  apertura file binari grandi verso sopra;
1.241.293    26/05/00  5684   151/95  {7019}continuo apertura file binari grandi;
1.241.292    20/05/00  5644   150/94  inizio apertura file binari grandi;
1.24*.291       ?      5618   149/92  conteggio parole;
1.231.290    05/05/00  5563   149/92  {6843}modifica percorsi troppo lunghi;
1.23*.289    01/05/00  5635   149/92  {6819} uno spazio fra parole;
1.221.288    25/04/00  5575   147/90  ottimizzazioni varie;
1.221.287    24/04/00  5560   147/90  fine sostituzioni linee separate;
1.221.286    23/04/00  5558   147/90  {6707} continuo sostituzioni linee separate;
1.221.285    05/04/00  5674   146/89  {6616} fine di si,no,annulla;
1.221.284    02/04/00  5681   146/88  ottimizzazioni si,no,annulla;
1.221.283    26/03/00  5643   146/88  {6585} ottimizzazioni varie;
1.22*.282    19/03/00  5664   145/88  {6542} fine cerca parola intera;
1.212.281    18/03/00  5670   145/88  {6506} continuo cerca parola intera;
1.211.280    13/03/00  5670   145/88  inizio cerca parola intera;
1.21*.279    12/03/00  5743   145/88  {6469} fine salva spazi filali;
1.211.278    11/03/00    ?    145/87  inizio salva spazi filali;
1.20*.277    06/03/00  5743   145/87  fine cusore libero;
1.185.276    03/03/00  5714   144/86  inizio Spazio;
1.185.275    18/02/00  5672   144/86  ottimizzazioni varie;
1.184.274    12/02/00  5677   144/86  crea Backup;
1.184.273    06/02/00  5675   143/86  fine lunghezza binario;
1.167.272    05/02/00  5699   144/86  perfezionamento lunghezza binario;
1.167.271    04/02/00  5652   144/86  continuo lunghezza binario;
1.167.270    30/01/00  5643    ? /86  ottimizzazioni varie;
1.167.269    ? /01/00  5702   143/86  ottimizzazioni DosShell;
1.167.268    16/01/00  5733   202/84  Esc al posto ok/tasto, error 48: code segment to large;
1.167.267    15/01/00  5667   199/82  inizio lunghezza binario;
1.167.266????08/01/00  5600   199/81  sola lettura;
1.167.265    29/12/99  5555   199/82  ±fine adiacenza crescente con tasti;
1.167.264    26/12/99  5585   199/82  ottimizzazioni nella stampa;
1.167.263    25/12/99  5556   199/82  ±apri migliorato;
1.167.262    24/12/99  5570   199/82  inizio sistemazione Ctrl+Shift;
1.167.261    20/12/99  5521   198/81  ±apri con Salva e Salva_con_Nome;
1.167.260    19/12/99  5701   199/82  ±nuovo con Salva e salva_con_nome;
1.167.259    18/12/99  5797   200/83  ±ottimizzazioni con meno goto;
1.167.258    14/12/99  5807           continuo adiacenza_selezione;
1.167.257    12/12/99  5795           inizio adiacenza_selezione;
1.167.256    30/11/99  5731           con Scambio;
1.166.255    29/11/99  5675           con Ctrl_Shift_S/D;
1.164.254    28/11/99  5656           ±continuo meno Down;
1.164.253    22/11/99  5709           ±meno Down sostituiti da Evidenzia_Selezione;
1.164.252    21/11/99  5768           ±sistemazione Ctrl D/S;
1.164.251    15/11/99  5820           uscita pi— veloce;
1.164.250    14/11/99  5816           con inizio Evidenzia_Selezione;
1.164.249    12/11/99  5778           con Shift Destra/Sinistra;
1.162.248    08/11/99  5741   118/81  ±con Exist che emula reset;
1.162.247    07/11/99  5770           continuo degli Shift;
1.162.246    06/11/99  5755           con Ctrl_Shift_Ctrl_Pag_  Su / Giu;
1.160.245    05/11/99  5724           con Shift_Ctrl_Inizio;
1.159.245    03/11/99  5693           con Shift_Inizio;
1.158.244    02/11/99  5670           ±riduzione codice ridondante e Shift_Fine;
1.156.243    01/11/99  5787           init, init2;
1.154.242    31/10/99  5751           elimia completa + rossi_X +menu_x_selezionato;
1.152.241    29/10/99  5568           eliminaM;
1.151.240    25/10/99  5497           copia_selezione
1.150.239    24/10/99  5397           con taglia_selezione, no_selezione;
1.148.238    23/10/99  5315           espelli -> stampa_selezione;
1.148.237    22/10/99  5305           continuo di selezione;
1.148.236    21/10/99  5251           sistemazione di incolla e tast_vuota;
1.146.235    20/10/99  5236           perfezionamanto di selezione;
1.145.234    19/10/99  5212           continuo selezione;
1.145.233    18/10/99  5200           inizio selezione;
1.145.232    16/10/99  5183           con tutti i tasti ALT;
1.145.231    15/10/99  5107           fine Tipo: formato file;
1.145.230    14/10/99  5080           inizio Tipo;
1.144.229    09/10/99  5006           con rilascio del mouse;
1.143.228    03/10/99  5024           continuo tasti di scelta rapida;
1.143.227    02/10/99  5070           continuo menu evidenziato;
1.143.226    28/09/99  4888           inizio menu evidenziato;
1.143.225    27/09/99  4864           inizio barra verticale;
1.142.224    26/09/99  4787           ottimizzazioni al mouse;
1.142.223    25/09/99  4784           <OK> <ESC> nel menu file;
1.142.222    24/09/99  4761           sistemazione riga 25;
1.141.221    19/09/99  4758           continuo <OK> <ESC>;
1.141.220    18/09/99  4756           con cornicetta, pre_tasti, modif, da_a_graph;
1.137.219    16/09/99  4692           ±ottimizzazioni varie;
1.137.218    15/09/99  4755           fine sostituzione sopra;
1.137.217    14/09/99  4729           inizio sostituzione sopra;
1.137.216    13/09/99  4720           fine ricerca sopra;
1.137.215    12/09/99  4750           con unit T_EDIT e inizio ricerca sopra;
1.135.214    05/09/99  4873           incolla piu' veloce;
1.134.213    13/08/99  4845           fine sostituzione con richiesta;
1.133.212    12/08/99  4732           inizio sostituzione con richiesta;
1.133.211    09/08/99  4684           opzione /B;
1.132.210    08/08/99  4591           ±con Textmode;
1.132.209    05/08/99  4596           ±con Apertura;
1.132.208    22/07/99  4597   187/66  testo scorrevole ovunque;
1.132.207    18/07/99  4561           ottimizzazioni varie;
1.132.206    14/07/99  4544           testo scorrevole con taglia;
1.132.205    11/07/99  4489           testo scorrevole con invio;
1.132.204    10/07/99  4430           testo scorrevole con canc;
1.132.203    09/07/99  4411           testo scorrevole e senza maxYpag,mes14;
1.132.202    08/07/99  4402           continuo testo scorrevole e senza mes15;
1.132.201    07/07/99  4380           inizio testo scorrevole;
1.132.200    04/07/99  4356   186/65  con sostituisci ovunque;
1.131.199    02/07/99  4274   182/60  con directory per gli appunti; {fine tesina}
1.131.198    01/07/99  4225           con Ctrl PagSu/Giu Inizio/fine;
1.128.197    30/06/99  4184           con Ctrl Des/Sin;
1.126.196    29/06/99  4092           con apertura a capo;
1.126.195    28/06/99  4082           testo con costante;
1.126.194    26/06/99  4075           ±ottimizzazioni varie;
1.126.193    24/06/99  4121           ±con Exit e gestione nomi riservati al S.O.;
1.126.192    23/06/99  4140           sistemazione di esci;
1.125.191    22/06/99  4139           sistemazione di salva con nome;
1.124.190    21/06/99  4124           sistemazione di nuovo;
1.121.189    20/06/99  4116           sistemazione di muovi;
1.121.188    19/06/99  4087           ±riduzione codice con proc.;
1.118.187    18/06/99  4189   179/59  sostituzione;
1.114.186    17/06/99  4125           sistemazione incolla_attuale;
1.114.185    16/06/99  4120           sistemazione cerca riga_pagina;
1.108.184    15/06/99  4000           inizio procedure globali;
1.103.183    14/06/99  3888           testo come variabile globale;
1.103.182    13/06/99  3789           globalizzazione di modifica;
1.103.181    10/06/99  3771   117/56  ottimizzazioni varie per la tesina;
1.103.180    09/06/99  3697           ottimizzazioni varie;
1.103.179    06/06/99  3679           ottimizzazioni visive;
1.103.178    02/06/99  3670           ±migliore canc;
1.103.177    01/06/99  3677           ±migliore back-space;
1.103.176    30/05/99  3691           ottimizzazioni varie;
1.103.175    29/05/99  3688           ±miglior uso delle variabili globali;
1.103.174    28/05/99  3693           ±gestione Tempo con una sola procedura;
1.103.173    27/05/99  3722           fine stampa con Invio e Esc col Mouse;
1.103.172    26/05/99  3713           stampa con Invio e Esc col Mouse;
1.103.171    25/05/99  3662           ±ottimizzazioni in stampa righe DA_A;
1.103.170    24/05/99  3670           ±ottimizzazioni in cerca;
1.103.169    23/05/99  3715           perfezionamenti;
1.103.168    22/05/99  3712           ±ottimizzazioni varie;
1.103.167    21/05/99  3713           ±pi— velocit… in scrittura sul monitor;
1.103.166    20/05/99  3731           INS ovunque;
1.103.165    19/05/99  3657           perfezionamento di Allinea;
1.103.164    18/05/99  3649           continuo di Allinea;
1.103.163    17/05/99  3639           inizio di Allinea;
1.103.162    16/05/99  3599           ±ottimizzazioni varie;
1.103.161    09/05/99  3620           sposto mouse se necessario in file:esci;
1.103.160    30/04/99  3608           Si,No,Annulla completi;
1.103.159    29/04/99  3599           Si,No col mouse;
1.103.158    27/04/99  3593           Si,No,Annulla col mouse;
1.103.157    26/04/99  3540           controllo presenza gestore mouse;
1.103.156    25/04/99  3525           ±con tasto OK;
1.103.155    23/04/99  3542           ottimizzazioni varie;
1.103.154    22/04/99  3535           inizio gestione tasto OK;
1.103.153    18/04/99  3518           ±ottimizzazioni grafiche;
1.103.152    17/04/99  3519           ottimizzazioni varie;
1.103.151    16/04/99  3516           ±Fsplit in separa2;
1.103.150    01/04/99  3531           ±esc=N , invio=S;
1.103.149    31/03/99  3534           miglior uso di getdir;
1.103.148    16/02/99  3528           ±con getdir;
1.103.147    07/02/99  3531           ottimizzazioni varie;
1.103.146    06/02/99  3527           con Alt Y;
1.103.145    04/02/99  3525           con Alt T/I;
1.103.144    19/01/99  3513           incolla completato;
1.103.143    18/01/99  3470           file temporaneo per incolla;
1.103.142    17/01/99  3460           file temporaneo per la copia + taglia_ask + err_copia;
1.103.141    16/01/99  3403           file temporaneo per taglia;
1.103.140    10/01/99  3361           controllo mouse in riga 25;
1.102.139    05/01/99  3325           tempo aggiornato anche in S,N,A;
1.102.138    04/01/99  3284           tempo sempre aggiornato con tempo2;
1.101.137    03/01/99  3247           ottimizzazioni visive;
1.101.136    02/01/99  3249           con separa2 e controllo_2punti;
1.099.135????01/01/99  3236           ±perfezionamento del tempo;
1.099.134    30/12/98  3259           ±senza mes22 + ottimizzazioni varie;
1.099.133    29/12/98  3280           salva con nome incondizionato dal percorso + input annullabili;
1.099.132    28/12/98  3231           variabili ottimizzate;
1.099.131    27/12/98  3227           con funzione extra_percorso per aperture incondizionate dal percorso;
1.098.130    26/12/98  3190           con funzione scelta + tasti di scelta rapida completi;
1.097.129    25/12/98  3168           ±con menu_scelta + tasti di scelta rapida;
1.096.128    24/12/98  3263           applicazione del menu con tasti, ottimizzazione della variabile C, solo con F10;
1.096.127    23/12/98  3195           applicazione del menu;
1.096.126    21/12/98  3143           continuo con freccette e noteM;
1.095.125    20/12/98  3065           continuo con freccette;
1.095.124    19/12/98  3065           con freccette fino a files;
1.095.123    18/12/98  2930           con freccette + menu abbozzo;
1.093.122    15/12/98  2819           ±pi— uso di compare_mouse;
1.093.121    13/12/98  2830           ±tolti molti goto;
1.093.120    11/12/98  2843           refresh limitato in canc;
1.093.119    10/12/98  2830           ±completamento ottimizzazioni precedenti;
1.093.118    09/12/98  2847           refresh limitato;
1.093.117    08/12/98  2841           con meno goto;
1.093.116    04/12/98  2841           ±con meno goto e senza mes17: goto etichetta fa refresh video, goto sotto non lo fa;
1.092.115    03/12/98  2882           ±ottimizzazione goto nulla;
1.092.114    02/12/98  2895           ±goto nulla prevale su goto etichetta;
1.092.113    18/11/98  2904   112/50  ±salto da salva a salva con nome + delay2;
1.091.112    06/11/98  2945           ±piccole ottimizzazioni grafiche;
1.091.111    18/10/98  2949           ±con mes22/23 + sistemazione colori;
1.089.110    17/10/98  2953           con mes20/21 + colori;
1.087.109    16/10/98  2885           ±ottimizzazioni varie;
1.087.108    15/10/98  2894           sistemazione ricerche stringhe;
1.087.107    12/10/98  2894           ±senza unit windos, senza note;
1.085.106    28/09/98  2903           ottimizzazioni;
1.085.105    27/09/98  2895           con mes19 + separa + errparametro;
1.082.104    26/09/98  2842           con Help;
1.081.103    23/09/98  2810           ottimizzazioni varie;
1.081.102    22/09/98  2805           con note + ottimizzozione memoria;
1.080.101    21/09/98  2811           con mes11 e Dosshell;
1.078.100    20/09/98  2768           spostamento successivo dei caratteri con canc;
1.078.099    19/09/98  2729           senza mes11 + spostamento successivo dei caratteri in ingresso;
1.077.098    18/09/98  2720           ±ottimizzazioni varie;
1.077.097    17/09/98  2730           ottimizzazioni visive;
1.077.096    15/09/98  2697           ±con scrivi per salvare;
1.076.095    14/09/98  2783           a capo automatico + mes16/17/18;
1.073.093    03/09/98  2739           ±ottimizzazioni di disco pieno;
1.073.092    01/09/98  2741           ±ottimizzazioni grafiche;
1.073.091    31/08/98  2766           con 'mes14/15' + 760 righe;
1.071.090    30/08/98  2722           sistemazione del multitasking + 'mes10/11/12/13' + note + sistemazione del percorso con: chdir ;
1.067.089    26/08/98  2638           sistemazione del formato + 'espelli' + 'mes9';
1.065.088    25/08/98  2597           con 'mes8' + varie;
1.064.087    24/08/98  2520           con 'canc' + 'destra' + 'sinistra' + 'centro' + 'mes5/6/7';
1.057.086    23/08/98  2445           sistemazione str_int + annulla stampa + mes4;
1.056.085    22/08/98  2426           con tasto tab;
1.055.084    21/08/98  2409           con mes3 + sistemazione ricerche;
1.054.083    20/08/98  2301           con chiudi file + sistemazione percorso + 'back_space';
1.053.082    19/08/98  2223           sistemazione percorso;
1.053.081    18/08/98  2190           con 160 righe + mes2;
1.052.080    17/08/98  2184           ±ottimizzazione della memoria;
1.052.079    15/08/98  2203           con: pulisci1, ingresso1, mes1 e mouse ovunque;
1.049.078    14/08/98  2136           men— a tendina con mouse;
1.049.077    13/08/98  2090           con posizione_mouse;
1.048.076        "     2058           ±con writeB e writeC;
1.046.075        "     2156           ±senza compare + compare_mouse;
1.044.074        "     2198           ±senza scompare (" error 124: statement part too large");
1.043.073    12/08/98  2261           con: compare, scompare, writeA + note;
1.040.072    10/08/98  2116           ottimizzazione della memoria;
1.040.071    09/08/98  2096           con ricerche complete + ottimizzazioni della memoria;
1.038.070        "     2043           con ripeti ricerca stringa + varie;
1.037.069    08/08/98  2006           con ricerca stringa;
1.036.068    07/08/98    ?            meno variabili in memoria;
1.036.067        "       ?            sistemazione del percorso per le directory;
1.036.066        "       ?            ottimizzazioni varie;
1.036.065    06/08/98    ?            modifiche grafiche + 'm4' per input integer;
1.035.064    05/08/98    ?            ottimizzazioni grafiche;
1.035.063    04/08/98    ?            ottimizzazioni varie;
1.035.062    03/08/98    ?            con 'ingresso' e 'tasto' + ottimizzazioni varie;
1.033.061        "       ?            ottimizzazioni varie;
1.033.060    02/08/98    ?            refresh tempo + apri file + varie;
1.033.059    01/08/98    ?            meno cicli;
1.033.058    16/07/98    ?            ottimizzazioni varie;
1.033.057    16/07/98    ?            con 'tempo' + 'sonoro' in: pag su e giu';
1.032.056    15/07/98    ?            con 'controllo attributi' per il salvataggio;
1.031.055        "       ?            ottimizzazione di: 'stampa foglio attuale' e 'cerca riga' + 1ø abbozzo di 'apri';
1.031.054    14/07/98    ?            ottimizzazione 'paggiu';
1.031.053    13/07/98    ?            ottimizzazione algoritmo di refresh;
1.031.052    12/07/98    ?            con 'foglio' + info vari in basso + cerca riga + note + refresh in back-space;
1.029.051        "       ?            senza refresh superflui;
1.029.050    11/07/98    ?            senza m1, + ottimizzazione;
1.029.049        "       ?            con supporto acustico, senza m2, + ottimizzazione;
1.028.048        "       ?            on/off cursore (cursore_on , cursore_off) in assembler;
1.026.047    10/07/98  1300~          ±ottimizzazione con: goto eticheta: a causa di "overflow di stacks" e di " error 124: statement part too large";
1.026.046        "     1700~          ottimizzazione con: m3;
1.025.045    09/07/98    ?            riduzione dei gotoxy;
1.025.044        "       ?            sistema percorso;
1.025.043        "       ?            con: ymax + m1 + m2;
1.023.042    08/07/98    ?            sistemato 'nuovo';
1.023.041    06/07/98    ?            risalita col back-space + note;
1.023.040        "       ?            risalita col canc;
1.023.039    05/07/98    ?            tutti i salvataggi con 2 cicli + max 80 colonne;
1.023.038        "       ?            controllo oltre 100 righe + salva con 2 cicli;
1.023.037        "       ?            correzione nomefile + salvataggio in uscita;
1.023.036    04/07/98    ?            controllo errori stampante;
1.023.035        "       ?            richiesta numero copie + sistemazione note;
  ...         ...     ...       ...
1.000.000    27/05/98  600~    inizio (3 giorni).


NOTE:
xx± revisioni con riduzione del codice
tasti funzione: F1=059....F8=066
- correzioni anomalie, + aggiunte, * modifiche, # note

-----------------------------------------------------------------------------
DIPENDENZE:
Editor -> T_edit1x
       -> T_edit20
       -> T_edit24
       -> T_edit30
       -> Type_var

T_edit1x -> Type_var

T_edit20 -> T_edit1x
         -> Type_var

T_edit24 -> T_edit1x
         -> T_edit20
         -> Type_var

Type_var -> T_notes
         -> T_ini

T_edit30 -> T_edit1x
         -> T_edit20
         -> T_edit24
         -> Type_var

T_notes
T_ini
T_Lingua

-----------------------------------------------------------------------------
Note:

1) struttura di annulla (dalla ver 2.6.2):

                            caratteri:
 0/1 se annulla su pi— righe     1 (char)    0=si ripete   1=finito
 x                               1 (char)
 x_min                           1 (char)
 y                               2 (intToStr)
 iy                              4 (intToStr)
 tipo                            1 (intToStr)
 informazioni del tipo        max 254

2) testo[0] contiene
   -stringa ultimo carattere premuto, serve per la deselezione
   -interpretazione se si Š in fase di avvio, per setup lingua

3) struttura per i file di visualizza/recenti in editor.ini
   fileN= nomefile,next_length,tot posizione byte,x,x_min,y,iy,
        byte1: ignora,sotto,jolly,sc,tutto,pInt,selezione,selezione_quadrata,
        byte2: BK,binario,ins,unoS,autodetect,sl,cl,sFinal,
        byte3: per_riga,home,fine,salva_tab,salva_formato: T,B,L,U,
        selezionato.x1,selezionato.y1,selezionato.x2,selezionato.y2,tab_num
        byte4: primi 3 bit per delimitatore: 0,1,2

4) struttura per HTM in editor.ini  (dove sep=',')
 Htm=intToStr(bool(htm.titolo))+sep+           // :boolean;
     intToStr(bool(htm.fine_riga_br))+sep+     // :boolean;     // <br> (predefinito) , altrimenti <p></p>
     htm.colore_testo+sep+       //:string[6]  // FFFFFF  r,g,b; stringa vuota=ignora
     htm.colore_sfondo+sep+      //:string[6]  // FFFFFF  r,g,b; stringa vuota=ignora
     intToStr(htm.h)+sep+        //:byte;      // 0..6: <h>  ,  0=ignora
     intToStr(htm.punti)+sep+    //:integer;   // 0=ignora, 0..7 per htm, 0..3276 per Rtf
     intToStr(htm.allinea)+sep+  //:integer;   // 0=ignora, 1=sinistra, 2=destra, 3=centro, 4=giustificato
     intToStr(bool(htm.corsivo))+sep+  // :boolean;   // 0=stampatello, 1=corsivo (tutte le righe)
     intToStr(bool(htm.grassetto)+sep+ // :boolean;   // 0=ignora, 1=grassetto (tutte le righe)
     intToStr(bool(htm.sottolineato)+sep+   // :boolean;   // 0=ignora, 1=sottolineato (tutte le righe)
     intToStr(htm.size_rtf)   )

5) Struttura del file di testo .lng:  // dalla 3.20
 -I commenti inziano con il punto e virgola ;
 -Spazi finali o iniziali vengono ignorati
 -La prima riga di una traduzione Š in italiano, la seconda nella lingua
  interessata. Es:
          ;'Incolla tutti gli appunti'
  0,0, ,TXT=Paste all notes
  Il primo numero indica la posizione X dove comparir… il testo: 0=automatico
  Il secondo la posizione Y: sempre 0
  Il terzo: il tasto di scelta rapida
  Dopo il simbolo = segue la traduzione. Se supera la lunghezza della frase
  in italiano, potrebbe causare anomalie. Se Š presente il simbolo % (che non
  sar… stampato) mantiene gli spazi vuoti che lo precedono.

ddd *** ver only MAI update

----------------------Nuovo-------------------------------------------------
19 bis: quando mostro apppunti multipli: fare elimina tutto  e  incolla tutto (oltre ad annulla che gia' c'Š)
19 tris: dopo mostra appunti, fare: speciale / svuota appunti
9  setup language con Language=?

----------------------Da fare-----------------------------------------------

low 1      Stampante in Linux non ancora aggiunta
low 2      Seleziona/deseleziona con alcune combinazioni di tasti ancora mancante
8.0    invio a fine riga (o con soli spazi) fa riga nuova a partire dalla prima lettera della riga precedente,  s/n : da opzioni3
8.1    tab va su riga incolonnata ad inizio della precedente
8.2    se in inizio frase e premo back space, rimuove tutti gli spazi
8.3    no appunti doppioni
8.4    colore testo e sfondo personalizzabile
14     menu file/ crea .bak (automatico) (+path per .bak in configura3)

20 virtualizza files
21     menu cerca: ricerca speciale, nella stessa riga e stesso ordine: no su+ righe , si ignora maiu/minuscolo
16 stampa num copie predefinito
15 (distinti se txt o esa):       in configura3
        - creare 1 solo file d bak o con numerazione.
        - Ogni tot minuti
        - cartella attuale o ...

// oltre a default path in  INI, fare distinsione per apertura e salvataggio dddddd

7) mostra in esadecimale / testo / binario, +  modifica bit a bit

 mostra shell  (alt+f5)
 incolla shell
 incolla shell in riga

 opzioni  dopo tab ascii, mostra shell

-bug : incollo una solo riga, se supera la nuova riga i 255 char, va a capo e fa danno, undo Š ancora peggio


-mouse con /CL oltre fine testo

//versioni successive
- ricerca stringa con input esadecimale | decimale | testo
- cerca in /esa da byte a byte
- reinserire mancano il supporto per x_reale
- fare ripartire da inizio la ricerca (testo o selezione) se non trovato? [S/N]

--- DA NON FARE ---
- selezione da a...e tutti gli spaciali come in opzioni-->velocita, perche'  x y non sarebbe + fattibile
- readstring, da 1 a 2, perche' ci sarebbe [stringa] ambigui con ok/esc...
- ricerca stringa tra riga x..y, perche' la puo' fare dentro la selezione
- copia/incolla... col click destro, perche' gia' usato per la deselezione
- premo su,giu: se sono a fine riga, ci va pure alla successiva/precedente,
  perche' va in conflitto con Home&End e perche' nessun editor ce l'ha
- tot:=0;  da mettere in nuovo_comune?  no, perche' si aggiorna solo dove
  serve in modo automatico ( apertura_bin/su/giu [tot:=tot+...] )

---BUG noti---
- aggiornamento .ini strano per certe opzioni: non le aggiorna, ma le inserisce
- selezione del testo quadrata in Crt, con refresh non ottimale, ma funzionante


---DOCUMENTAZIONE da fare---


----
other - bug no cancellazione directory per destroy

conflitti software in FPC in RTL:
    Win32: Mouse.InitMouse con CRT causa rallentamento in Crt.Readkey/Keypressed
    Win32: Keyboard con CRT da fare Keyboard.Donekeyboard prima di usare
           Crt.Readkey e alla ripresa di Keyboard usare Keyboard.InitKeyboard

                                *** FINE ***

