Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
PosEx, mejora de la función Pos

Esta funcion lo que hace es buscar en el texto especificado un patron, y devolver la posicion en la que se encontro, pero permite mas funcionalidad, al poder elegir buscar de atras para adelante, o de poder dar la cantidad de coincidencias que hay.

Me imagino que se la podria optimizar, y se le puede agregar que no sea CASE sensitive, y varias cosas mas que puede me ponga a hacer cuando las necesite.

Código Delphi [-]
(*

 Uso:  variable := PosEx(texto,patron,veces);

 texto : el texto en el que se va a bucar las coincidencias
 patron: el texo que se va a buscar para hacer coincidir
 veces : indica el tipo de busqueda;

  <0 la busquede se hace de atras para adelante

  0  devuelve la cantidad de coindicencias

  >0 la busquede se hace normal
     un numero cualquiera devuelve la posicion de la
     coincidencia con igual numero
     si no hay tal cantidad de coincidencias, devuelve 0

 Ejemplo: (texto := 'En una casa, muy linda...')
   PosEx(texto,' ',0)  devuelve 4
   PosEx(texto,'.',1)  devuelve 23
   PosEx(texto,'.',-1) devuelve 25
*)

function PosEx(const texto, patron : string; const veces : integer) : integer;
var vtexto, letra : string;
    vecesb, cointot, posicion, termina : integer;
    i, dir, posi, posi2 : integer;
begin
//Seteo de variables necesarias
vtexto := texto;
vecesb := veces;
if veces = -1 then vecesb := 1;
if veces < -1 then vecesb := (veces*veces)+veces;
cointot := 0;
posicion := 0;
termina := 0;

    //Algoritmo
    if veces >= 0 then begin
      i := 1;
        dir := 1;
        posi := 0;
        posi2 := 1;
    end
    else begin
      i := length(vtexto);
        dir := -1;
        posi := length(vtexto);
        posi2 := 0;
    end;
  while (length(vtexto) > 0) and (termina = 0) do begin
      letra := copy(vtexto,posi,1);
        delete(vtexto,posi+posi2,1);
    if (letra = patron) then begin
          inc(cointot,1);
      //porque -2*-2 = 4, 4+(-2) = 2 :)
            if (vecesb = cointot) then begin
              posicion := i;
                termina := 1;
            end;
        end;
        inc(i,dir);
        if veces < 0 then inc(posi,dir);
  end; //while length(linea) > 0

  if veces = 0 then
    posicion := cointot;

PosEx := posicion
end;
Responder Con Cita
 


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


La franja horaria es GMT +2. Ahora son las 16:52:25.


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