
//---------------------------------------------------------------------------

#include <vcl.h>
#include "mwprogu1.h"
#include "mwprogu2.h"

//---------------------------------------------------------------------------

#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"

// Variables externes utilisées ici, mais définies dans "mwprog1.cpp" :
extern int    buffer[2049],pointeur;
extern void   AfficheBuffer(void);
extern bool   Mode16bits;

// Variables internes :
bool          modif_en_cours=false;
int           ModifValeur,NBOmodif;

TForm2 *Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}

//---------------------------------------------------------------------------

// Gestion de l'appui sur une touche et prise en compte
// pour modifier la donnée à éditer :
void __fastcall TForm2::EditValKeyPress(TObject *Sender, char &Key)
{
  bool  Modif;
  int   ajout;

  // Si survenue de la routine du "TimerCurseur",
  // indiquer qu'une modification est en cours :
  modif_en_cours=true;

  // [ESC] ? -> Quitter ; la valeur 100000 impossible indique l'abandon :
  if (Key==VK_ESCAPE) { ModifValeur=100000; ModalResult=mrOk; }

  // [Entrée] ?
  if (Key==VK_RETURN)
  {
    // Analyser la valeur en cours :
    EditVal->Text="0x"+EditVal->Text;
    // si erreur, renvoie 100000, valeur impossible (car > à 65535) :
    ModifValeur=StrToIntDef(EditVal->Text,100000);

    if (ModifValeur==100000)
         // Si erreur : Bip !
         MessageBeep(0xFFFFFFFF);
    else // Sinon :
         {
           buffer[pointeur]=ModifValeur; // Mettre à jour la valeur...
           AfficheBuffer();              // ...et l'affichage du buffer...
           ModalResult=mrOk;             // ...puis enfin, refermer la fiche.
         }
  }

  // Si touche [0] à [9], [a] à [f] ou [A] à [F] :
  Modif=false;
  if ((Key>='0')&&(Key<='9')) { ajout=(int) (Key-'0');    Modif=true; }
  if ((Key>='A')&&(Key<='F')) { ajout=(int) (Key-'A'+10); Modif=true; }
  if ((Key>='a')&&(Key<='f')) { ajout=(int) (Key-'a'+10); Modif=true; }
  if (Modif)
  {
    // Tronquer le quartet de poids fort à gauche ("A" dans "ABCD") :
    EditVal->Text=EditVal->Text.SubString(2,NBOmodif-1);
    // Et coller à droite le chiffre hexa correspondant
    // à la touche (comme quartet de poids faible) :
    EditVal->Text=EditVal->Text+IntToHex(ajout,1);
  }

  // [<-] (= "Backspace" = "Retour arrière") ?
  if (Key==VK_BACK)
  {
    // On supprime le quartet de poids faible (4ième chiffre hexa) :
    EditVal->Text=EditVal->Text.SubString(1,NBOmodif-1);
    // Et on colle un "0" à gauche pour avoir toujours 4 chiffres hexa :
    EditVal->Text="0"+EditVal->Text;
  }

  // On force le curseur à droite :
  EditVal->SelStart=NBOmodif;
  EditVal->SelLength=0;

  // fin de la modification en cours :
  modif_en_cours=false;
}

//---------------------------------------------------------------------------

// A l'apparition de la fiche :
// d'origine et l'adresse de la donnée :
void __fastcall TForm2::FormShow(TObject *Sender)
{
  // Forcer le format 2 ou 4 chiffres dans la zone
  // d'édition selon le mode 8 ou 16 bits :
  if (Mode16bits)
  {
    NBOmodif=4;
    ModifValeur=buffer[pointeur] & 0x0000FFFF;
  }
  else
  {
    NBOmodif=2;
    ModifValeur=buffer[pointeur] & 0x000000FF;
  }

  // Charger la valeur à modifier :
  EditVal->Text=IntToHex(ModifValeur,NBOmodif);

  // Curseur à droite :
  EditVal->SelStart=NBOmodif;
  EditVal->SelLength=0;

  // Mettre à jour l'affichage de l'adresse...
  STadresse->Caption="Adresse = $"+IntToHex(pointeur,3);

  // ...et de la valeur de la donnée :
  STvaleur->Caption="Valeur par défaut = $"+IntToHex(ModifValeur,NBOmodif);

  // Activer le repositionnement permanent du curseur à droite :
  TimerCurseur->Enabled=true;
}

//---------------------------------------------------------------------------

// A la disparition de la fiche, cesser de forcer
// le curseur à droite dans la zone d'édition :
void __fastcall TForm2::FormHide(TObject *Sender)
{
  TimerCurseur->Enabled=false;
}

//---------------------------------------------------------------------------

// En permanence, forcer si nécessaire le curseur à
// se positionner à droite dans la zone d'édition :
void __fastcall TForm2::TimerCurseurTimer(TObject *Sender)
{
  if ( (!modif_en_cours) &&
       ((EditVal->SelStart!=NBOmodif)||(EditVal->SelLength!=0)) )
    { EditVal->SelStart=NBOmodif; EditVal->SelLength=0; }
}

//---------------------------------------------------------------------------

