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 "acer
co52" 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
Memo1.Lines.LoadFromFile( 'archivo.pas');
for cc := 0 to Memo1.Lines.Count -1 do
begin
bb := LowerCase ( Memo1.Lines [cc] ) ; aa := LowerCase ( 'Texto a buscar' ) ; ff := 'texto con el que se reemplaza' ;
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
aa1 := LowerCase( aa ) ;
bb0 := bb ;
bb1 := bb + ' ' ;
cc := pos ( aa1, Lowercase ( bb1 ) ) ;
while cc > 0
do
begin
if cc=1 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 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.