10 agosto 2007

Operaciones con cadenas de texto (IV)

Vamos a seguir con las funciones para tratamiento de cadenas de texto:

procedure Delete( var S: string; Index, Count:Integer );

Este procedimiento elimina de la cadena S (pasada por variable) un número de caracteres situados en la posición Index y cuya longitud viene determinada por Count. El primer elemento comienza por 1. Por ejemplo:

var
sTexto: String;
begin
sTexto := 'CORTANDO UNA CADENA DE TEXTO';
Delete( sTexto, 10, 14 );
end;

Ahora la variable sTexto contiene:

CORTANDO TEXTO

porque hemos eliminado UNA CADENA DE.

function DupeString( const AText: string; ACount: Integer ): string;

Esta función devuelve la cadena AText repetida tantas veces como se indique en ACount. Por ejemplo:

DupeString( 'HOLA ', 3 ) devuelve HOLA HOLA HOLA

function High( X );

Devuelve el valor más alto de un tipo de variable. Vamos a ver un ejemplo que utiliza esta función con distintos tipos de variable y muestra el resultado en un Memo:

var
Numeros: array[1..4] of Integer;
begin
Memo.Lines.Add( 'High( Char )=' + IntToStr( Ord( High( Char ) ) ) );
Memo.Lines.Add( 'High( Integer )=' + IntToStr( High( Integer ) ) );
Memo.Lines.Add( 'High( Word )=' + IntToStr( High( Word ) ) );
Memo.Lines.Add( 'High( DWord )=' + IntToStr( High( DWord ) ) );
Memo.Lines.Add( 'High( Boolean )=' + BoolToStr( High( Boolean ), True ) );
Numeros[1] := 13;
Numeros[2] := 6;
Numeros[3] := 16;
Numeros[4] := 5;
Memo.Lines.Add( 'High( Numeros )=' + IntToStr( High( Numeros ) ) );
end;

El resultado que muestra sería:

High( Char )=255
High( Integer )=2147483647
High( Word )=65535
High( DWord )=4294967295
High( Boolean )=True
High( Numeros )=4

Como vemos en el último caso, nos devuelve el último índice del del array Numeros.

procedure Insert( Source: string; var S: string; Index: Integer );

Este procedimiento inserta dentro de la cadena S (pasada como variable) la cadena Source en la posición Index. Por ejemplo:

var
sTexto: String;
begin
sTexto := 'AMPLIANDO TEXTO';
Insert( ' UNA CADENA DE', sTexto, 10 );
end;

Ahora sTexto contiene:

AMPLIANDO UNA CADENA DE TEXTO

function LastDelimiter( const Delimiters, S: string ): Integer;

Esta función nos devuelve la posición del último delimitador determinado por Delimiters que encuentre en la cadena S. Con unos ejemplos se ve mas claro:

LastDelimiter( ',', 'PABLO,JUAN,MARIA,MARCOS' ) devuelve 17
LastDelimiter( '.', '1.2.3.4.5' ) devuelve 8
LastDelimiter( '-:', 'A:1-B:2-C:3' ) devuelve 10

En el último ejemplo hemos utilizado dos delimitadores. Esta función sería muy interesante para crear un parser de código fuente HTML buscando delimitadores <>.

function Length( S ): Integer;

Devuelve la longitud máxima de una cadena de texto o de un array. Por ejemplo:

var
Valores: array of Integer;
begin
ShowMessage( Length( 'HOLA' ) );
SetLength( Valores, 3 );
ShowMessage( IntToStr( Length( Valores ) );
end;

Los comandos ShowMessage nos mostraría los valores 4 para la cadena HOLA y el valor 3, que es la longitud del array dinámico.

function LowerCase( const S: string ): string;

Convierte los caracteres de la cadena S a minúsculas. Se recomenda utilizar en su lugar la función AnsiLowerCase para caracteres internacionales de 8 bits. Por ejemplo:

LowerCase( 'Programando con Delphi' ) devuelve:

programando con delphi

LowerCase( 'MANIPULANDO CADA CARÁCTER DE LA CADENA' )

manipulando cada carÁcter de la cadena

Como vemos en este último ejemplo la palabra CARÁCTER ha dejado la Á en mayúsculas. Por ello se recomienda utilizar la función AnsiLowerCase para evitar estas incidencias.

procedure Move( const Source; var Dest; Count: Integer );

Este procedimiento (que debería llamarse quizás Copy) copia la cantidad de bytes Count de Source a la variable Dest. Por ejemplo:

var
sOrigen, sDestino: String;
begin
sOrigen := 'COPIANDO TEXTO';
sDestino := '--------------';
Move( sOrigen[10], sDestino[3], 5 );
end;

El valor de la variable destino sería:

--TEXTO-------

function Pos( Substr: string; S: string ): Integer;

Devuelve la posición de la cadena Substr dentro de la cadena S (Distingue mayúsculas de minúsculas). Si no la encuentra nos devuelve un cero (el primer elemento es el 1). Por ejemplo:

Pos( 'PALABRA', 'BUSCANDO UNA PALABRA' ) devuelve 14
Pos( 'palabra', 'BUSCANDO UNA PALABRA' ) devuelve 0

procedure ProcessPath( const EditText: string; var Drive: Char; var DirPart: string; var FilePart: string );

Este interesante procedimiento divide la cadena EditText la cual se supone que es una ruta como:

C:\Archivos de programa\MSN Messenger\msnmsgr.exe

en unidad, directorio y archivo. Vamos un ejemplo volcando la información en un Memo:

var
sRuta, sDirectorio, sArchivo: String;
cUnidad: Char;
begin
sRuta := 'C:\Archivos de programa\MSN Messenger\msnmsgr.exe';
ProcessPath( sRuta, cUnidad, sDirectorio, sArchivo );
Memo.Lines.Add( 'sUnidad=' + cUnidad );
Memo.Lines.Add( 'sDirectorio=' + sDirectorio );
Memo.Lines.Add( 'sArchivo=' + sArchivo );
end;

El resultado sería:

sUnidad=C
sDirectorio=\Archivos de programa\MSN Messenger
sArchivo=msnmsgr.exe

Nota: para que funcione esta función la ruta que le pasemos debe ser real, en caso contrario da un error.

En el próximo artículo terminaremos con este tipo de funciones.

Pruebas realizadas en Delphi 7.

Publicidad