File "mwprogu2.cpp"
Full Path: /home/analogde/www/port parallele/builder/sources/mwprogu2.cpp
File size: 4.5 KB
MIME-type: text/x-c
Charset: 8 bit
//---------------------------------------------------------------------------
#include <vcl.h>
#include "mwprogu1.h"
#include "mwprogu2.h"
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
// Variables externes utilises ici, mais dfinies 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 donne 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; }
// [Entre] ?
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 arrire") ?
if (Key==VK_BACK)
{
// On supprime le quartet de poids faible (4ime 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 donne :
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 donne :
STvaleur->Caption="Valeur par dfaut = $"+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 ncessaire 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; }
}
//---------------------------------------------------------------------------