13 agosto 2007

Operaciones con cadenas de texto (y V)

Aquí finalizamos con las funciones de manipulación de cadenas de texto:

procedure SetLength( var S; NewLength: Integer );

Establece el tamaño de una cadena de texto o un array dinámico. Por ejemplo:

var
sTexto: String;
begin
sTexto := '123456789';
SetLength( sTexto, 4 );
end;

Después de ejecutar esto sTexto será igual a 1234 (hemos recortado la cadena).

También se utiliza para establecer el tamaño de un array dinámico antes de utilizarlo.

var
Valores: array of Integer;
begin
SetLength( Valores, 3 );
Valores[0] := 10;
Valores[1] := 20;
Valores[2] := 30;

// Ampliamos el tamaño del array
SetLength( Valores, 5 );
Valores[3] := 40;
Valores[4] := 50;
end;

procedure SetString( var S: string; Buffer: PChar; len: Integer );

El procedimiento SetString fija la longitud de la cadena S antes de copiar el número de caracteres determinado por len de la cadena Buffer. Vamos a ver un ejemplo que copia el contenido de un array de caracteres a un string:

var
Original: array[1..3] of char;
sDestino: String
begin
Original[1] := 'A';
Original[2] := 'B';
Original[3] := 'C';
SetString( sDestino, PChar( Addr( Original ) ), 3 );
end;

Ahora la variable sDestino vale 'ABC'.

function StringOfChar( Ch: Char; Count: Integer ): string;

Esta función devuelve una nueva cadena de texto creada con el carácter Ch y repetido tantas veces como determine el parámetro Count. Por ejemplo:

StringOfChar( '0', 5 ) devuelve 00000
StringOfChar( 'A', 6 ) devuelve AAAAAA

Esta función viene bien para completar con ceros por la derecha o por la izquierda los números que se pasan a formato texto.

function StringReplace( const S, OldPattern, NewPattern: string; Flags: TReplaceFlags ): string;

Esta función devuelve una cadena de texto reemplazando las subcadenas encontradas dentro de la cadena S que coincidan con OldPattern y serán sustituidas por la cadena NewPattern. Los valores del parámetro Flags pueden ser:

rfReplaceAll: reemplaza todas las cadenas encontradas
rfIgnoreCase: no distingue mayúsculas de minúsculas

Por ejemplo:

StringReplace( 'CAMBIANDO-EL-TEXTO', '-', '.', [] ) devuelve:

CAMBIANDO.EL-TEXTO

StringReplace( 'CAMBIANDO-EL-TEXTO', '-', '.', [rfReplaceAll] ) devuelve:

CAMBIANDO.EL.TEXTO

StringReplace( 'CAMBIANDO EL TEXTO', 'EL', 'mi', [rfReplaceAll,rfIgnoreCase] ) devuelve:

CAMBIANDO mi TEXTO

StringReplace( 'CAMBIANDO EL TEXTO', 'EL', 'mi', [rfReplaceAll] ) devuelve:

CAMBIANDO mi TEXTO

StringReplace( 'cambiando el texto', 'EL', 'mi', [rfReplaceAll] ) devuelve:

cambiando el texto

StringReplace( 'cambiando el texto', 'EL', 'mi', [rfReplaceAll,rfIgnoreCase] ) devuelve:

cambiando mi texto

function StrScan( const Str: PChar; Chr: Char ): PChar;

Devuelve un puntero al primer carácter que encuentre dentro de la cadena Str. Por ejemplo:

StrScan( 'BUSCANDO UN CARÁCTER', 'T' ) devuelve TER
StrScan( 'BUSCANDO UN CARÁCTER', 'U' ) devuelve USCANDO UN CARÁCTER

function StuffString( const AText: string; AStart, ALength: Cardinal; const ASubText: string ): string;

Esta función devuelve la cadena AText insertando dentro de la misma ASubText en la posición AStart y con la longitud ALength (aunque realmente no inserta sino que es una sustitución del texto que hay en esa misma posición). Veamos un ejemplo:

