Ver Mensaje Individual
  #8  
Antiguo 04-10-2010
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Reputación: 21
rrf Va por buen camino
Smile

Hola de nuevo.

Aquí está la función y la forma de llamarla. Resuelve todos los problemas que planteaba cuando empecé este hilo.

La función reemplaza las apariciones de un nombre de constante en el código de un programa Delphi.

No confunde los nombres "acerco52" con "co5".

Si el nombre de la constante aparece varias veces en una misma línea, actúa con cada aparición de forma independiente, por lo que se evita el error comentado en el párrafo anterior.

En el ejemplo se recorre un memo en el cual previamente se habría cargado el código de 'archivo.pas'.

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
  cc : integer ;
  aa, bb, ff : string ;
begin
        // Reemplazar en un memo
        //-----------------------

  Memo1.Lines.LoadFromFile( 'archivo.pas');

  for cc := 0 to Memo1.Lines.Count -1 do
  begin
    bb := LowerCase ( Memo1.Lines [cc] ) ;            // Línea del memo
    aa := LowerCase ( 'Texto a buscar' ) ;           // Texto a buscar
    ff := 'texto con el que se reemplaza' ;        // Texto para sustituir

    if 0< pos ( aa, bb )
    then
      begin
        Memo1.Lines [cc] := Cambia_en_linea( Memo1.Lines [cc], aa, ff, cc) ;
      end;
  end;

end;


function TForm1.Cambia_en_linea ( bb, aa, ff : string; nn: integer ): string;
var
  cc : integer ;
  ab, aa1, bb0, bb1 : string ;
  antes, despues : boolean ;
begin
       // Reemplaza en la línea del memo los nombres de las constantes
       //---------------------------------------------------------------

  aa1 := LowerCase( aa ) ;
  bb0 := bb ;
  bb1 := bb + ' ' ;
  cc := pos ( aa1, Lowercase ( bb1 ) ) ;

  while cc > 0
  do
  begin
    if  cc=1     // al inicio de la línea
    then
      begin
        ab := copy (bb1, cc + Length ( aa1 ), 1 ) ;
        if ab[1] in  ['a'..'z', 'A'..'Z', '0'..'9','_' ]
          then bb0 := StringReplace( bb0, aa1, 'nonotnonot', [rfIgnoreCase])
          else bb0 := StringReplace( bb0, aa1, 'siyessiyes', [rfIgnoreCase]) ;
      end

    else if cc > 1
    then         // a la mitad o final de la línea
      begin
        ab := copy (bb1, cc -1, 1 ) ;
        if ab[1] in  ['a'..'z', 'A'..'Z', '0'..'9','_' ]
          then antes := false
          else antes := true ;

        ab := copy (bb1, cc + Length ( aa1 ), 1 ) ;
        if ab[1] in  ['a'..'z', 'A'..'Z', '0'..'9','_' ]
          then despues := false
          else despues := true ;

        if ( antes ) and ( despues )
          then bb0 := StringReplace( bb0, aa1, 'siyessiyes', [rfIgnoreCase])
          else bb0 := StringReplace( bb0, aa1, 'nonotnonot', [rfIgnoreCase]) ;
      end;

    cc := pos ( aa1, Lowercase ( bb0 ) ) ;
    if cc > 0
      then bb1 := bb0 + ' ' ;
  end;

  bb0 := StringReplace( bb0, 'siyessiyes', ff,  [rfreplaceall, rfIgnoreCase]) ;
  bb0 := StringReplace( bb0, 'nonotnonot', aa1, [rfreplaceall, rfIgnoreCase]) ;

  Result := bb0 ;

end;

Lo dejo en el foro por si a alguna persona le puede resultar útil en alguna situación parecida.

Gracias de nuevo a Casimiro y a Reevil. Sin sus sugerencias y explicaciones no creo que lo hubiera podido realizar tan fácil y rapidamente.

Saludos.

Última edición por rrf fecha: 04-10-2010 a las 20:37:59. Razón: mejora en presentación del código
Responder Con Cita