Anda di halaman 1dari 11

Operaciones con cadenas de texto (I) Delphi posee un amplio repertorio de funciones para el anlisis y manipulacin de cadenas de texto

que nos harn la vida mucho ms fcil una vez las conozcamos. Comencemos con ellas: function AnsiCompareStr( const S1, S2: string ): Integer; Esta funcin compara dos cadenas de texto carcter a carcter y nos dice si son iguales (diferencia maysculas y minsculas). Si ambas cadenas son iguales devuelve un cero. Devolver un 1 si la cadena S1 es superior a la cadena S2 y devuelve un -1 si la cadena S1 es inferior a la cadena S2. Veamos un ejemplo: AnsiCompareStr( 'HOLA', 'HOLA' ) devuelve 0 AnsiCompareStr( 'HOLA', 'HOLa' ) devuelve 1 AnsiCompareStr( 'HOLa', 'HOLA' ) devuelve -1 Cuando se considera una cadena de texto superior a otra? Pues el orden es el siguiente: Letras maysculas > Letras minsculas Letras minsculas > Nmeros function AnsiCompareText( const S1, S2: string ): Integer; Esta funcin es similar a AnsiCompareStr a diferencia de que no distingue entre maysculas y minsculas. En el caso anterior: AnsiCompareText( 'HOLA', 'HOLA' ) devuelve 0 AnsiCompareText( 'HOLA', 'HOLa' ) devuelve 0 AnsiCompareText( 'HOLa', 'HOLA' ) devuelve 0 AnsiCompareText( 'HOLA', 'HOLLA' ) devuelve -1 AnsiCompareText( 'HOLLA', 'HOLA' ) devuelve 1 El orden entre cadenas se define por: Letras > Nmeros function AnsiContainsStr( const AText, ASubText: string ): Boolean; Comprueba si la cadena ASubText esta dentro de la cadena AText. Por ejemplo: AnsiContainsStr( 'DELPHI AL LIMITE', 'LIMITE' ) devuelve True AnsiContainsStr( 'DELPHI AL LIMITE', 'LIMITe' ) devuelve False function AnsiContainsText( const AText, ASubText: string ): Boolean; Esta funcin es igual a AnsiConstainsStr salvo que no diferencia maysculas de minsculas. Veamos un ejemplo: AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITE' ) devuelve True

AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITe' ) devuelve True AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITES' ) devuelve False function AnsiEndsStr( const ASubText, AText: string ): Boolean; La funcin nos devuelve True si la cadena AText termina en la cadena ASubText. He aqu un ejemplo: AnsiEndsStr( '.avi', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve True AnsiEndsStr( '.AVI', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve False Para este caso es mejor utilizar la funcin: function AnsiEndsText( const ASubText, AText: string ): Boolean; Esta funcin obtiene el mismo resultado que AnsiEndsStr pero sin diferenciar maysculas de minsculas. En el caso anterior: AnsiEndsText( '.avi', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve True AnsiEndsText( '.AVI', 'C:\Archivos de programa\Emule\Incoming\pelicula.avi' ) devuelve True Operaciones con cadenas de texto (II) Continuamos viendo funciones para manejo de cadenas de caracteres: function AnsiIndexStr( const AText: string; const AValues: array of string ): Integer; Esta funcin comprueba si alguna de las cadenas contenidas en el array AValues coincide extactamente con la cadena AText (distingue maysculas y minsculas). Si la encuentra nos devuelve el nmero de ndice del array donde se encuentra (empieza por cero), en caso contrario nos devuelve -1. Por ejemplo: AnsiIndexStr( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve 2 AnsiIndexStr( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve -1 Como vemos en el primer ejemplo nos dice que JUAN se encuentra en la posicin 2 del array. Sin embargo en el sedungo ejemplo devuelve -1 porque JUANes distinto de Juan. function AnsiIndexText( const AText: string; const AValues: array of string ): Integer; Funciona exactamente igual que la funcin AnsiIndexStr salvo que no distingue maysculas y minsculas. Segn el ejemplo anterior ambas llamadas a la funcin devuelven idntico resultado:

AnsiIndexText( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve 2 AnsiIndexText( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve 2 function AnsiLeftStr( const AText: AnsiString; const ACount: Integer ): AnsiString; Esta funcin devuelve la parte izquierda de la cadena AText segn el nmero de caracteres que le indiquemos en ACount. Sera algo as: AnsiLeftStr( 'PROGRAMANDO CON DELPHI', 6 ) devuelve PROGRA AnsiLeftStr( 'PROGRAMANDO CON DELPHI', 11 ) devuelve PROGRAMANDO AnsiLeftStr( 'PROGRAMANDO CON DELPHI', 18 ) devuelve PROGRAMANDO CON DE function AnsiLowerCase( const S: string ): string; Devuelve la cadena S convertida toda en minsculas (si tiene letras, naturalmente). Veamos un par de ejemplos: AnsiLowerCase( 'Programando con Delphi' ) devuelve: programando con delphi AnsiLowerCase( 'MANIPULANDO CADA CARCTER DE LA CADENA' ) devuelve: manipulando cada carcter de la cadena Como vemos nos ha respetado la tlde en la palabra carcter. function AnsiMatchStr( const AText: string; const AValues: array of string ): Boolean; Esta funcin nos dice si alguna de las cadenas contenidas en el array AValues coincide exactamente con la cadena AText (comprobando maysculas y minsculas). Aunque esta funcin pueda parecer igual a AnsiIndexStr se diferencia en que slo responde True o False si la encontrado o no, al contrario que AnsiIndexStr que nos devuelve que la posicin donde la ha encontrado. Con un ejemplo se ve mas claro: AnsiMatchStr( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve True AnsiMatchStr( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve False Nota: La ayuda de Delphi 7 dice que esta funcin devuelve un Integer y realmente devuelve un Boolean, ser un error de documentacin (ya estamos acostumbrados a la 'magnfica' documentacin de Borland). En cambio si est corregido en la funcin: function AnsiMatchText( const AText: string; const AValues: array of string ): Boolean;

Similar a la funcin anterior AnsiMatchStr pero sin diferenciar maysculas y minsculas. Siguiendo el mismo ejemplo: AnsiMatchText( 'JUAN', ['CARLOS','PABLO','JUAN','ROSA'] ) devuelve True AnsiMatchText( 'JUAN', ['CARLOS','PABLO','Juan','ROSA'] ) devuelve True function AnsiMidStr( const AText: AnsiString; const AStart, ACount: Integer ): AnsiString; Devuelve un trozo de la cadena AText cuya posicin comienza en AStart (el primer elemento es el 1) y cuyo nmero de caracteres viene determinado porACount. Por ejemplo: AnsiMidStr( 'PROGRAMANDO CON DELPHI', 7, 5 ) devuelve MANDO AnsiMidStr( 'PROGRAMANDO CON DELPHI', 17, 6 ) devuelve DELPHI function AnsiPos( const Substr, S: string ): Integer; Devuelve la posicin de la cadena Substr que est dentro de la cadena S. Si no la encuentra devuelve un cero (el primer elemento comienza por 1). Tambin distingue entre maysculas y minsculas. Veamos como funciona: AnsiPos( 'PALABRA', 'BUSCANDO UNA PALABRA' ) devuelve 14 AnsiPos( 'Palabra', 'BUSCANDO UNA PALABRA' ) devuelve 0 function AnsiReplaceStr( const AText, AFromText, AToText: string ): string; Esta funcin nos devuelve la cadena AText reemplazando las palabras que contenga segn la variable AFromText sustituyndolas por AToText. Tiene encuentra maysculas y minsculas: AnsiReplaceStr( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'TEXTO', 'UNA PALABRA' ) devuelve: CORRIGIENDO UNA PALABRA DENTRO DE UNA FRASE AnsiReplaceStr( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'Texto', 'UNA PALABRA' ) devuelve: CORRIGIENDO TEXTO DENTRO DE UNA FRASE Como vemos en el segundo ejemplo al no encontrar Texto por contener minsculas ha dejado la frase como estaba. function AnsiReplaceText( const AText, AFromText, AToText: string ): string; Igual a la funcin AnsiReplaceStr sin distinguir maysculas y minsculas: AnsireplaceText( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'TEXTO', 'UNA PALABRA' ) devuelve:

CORRIGIENDO UNA PALABRA DENTRO DE UNA FRASE AnsireplaceText( 'CORRIGIENDO TEXTO DENTRO DE UNA FRASE', 'Texto', 'UNA PALABRA' ) devuelve: CORRIGIENDO UNA PALABRA DENTRO DE UNA FRASE Operaciones con cadenas de texto (III) Seguimos con funciones para manejo de cadenas de caracteres: function AnsiReverseString( const AText: AnsiString ): AnsiString; Esta funcin devuelve la cadena AText con los caracteres invertidos (de derecha a izquierda). Por ejemplo: AnsiReverseString( 'Al revs' ) devuelve: sver lA AnsiReverseString( 'INVIRTIENDO UNA CADENA DE TEXTO' ) devuelve: OTXET ED ANEDAC ANU ODNEITRIVNI function AnsiRightStr( const AText: AnsiString; const ACount: Integer ): AnsiString; Esta funcin devuelve la parte derecha de la cadena AText segn el nmero de caracteres que le indiquemos en ACount. Por ejemplo: AnsiRightStr( 'PROGRAMANDO CON DELPHI', 6 ) devuelve DELPHI AnsiRightStr( 'PROGRAMANDO CON DELPHI', 11 ) devuelve CON DELPHI AnsiRightStr( 'PROGRAMANDO CON DELPHI', 18 ) devuelve RAMANDO CON DELPHI function AnsiStartsStr( const ASubText, AText: string ): Boolean; Devuelve True si la cadena ASubText est al comienzo de la cadena AText (distingue maysculas y minsculas). Veamos como funciona: AnsiStartsStr( 'C:\', 'C:\Mis documentos\' ) devuelve True AnsiStartsStr( 'c:\', 'C:\Mis documentos\' ) devuelve False function AnsiStartsText( const ASubText, AText: string ): Boolean; Esta funcin es igual a AnsiStartsStr salvo que no distingue maysculas de minsculas. En el caso anterior:

AnsiStartsText( 'C:\', 'C:\Mis documentos\' ) devuelve True AnsiStartsText( 'c:\', 'C:\Mis documentos\' ) devuelve True function AnsiUpperCase( const S: string ): string; Devuelve la cadena S convertida toda en maysculas. Veamos un par de ejemplos: AnsiUpperCase( 'Programando con Delphi' ) devuelve: PROGRAMANDO CON DELPHI AnsiUpperCase( 'manipulando cada carcter de la cadena' ) devuelve: MANIPULANDO CADA CARCTER DE LA CADENA procedure AppendStr( var Dest: string; const S: string ); deprecated; Este procedimiento esta obsoleto. Aade a la cadena Dest el contenido dela cadena S. Utilizar en su lugar el operador + o la funcin Contat. function CompareStr( const S1, S2: string ): Integer; Compara las cadenas de texto S1 y S2 y devuelve cero si son iguales. Si son distintas devuelve un nmero positivo o negativo segn la diferencia de caracteres. La operacin de diferencia de caracteres se realiza a nivel de cada carcter utilizando su valor equivalente en ASCII. Por ejemplo: CompareStr( 'HOLA', 'HOLA' ) devuelve 0 CompareStr( 'HOLA', 'HOLa' ) devuelve -32 CompareStr( 'HOLa', 'HOLA' ) devuelve 32 CompareStr( 'HOLA', 'HOYA' ) devuelve -13 Esta funcin esta obsoleta. Se recomienda utilizar AnsiCompareStr en su lugar. function CompareText( const S1, S2: string ): Integer; Similar a la funcin CompareStr pero sin tener en cuenta maysculas y minsculas. Segn el ejemplo anterior: CompareText( 'HOLA', 'HOLA' ) devuelve 0 CompareText( 'HOLA', 'HOLa' ) devuelve 0 CompareText( 'HOLa', 'HOLA' ) devuelve 0 CompareText( 'HOLA', 'HOYA' ) devuelve -13 Esta funcin esta obsoleta. Se recomienda utilizar AnsiCompareText en su lugar. function Concat( s1 [, s2,..., sn]: string ): string; Esta funcin devuelve concatenadas un nmero indeterminado de cadenas de texto que

le pasemos como parmetro, aunque se recomienda utilizar el operador + en su lugar. Veamos un ejemplo: Concat( '12', '34', '56', '78' ) devuelve 12345678 Concat( 'COMO', ' ESTN', ' USTEDES' ) devuelve COMO ESTN USTEDES function Copy( S; Index, Count: Integer ): string; function Copy( S; Index, Count: Integer ): array; Ambas funciones devuelven una subcadena de la cadena S en la posicin Index (el primer elemento es 1) y con una longitud de Count. Por ejemplo: Copy( '123456', 1, 3 ) devuelve 123 Copy( '123456', 4, 2 ) devuelve 45 Copy( 'CAPTURANDO UNA PALABRA', 16, 7 ) devuelve PALABRA Tambin puede utilizarse para copiar elementos entre arrays de cualquier tipo. Por ejemplo vamos a crear un array de enteros y vamos a copiar una parte del mismo a otro: var Origen, Destino: array of Integer; i: Integer; begin SetLength( Origen, 6 ); Origen[0] := 10; Origen[1] := 20; Origen[2] := 30; Origen[3] := 40; Origen[4] := 50; Origen[5] := 60; Destino := Copy( Origen, 2, 4 ); for i := 0 to Length( Destino ) - 1 do Memo.Lines.Add( Format( 'Destino[%d]=%d', [i,Destino[i]] ) ); end; El resultado lo hemos volcado a pantalla dentro de un campo Memo mostrando lo siguiente: Destino[0]=30 Destino[1]=40 Destino[2]=50 Destino[3]=60 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 nmero de

caracteres situados en la posicin 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 funcin 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 ms alto de un tipo de variable. Vamos a ver un ejemplo que utiliza esta funcin 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 sera: 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 posicin 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 funcin nos devuelve la posicin 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 funcin sera muy interesante para crear un parser de cdigo fuente HTML buscando delimitadores <>. function Length( S ): Integer; Devuelve la longitud mxima 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 mostrara los valores 4 para la cadena HOLA y el valor 3, que es la longitud del array dinmico. function LowerCase( const S: string ): string;

Convierte los caracteres de la cadena S a minsculas. Se recomenda utilizar en su lugar la funcin AnsiLowerCase para caracteres internacionales de 8 bits. Por ejemplo: LowerCase( 'Programando con Delphi' ) devuelve: programando con delphi LowerCase( 'MANIPULANDO CADA CARCTER DE LA CADENA' ) manipulando cada carcter de la cadena Como vemos en este ltimo ejemplo la palabra CARCTER ha dejado la en maysculas. Por ello se recomienda utilizar la funcin AnsiLowerCase para evitar estas incidencias. procedure Move( const Source; var Dest; Count: Integer ); Este procedimiento (que debera llamarse quizs 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 sera: --TEXTO------function Pos( Substr: string; S: string ): Integer; Devuelve la posicin de la cadena Substr dentro de la cadena S (Distingue maysculas de minsculas). 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 informacin 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 sera: sUnidad=C sDirectorio=\Archivos de programa\MSN Messenger sArchivo=msnmsgr.exe