Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-02-2021
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Función que devuelva la posición del primer carácter que no esté en la máscara de bus

Buenas, pues eso, hay alguna función en C para buscar unos caracteres en una cadena y que devuelve la posición de la primera o última de cualquier carácter pero yo quiero lo contrario, o sea, Supongamos que la función se llama buscar, pues:
Buscar("abc", "acabo");
Devolviese la posición del carácter 'o' ya que no está entre los caracteres indicados en la máscara de busqueda, no sé si me explico.
¿Conocen algo así?
Lo que quiero hacer es filtrar lo que se pegue desde el portapapeles a un tedit y que solo sean caracteres hexadecimales.
Responder Con Cita
  #2  
Antiguo 26-02-2021
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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.

Si se diera que hay dos o más caracteres que no existen en la máscara de búsqueda, ¿ Cuál debería devolver ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 26-02-2021
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Eso es lo de menos ya que si hay uno no válido la idea es no permitir el pegado.
Responder Con Cita
  #4  
Antiguo 26-02-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Podrías usar una expresión regular para hacer la busqueda.

Código Delphi [-]
function BuscarPattern(Pattern, Input: string): string;
  var
    i: integer;
    lRegex: TRegEx;
begin
  Result := '';
  lRegex.Create(Pattern, [roIgnoreCase]);
  if lRegex.IsMatch(Input) then
    for i := 0 to lRegex.Matches(Input).Count - 1 do
      Result := Result + lRegex.Matches(Input)[i].Value;
end;

El valor de búsqueda lo conviertes a un pattern válido. Por ej, "abc" podría ser "[a]|[b]|[c]". De esa manera encontrará "acab" de "acabo"

Ejemplo colores hexadecimales:
Texto de busqueda: "#0123456789ABCDEF"
Pattern: "[#]|[0]|[1]|[2]|[3]|[4]|[5]|[6]|[7]|[8]|[9]|[A]|[b]|[C]|[D]|[E]|[F]" (Que podría resumirse en "[#]|[0-9]|[A-F]")
Resultados
Código:
ORIGEN      RESULTADO
-#ffff00.,  #ffff00
-#e5e500[]  #e5e500
-#cccc00`^  #cccc00
-#b2b200{}  #b2b200
-#ff0000%   #ff0000
-#e50000$   #e50000
-#cc0000"   #cc0000
-#b20000!   #b20000
-#0000ffq   #0000ff
-#1919ffw   #1919ff
-#3232ffr   #3232ff
-#4c4cfft   #4c4cff
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #5  
Antiguo 26-02-2021
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Pero yo no quiero filtrar, lo que quiero es que si el formato no es válido no se pegue nada de nada.
Podría usar strspn para ello pero si la vcl tiene algo así me ahorro de añadir la librería string solo para eso.
Responder Con Cita
  #6  
Antiguo 28-02-2021
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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.

No conozco alguna función de la VCL que haga lo que buscas. Y si deseas prescindir de la librerá string, tendrías que hacer una función en C que lo realize, vg.r.:

Código PHP:
/* 
   devuelve la posición del caracter que no está
   en la máscara, o -1 si todos los caracteres coinciden
   con la máscara 
*/
.
int buscar(char *mskchar *str)
 {
  
int ijx;
  for (
i=0str[i] != '\0'i++) {
    
0;
    for(
j=0msk[j] != '\0'j++)
      if (
msk[j] == str[i]) 1;
    if (!
x) return i;
  }
  return -
1;

Por ejemplo:
Código PHP:
printf("\n%d\n",buscar("abc""acaba")); 
devuelve -1
y
Código PHP:
printf("\n%d\n",buscar("abc""acabo")); 
devuelve 4


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 03-03-2021
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Bueno, al final lo he pensado mejor y voy a hacer que imprima solo caracteres válidos pero la cosa es que consigo filtrarlo pero me lo muestra al final de lo que pego con Ctrl + V en vez de sustituir lo que pego por lo filtrado. Tengo esto:
Código PHP:
void __fastcall TForm1::EditValue1KeyPress(TObject *SenderSystem::WideChar &Key)
{
    if(
Key == 0x16){
        if(
Clipboard()->HasFormat(CF_TEXT)){
            
String CBText Clipboard()->AsText;
            
EditValue1->Text SuprimirCaracteresInvalidos(CBText.UpperCase());
        }
    }else if((
Key '0' || (Key '9' && (Key 'A' || Key 'F'))) && Key != '\b' && Key != 0x03 && Key != 0x18)
        
Key NULL;
}
//---------------------------------------------------------------------------

String TForm1::SuprimirCaracteresInvalidos(String input)
{
    
int ij;
    
String output "";
    
String mask "0123456789ABCDEF";

    for(
1input.Length() > && input.Length(); i++){
        for(
j=1mask.Length(); j++){
            if(
input[i] == mask[j]){
                
output += (WideString)input[i];
            }
        }
    }
    return 
output;

Además también me falta que al pegar con el menú contextual tenga el mismo comportamiento. El menú contextual o popup no lo he creado yo, es el de Windows y no se como hacer eso.

Última edición por aguml fecha: 03-03-2021 a las 11:17:25.
Responder Con Cita
  #8  
Antiguo 03-03-2021
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Lo del menú contextual lo he solucionado con mi propio popupmenu y gestionando ahí pero lo de Ctrl+V no lo consigo.
Responder Con Cita
Respuesta



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
¿funcion que devuelva mas de 1 valor? JXJ Varios 10 15-04-2011 20:13:56
Elegir Posicion de una cadena String y eliminar caracter en una posicion deseada BuRtOn Varios 14 26-03-2009 23:59:39
Función devuelva día del año Moparova Varios 2 23-04-2007 23:03:59
Funcion que devuelva mas de un valor ckaki Varios 1 27-11-2003 00:07:59
Posición del primer caracter de linea en un RichEdit SCH Varios 0 22-09-2003 20:51:32


La franja horaria es GMT +2. Ahora son las 13:50:17.


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