Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Aquí si le veo sentido:
Código:
const char* wrongKey = "|°¬!\"#$%&/()='?\\¿¡@´¨+*~{[^}]`<>,;.:-";

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

// Limpiar Edit ingreso de nombre
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Edit1->Clear();
  Edit2->Clear();
  Edit3->Clear();
}
//---------------------------------------------------------------------------

// Verificar en escritura
void VerifyKey(TObject *Sender, char &Key)
{
  TEdit *ed = static_cast<TEdit*>(Sender);

  if((ed->SelStart+ed->SelLength == 0 && isdigit(Key)) ||
     StrPos(wrongKey, String(Key).c_str()) != NULL)
    Key=0;
}
//---------------------------------------------------------------------------

// Verificar por copiado/pegado
void VerifyOnPaste(TObject *Sender)
{
  TEdit *ed = static_cast<TEdit*>(Sender);

  for(int i = 1; i <= ed->Text.Length();i++)
    if (StrPos(wrongKey, ed->Text.c_str()+i) != NULL || isdigit(ed->Text[1])) {
      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);
      ed->SetFocus();
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
        VerifyKey(Sender,Key);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
        VerifyKey(Sender,Key);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{
        VerifyKey(Sender,Key);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
        VerifyOnPaste(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit2Exit(TObject *Sender)
{
        VerifyOnPaste(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit3Exit(TObject *Sender)
{
        VerifyOnPaste(Sender);
}
//---------------------------------------------------------------------------
Ya que si son muchos TEdits nos ahorramos codigo y es mas facil entenderlo. ¿que opinas?

Última edición por aguml fecha: 06-09-2014 a las 18:50:46.
Responder Con Cita
  #2  
Antiguo 06-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.
Cita:
Empezado por aguml Ver Mensaje
Ya que si son muchos TEdits nos ahorramos codigo y es mas facil entenderlo. ¿que opinas?
Opino que se ahorra mas código y es mas natural asignar la función miembro:
Código:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
  TEdit *ed = static_cast<TEdit*>(Sender); 

  if((ed->SelStart+ed->SelLength == 0 && Key>=0x30 && Key<=0x39) ||
     StrPos(wrongKey, String(Key).c_str()) != NULL)
    Key=0;
}
a los eventos OnKeyPress de todos los Edits que nos interese evaluar.

Lo mismo cuenta para la función miembro "Edit1Exit".

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 06-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
pues tienes toda la razon, no habia pensado en esa opcion. En ese caso seria mejor crearnos un nombre mas estandar pero es algo simplemente porque el nombre no haga referencia a un tedit, solo eso. Por ejemplo EditKeyPress y EditExit.
Responder Con Cita
  #4  
Antiguo 06-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
ecfisa tu código para cuando sales del TEdit tiene algo mal, he estado mirandolo y yo al final lo he dejado así y funciona:
Código:
// 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);

  //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])){
      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);
      ed->SetFocus();
    }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) {
          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);
          ed->SetFocus();
          break;
        }
      }
    }
  }
}
//---------------------------------------------------------------------------
El problema es que si metes el primer caracter inválido de la lista que es '|' no lo detecta o he visto cosas raras como que si es el primero si lo detecta pero si no lo es y tiene mas caracteres detras tampoco lo detecta. Ahora no recuerdo cuales eran los casos pero en mi código si funciona. Mira a ver que falla en el tuyo. Creo que ademas en tu código, en el for, i tendria que empezar valiendo 0 y el <= tendria que ser solo < ya que si no te saltas el primer caracter malo de la lista wrongKey. Ademas si encuentras un caracter malo tienes que terminar el bucle ya que recorrería toda la cadena aunque encuentre un caracter de los de wrongKey.
Corrijeme en lo que veas que estoy equivocado.
Responder Con Cita
  #5  
Antiguo 07-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Si tenes razón, la función falla en el caso que comentas. Y la tuya también lo hace cuando detecta un error al salir del Edit. Luego de mostrar el mensaje y asignarle nuevamente el foco y estándo el texto selecionado, permite la introducción de un número ya que los valores de SelStart y SelLength no son actualizados.

Sin embargo, pude comprobar que se simplifica el tratamiento con el uso de String:
Código:
...

String wrongChar  = "|°¬!\"#$%&/()='?\\¿¡@´¨+*~{[^}]`<>,;.:-";

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  for(int i=0;i < ComponentCount; i++)
    if(Components[i]->ClassNameIs("TEdit"))
      (static_cast<TEdit*>(Components[i]))->Clear();
}

void __fastcall TForm1::EditKeyPress(TObject *Sender, char &Key)
{
  TEdit *ed = static_cast<TEdit*>(Sender);

  if(ed->SelStart+ed->SelLength == 0 && (char)Key>='0' && (char)Key<='9' ||
     wrongChar.AnsiPos((char)Key)!=0) {
    MessageBeep(MB_ICONERROR);
    Key=0;
  }
}

void __fastcall TForm1::EditExit(TObject *Sender)
{
  TEdit *ed = static_cast<TEdit*>(Sender);
  bool invalid = false;

  if(ed->Text == "") return;

  if(ed->Text[1]>='0'&&ed->Text[1]<='9'|| wrongChar.AnsiPos(ed->Text[1])!=0)
    invalid = true;

  for(int i = 2; i <= ed->Text.Length(); i++)
    if(wrongChar.AnsiPos(ed->Text[i]))
      invalid = true;

  if (invalid) {
    MessageBeep(MB_ICONERROR);
    ed->SetFocus();
    ed->SelStart = 0;
    ed->SelLength = 0;
  }
}
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 07-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
interesante. Mañana lo pruebo y te cuento.
Responder Con Cita
  #7  
Antiguo 08-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
nombres de tablas en un SP akela Conexión con bases de datos 2 14-12-2007 21:11:34
Propiedad tableName,al criterio look SQL 2 16-10-2007 01:54:32
¿Que componentes usar para tablas Paradox? h2o_mx Tablas planas 5 18-05-2006 18:14:38
Consejo para manejar tablas Paradox Coco_jac Varios 8 17-11-2005 17:27:17
como bloquear para borrar en tablas Paradox Mario1980 Varios 4 01-12-2004 15:17:51


La franja horaria es GMT +2. Ahora son las 22:45:12.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi