Bien, me ha servido para orientarme en mi código y ver otro fallo más. ¿qué pasa si seleccionamos el primer caracter o un rango que contenga el primer caracter y pulsamos un número? pues que el número se escribe porque SelLength no es igual a 0 y lo he solucionando cambiando el == por un >= y con eso da igual la cantidad de caracteres que seleccione que si el primer caracter es uno de ellos no dejará que se introduzca un número.
Así quedó mi código:
Código:
const char* wrongKey = "|°¬!\"#$%&/()='?\\¿¡@´¨+*~{[^}]`<>,;.:-";
//---------------------------------------------------------------------------
// Verificar en escritura
// El mismo evento lo asignamos a todos los TEdits que queramos filtrar
void __fastcall TForm1::EditsKeyPress(TObject *Sender, char &Key)
{
TEdit *ed = static_cast<TEdit*>(Sender);
// Si es el primer caracter o si hay una seleccion que abarque al primer caracter
// y este es numérico o si la tecla pulsada es uno de los caracteres prohibidos
// evitamos que se imprima el caracter
if((ed->SelStart == 0 && ed->SelLength >= 0 && isdigit(Key)) ||
StrPos(wrongKey, String(Key).c_str()) != NULL)
{
Key=0;
MessageBeep(0);
}
}
//---------------------------------------------------------------------------
// Verificar por copiado/pegado
// El mismo evento lo asignamos a todos los TEdits que queramos filtrar
void __fastcall TForm1::EditsExit(TObject *Sender)
{
TEdit *ed = static_cast<TEdit*>(Sender);
bool invalid = false;
// Si el TEdit no está vacío entramos
if(ed->Text != "")
{
// Si el primer caracter es un número en este caso no nos vale la cadena pegada
if(isdigit(ed->Text[1])){
invalid = true;
}else{
// Si el primer caracter no es numérico comprobamos que la cadena no contenga caracteres inválidos para nuestro propósito recorriendola entera
for(int i = 1; i <= ed->Text.Length();i++)
{
if (StrPos(wrongKey, String(ed->Text[i] ).c_str()) != NULL) {
// Si se encuentra un caracter inválido
invalid = true;
// Salimos del bucle
break;
}
}
}
if(invalid)
{
// Mostramos un mensaje avisando
MessageBox(Application->Handle,AnsiString("Una cadena no válida fue pegada en " + ed->Name + ".\nRevísela antes de continuar.").c_str(),"Atención",MB_OK | MB_ICONERROR);
// Devolvemos el foco al TEdit que contiene la cadena inválida
ed->SetFocus();
ed->SelStart = 0;
ed->SelLength = 0;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Limpiamos todos los TEdits
for(int i=0;i < ComponentCount; i++)
if(Components[i]->ClassNameIs("TEdit"))
(static_cast<TEdit*>(Components[i]))->Clear();
}
//---------------------------------------------------------------------------
Puedes ver que muchisimas cosas son copiadas o adaptadas de tu código porque me parecen muy bien hechas y he guardado este proyecto porque es bueno tener algo en que fijarse cuando lo necesite ya que cambiando cuatro cosas esto es muy estandarizable para cualquier otro proyecto.