StuffString( 'INSERTANDO UN TEXTO EN UNA CADENA', 12, 2, 'EL' ) devuelve:

INSERTANDO EL TEXTO EN UNA CADENA

StuffString( 'INSERTANDO UN TEXTO EN UNA CADENA', 12, 15, 'UNA' ) devuelve:

INSERTANDO UNA CADENA

Si nos fijamos en el segundo ejemplo hemos sustituido UN TEXTO EN UNA por UNA (15 caracteres).

function Trim( const S: string ): string; overload;
function Trim( const S: WideString ): WideString; overload;


La función Trim devuelve la cadena S eliminando los espacios en blanco y los caracteres de control que halla a la izquierda y derecha (pero no en medio). Por ejemplo:

Trim( ' ESTO ES UNA PRUEBA ' ) devuelve 'ESTO ES UNA PRUEBA'

function TrimLeft( const S: string ): string; overload;
function TrimLeft( const S: WideString ): WideString; overload;


Esta función es similar a Trim salvo que sólo elimina los espacios en blanco y caracteres de control por la izquierda. Por ejemplo:

TrimLeft( ' ESTO ES UNA PRUEBA ' ) devuelve 'ESTO ES UNA PRUEBA '

function TrimRight( const S: string ): string; overload;
function TrimRight( const S: WideString ): WideString; overload;


Esta función es igual a Trim salvo que sólo elimina los espacios en blanco y caracteres de control por la derecha. Por ejemplo:

TrimRight( ' ESTO ES UNA PRUEBA ' ) devuelve ' ESTO ES UNA PRUEBA'

function UpCase( Ch: Char ): Char;

Convierte un carácter a mayúsculas. Por ejemplo:

UpCase( 'a' ) devuelve A
UpCase( 'ú' ) devuelve ú

Como vemos en el segundo ejemplo no funciona correctamente con caracteres Ansi. Mejor utilizar en su lugar la función AnsiUpperCase.

function UpperCase( const S: string ): string;

Convierte la cadena S a mayúsculas. Por ejemplo:

UpperCase( 'Hola' ) devuelve HOLA
UpperCase( 'Programación en Delphi' ) devuelve PROGRAMACIóN EN DELPHI

El segundo ejemplo no respeta las vocales con tilde. Mejor utilizar AnsiUpperCase.

function WrapText( const Line, BreakStr: string; nBreakChars: TSysCharSet; MaxCol: Integer ):string; overload;
function WrapText( const Line, MaxCol: Integer = 45 ):string; overload;


La función WrapText parte la cadena Line en múltiples líneas de texto separadas por defecto con los caracteres de control #13 y #10, en tamaños máximos de palabra definidos por MaxCol. Veamos algunos ejemplos:

WrapText( 'Partiendo una cadena de texto', 15 ) devuelve

Partiendo una
cadena de texto

WrapText( 'Partiendo una cadena de texto', 10 ) devuelve:

Partiendo
una
cadena de
texto

WrapText( 'Partiendo una cadena de texto', 5 ) devuelve:

Partiendo
una
cadena
de
texto

Es decir, parte la cadena en frases cuyo tamaño máximo es definido por MaxCol pero respetando en ancho de cada palabra (aunque se pase del límite). También podemos definir con que caracteres vamos a separar las palabras así como que deseamos de separador. Si quisieramos separar la frase mediante por punto sería de la siguiente manera:

WrapText( 'Partiendo.una.cadena.de.texto', '-', ['.'], 5 ) devuelve

Partiendo.-una.-cadena.-de.-texto

Hemos definido el separador (quitando #13 y #10) y también le hemos indicado el carácter que divide cada palabra (el punto).

Con esto finalizan las funciones de manipulación de texto.

Pruebas realizadas en Delphi 7.

1 comentario:

WonDer_Boy dijo...

Muy buena la explicacion. Gracias !!!

Publicidad