Ver Mensaje Individual
  #7  
Antiguo 08-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
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.
Responder Con Cita