Una clase string para delphi
Una clase string que incapsulates varias funciones de cadena
he hecho esta pequeña clase string basando me en QStrings y FastStrings, por lo tanto esta clase es rápido y controla varias funciones de cadena. BTW, a fin de compilar y utilizar esta clase tendrá FastStrings (usted puede obtener una copia en Peter Morris página de inicio).
¿por Qué hacer una cadena de clase? bien, aunque esta clase carece de sobrecarga de operadores necesito, y pensó que alguien migth beneficio de la misma.
ACTUALIZACIÓN: se ha Añadido caso sensibles StartsWith y EndsWith
CORREGIDO : Errores en la Izquierda, a la Derecha, más Rápido conteo de palabras (copiada de QStrings)
unidad IMLCommon
interfaz
usos
& nbsp & nbsp SysUtils, Clases
tipo
& nbsp & nbsp TCharSet = Set Char
& nbsp & nbsp TString = clase
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp de Búfer: AnsiString
& nbsp & nbsp & nbsp & nbsp FWordSeparators: TCharset
& nbsp & nbsp & nbsp & nbsp función GetLength: Integer
& nbsp & nbsp & nbsp & nbsp función GetRefCount: Integer
& nbsp & nbsp & nbsp & nbsp función GetCharacter(const Index: Integer): Char
& nbsp & nbsp & nbsp & nbsp función GetWordSeparators: TCharSet
& nbsp & nbsp & nbsp & nbsp función GetAsPChar: PChar
& nbsp & nbsp & nbsp & nbsp función GetAsInteger: Integer
& nbsp & nbsp & nbsp & nbsp función GetAsWord: La palabra
& nbsp & nbsp & nbsp & nbsp función GetWordCount: Integer
& nbsp & nbsp & nbsp & nbsp procedimiento SetLength(const Valor: Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetCharacter(const Índice: Integer const Valor: Char)
& nbsp & nbsp & nbsp & nbsp procedimiento SetWordSeparators(const Valor: TCharSet)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAsPChar(const Valor: PChar)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAsInteger(const Valor: Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAsWord(const Valor: Word)
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp función FindEx(Const Subcadena: Cadena const distingue mayúsculas de minúsculas: Boolean = True
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const StartPos: Integer = 1 const ForwardSearch: Boolean = True): Integer
& nbsp & nbsp & nbsp & nbsp función InternalInteger(var Variable: Integer const HighBound, LowBound: Integer): Boolean
& nbsp & nbsp & nbsp & nbsp función InternalWord(Const Index: Integer): Cadena
& nbsp & nbsp público
& nbsp & nbsp & nbsp & nbsp función a la Izquierda(Count: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp función Rigth(Count: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp función Media(const AStart, Cuenta: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp función en Mayúsculas: Cadena
& nbsp & nbsp & nbsp & nbsp función en Minúsculas: Cadena
& nbsp & nbsp & nbsp & nbsp función IsEmpty: Boolean
& nbsp & nbsp & nbsp & nbsp función StartsWith(const AString:Cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Const distingue mayúsculas de minúsculas: Boolean = False): Boolean
& nbsp & nbsp & nbsp & nbsp función EndsWith(const AString: Cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean = False): Boolean
& nbsp & nbsp & nbsp & nbsp función (Const Subcadena: Cadena const StartPos: Integer = 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean = True): Integer
& nbsp & nbsp & nbsp & nbsp función FindRev(Const Subcadena: Cadena const StartPos: Integer = -1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean = True): Integer
& nbsp & nbsp & nbsp & nbsp función Contiene(const Subcadena: Cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean = True): Boolean
& nbsp & nbsp & nbsp & nbsp función IsNumber: Boolean
& nbsp & nbsp & nbsp & nbsp función Append(const Valor: Cadena): Cadena
& nbsp & nbsp & nbsp & nbsp función Prepend(const Valor: Cadena): Cadena
& nbsp & nbsp & nbsp & nbsp función Remove(const Índice, Longitud: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp procedimiento Truncar(const NewLength: Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento de Relleno(const fue acán: Char NewLength: Integer = -1)
& nbsp & nbsp & nbsp & nbsp procedimiento Insert(const Index: Integer const AString: Cadena)
& nbsp & nbsp & nbsp & nbsp propiedad Contenido: Cadena de Leer Búfer de Escribe Buffer
& nbsp & nbsp & nbsp & nbsp propiedad Recuente:Integer leer GetRefCount
& nbsp & nbsp & nbsp & nbsp propiedad Caracteres[Const Índice: Integer]: Char leer GetCharacter escribe SetCharacter por defecto
& nbsp & nbsp & nbsp & nbsp propiedad Palabras[Const Índice: Integer]: Cadena de leer InternalWord
& nbsp & nbsp & nbsp & nbsp propiedad conteo de palabras: Integer leer GetWordCount
& nbsp & nbsp & nbsp & nbsp propiedad Longitud: Integer leer GetLength escribe SetLength
& nbsp & nbsp & nbsp & nbsp propiedad WordSeparators: TCharSet leer GetWordSeparators escribe SetWordSeparators
& nbsp & nbsp & nbsp & nbsp propiedad AsPChar: PChar leer GetAsPChar escribe SetAsPChar
& nbsp & nbsp & nbsp & nbsp propiedad AsInteger: Integer leer GetAsInteger escribe SetAsInteger
& nbsp & nbsp & nbsp & nbsp propiedad Espada: La palabra leer GetAsWord escribe SetAsWord
& nbsp & nbsp fin
aplicación
usos
& nbsp & nbsp {JclStrings,} FastStrings
{ TString }
función TString.EndsWith(const AString: Cadena
& nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean): Boolean
begin
& nbsp & nbsp si distingue mayúsculas de minúsculas
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameStr(AString, Rigth(del Sistema.Longitud(AString)))
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameText(AString,Rigth(del Sistema.Longitud(AString)))
fin
función TString.FindEx(const Subcadena: Cadena
& nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean const StartPos: Integer
& nbsp & nbsp const ForwardSearch: Boolean): Integer
begin
& nbsp & nbsp Resultado := SmartPos(Subcadena, Búfer, distingue mayúsculas de minúsculas, StartPos, ForwardSearch)
fin
procedimiento TString.De relleno(const fue acán: Char NewLength: Integer)
begin
& nbsp & nbsp si (NewLength < 0)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si Longitud > 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FillChar(Buffer[1], Longitud, ord(Encontrar))
& nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FillChar(Buffer[1], 1, ord(Encontrar))
& nbsp & nbsp fin
& nbsp & nbsp else
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp SetLength(NewLength)
& nbsp & nbsp & nbsp & nbsp FillChar(Buffer[1], Longitud, ord(Encontrar))
& nbsp & nbsp fin
fin
función TString.Encontrar(const Subcadena: Cadena const StartPos: Integer
& nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean): Integer
begin
& nbsp & nbsp Resultado := FindEx(Subcadena, distingue mayúsculas de minúsculas, StartPos)
fin
función TString.FindRev(const Subcadena: Cadena const StartPos: Integer
& nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean): Integer
var
& nbsp & nbsp RealStartPos: Integer
begin
& nbsp & nbsp si StartPos < 0 RealStartPos := Longitud de persona RealStartPos := StartPos
& nbsp & nbsp Resultado := FindEx(Subcadena, distingue mayúsculas de minúsculas, RealStartPos, False)
fin
función TString.GetAsPChar: PChar
begin
& nbsp & nbsp Resultado := PChar(Buffer)
fin
función TString.GetCharacter(const Index: Integer): Char
begin
& nbsp & nbsp si IsEmpty o (Índice > Longitud)
& nbsp & nbsp & nbsp & nbsp Resultado := #0
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := Buffer[Índice]
fin
función TString.GetLength: Integer
var
& nbsp & nbsp P: Puntero
begin
& nbsp & nbsp Resultado := 0
& nbsp & nbsp si Puntero(Buffer) <> nil then
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp P := Puntero(Entero(Puntero(Buffer)) - 4)
& nbsp & nbsp & nbsp & nbsp Resultado := Integer(P^) y (no $80000000 shr 1)
& nbsp & nbsp fin
fin
función TString.IsEmpty: Boolean
begin
& nbsp & nbsp Resultado := (Longitud = 0)
fin
función TString.A la izquierda(Count: Integer): Cadena
begin
& nbsp & nbsp si Cuenta > Longitud
& nbsp & nbsp & nbsp & nbsp Resultado := Buffer
& nbsp & nbsp else begin
& nbsp & nbsp & nbsp & nbsp del Sistema.SetLength(Resultado, Count)
& nbsp & nbsp & nbsp & nbsp Mover(Buffer[1],Resultado[1],Count)
& nbsp & nbsp fin
fin
función TString.En minúsculas: Cadena
begin
& nbsp & nbsp Resultado := SysUtils.Minúsculas( Buffer )
fin
función TString.Mid(const AStart, Cuenta: Integer): Cadena
begin
& nbsp & nbsp Resultado := Copy(Buffer, AStart, ACount)
fin
función TString.Rigth(Count: Integer): Cadena
begin
& nbsp & nbsp si Cuenta > Longitud
& nbsp & nbsp & nbsp & nbsp Resultado := '
& nbsp & nbsp else begin
& nbsp & nbsp & nbsp & nbsp del Sistema.SetLength(Resultado, Count)
& nbsp & nbsp & nbsp & nbsp Mover(Buffer[Longitud(Count-1)],Resultado[1],Conde)
& nbsp & nbsp fin
fin
procedimiento TString.SetAsPChar(const Valor: PChar)
begin
& nbsp & nbsp de Búfer := Valor
fin
procedimiento TString.SetCharacter(const Index: Integer const Valor: Char)
begin
& nbsp & nbsp si no IsEmpty
& nbsp & nbsp & nbsp & nbsp si (Índice < Longitud) y (<> GetCharacter(Índice))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Buffer[Índice] := Valor
fin
procedimiento TString.SetLength(const Valor: Integer)
begin
& nbsp & nbsp del Sistema.SetLength( Buffer, Valor )
fin
función TString.StartsWith(const AString: Cadena
& nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean): Boolean
begin
& nbsp & nbsp si distingue mayúsculas de minúsculas
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameStr(AString, a la Izquierda(el Sistema.Longitud(AString)))
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameText(AString,a la Izquierda(el Sistema.Longitud(AString)))
fin
procedimiento TString.Truncar(const NewLength: Integer)
begin
& nbsp & nbsp Longitud := NewLength
fin
función TString.Mayúsculas: Cadena
begin
& nbsp & nbsp Resultado := SysUtils.Mayúsculas( Buffer )
fin
función TString.Contiene(const Subcadena: Cadena
& nbsp & nbsp const distingue mayúsculas de minúsculas: Boolean): Boolean
begin
& nbsp & nbsp Resultado := Encontrar(Subcadena, 1, distingue mayúsculas de minúsculas) > 0
fin
procedimiento TString.Insertar(const Index: Integer const AString: Cadena)
begin
& nbsp & nbsp del Sistema.Insertar(AString, Búfer de Índice)
fin
función TString.Append(const Valor: Cadena): Cadena
begin
& nbsp & nbsp Insert(Longitud, Valor)
& nbsp & nbsp Resultado := Buffer
fin
función TString.Prepend(const Valor: Cadena): Cadena
begin
& nbsp & nbsp Insert(1, Valor)
& nbsp & nbsp Resultado := Buffer
fin
función TString.Quitar(const Índice, Longitud: Integer): Cadena
begin
& nbsp & nbsp Resultado := Buffer
& nbsp & nbsp Eliminar(Resultado, el Índice de Longitud)
fin
función TString.IsNumber: Boolean
var
& nbsp & nbsp i: Integer
begin
& nbsp & nbsp Resultado := True
& nbsp & nbsp para i := 1 al Duración
& nbsp & nbsp & nbsp & nbsp si no (GetCharacter(i) en ['0'..'9', ' ','-','.'])
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := False
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp & nbsp & nbsp fin
fin
función TString.InternalInteger(var Variable: Integer const HighBound,
& nbsp & nbsp LowBound: Integer): Boolean
var
& nbsp & nbsp ErrorCode: Integer
begin
& nbsp & nbsp Resultado := False
& nbsp & nbsp si IsEmpty o IsNumber entonces Salir
& nbsp & nbsp Val(Buffer, Variable, ErrorCode)
& nbsp & nbsp Resultado := (Errorcode = 0) y ((Variable >= LowBound) y (Variable <= HighBound))
fin
función TString.GetAsInteger: Integer
begin
& nbsp & nbsp InternalInteger(Resultado, Alta(Entero), Bajo(Entero))
fin
procedimiento TString.SetAsInteger(const Valor: Integer)
begin
& nbsp & nbsp Str(Valor, Buffer)
fin
función TString.GetAsWord: Word
var
& nbsp & nbsp Tmp: Integer
begin
& nbsp & nbsp si InternalInteger(Tmp, 0, 65535)
& nbsp & nbsp & nbsp & nbsp Resultado := Tmp
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := 0
fin
procedimiento TString.SetAsWord(const Valor: Word)
begin
& nbsp & nbsp Str(Valor, Buffer)
fin
función TString.GetWordSeparators: TCharSet
begin
& nbsp & nbsp Resultado := FWordSeparators
fin
procedimiento TString.SetWordSeparators(const Valor: TCharSet)
begin
& nbsp & nbsp si FWordSeparators < >
& nbsp & nbsp & nbsp & nbsp FWordSeparators := Valor
fin
función TString.InternalWord(const Index: Integer): Cadena
var
& nbsp & nbsp I,J,N: Integer
& nbsp & nbsp L: LongWord
& nbsp & nbsp P: PChar
& nbsp & nbsp: Boolean
begin
& nbsp & nbsp si (Índice <= 0) entonces Salir
& nbsp & nbsp L := Longitud
& nbsp & nbsp P := Puntero(Buffer)
& nbsp & nbsp R := False
& nbsp & nbsp N := 1
& nbsp & nbsp para I := 1 al L
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si no (P^ en WordSeparators)
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si no
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si N = Índice de luego
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp N := L 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inc(P)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para J := I 1 al L
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si P^ en WordSeparators
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp N := J
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inc(P)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Copy(Buffer,I,N-I)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp := True
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inc(N)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp else if
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp a := False
& nbsp & nbsp & nbsp & nbsp Inc(P)
& nbsp & nbsp fin
& nbsp & nbsp Resultado := '
fin
función TString.GetWordCount: Integer
& nbsp & nbsp función CountOfWords(const : cadena const Delimitadores: TCharSet): Integer
& nbsp & nbsp asm
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PUSH EBX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TEST EAX,EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JE @@q0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MOV ECX,[EAX 4]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MOV EBX,EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JS @@qz
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PUSH ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp XOR EAX,EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JMP @@lp2
@@iw: INC EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JS @@ex
@@lp1: MOVZX ESI,BYTE PTR [EBX ECX]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp BT [EDX],ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JC @@nx
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JNS @@lp1
@@ex: POP ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp POP EBX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RET
@@lp2: MOVZX ESI,BYTE PTR [EBX ECX]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp BT [EDX],ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JNC @@iw
@@nx: DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JNS @@lp2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp POP ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp POP EBX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RET
@@qz: XOR EAX,EAX
@@q0: POP EBX
& nbsp & nbsp fin
begin
& nbsp & nbsp si IsEmpty
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := 0
& nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp fin
& nbsp & nbsp Resultado := CountOfWords(Buffer, FWordSeparators)
fin
función TString.GetRefCount: Integer
var
& nbsp & nbsp P: Puntero
begin
& nbsp & nbsp Resultado := 0
& nbsp & nbsp si Puntero(Buffer) <> nil then
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp P := Puntero(Entero(Puntero(Buffer)) - 8)
& nbsp & nbsp & nbsp & nbsp Resultado := Integer(P^)
& nbsp & nbsp fin
fin
fin.
Una clase string para delphi
Una clase string para delphi : Multi-millones de consejos para hacer su vida mas facil.
Una clase string que incapsulates varias funciones de cadena
he hecho esta pequeña clase string basando me en QStrings y FastStrings, por lo tanto esta clase es rapido y controla varias funciones de cadena. BTW, a fin de compilar y utilizar esta clase tendra FastStrings (usted puede obtener una copia en Peter Morris pagina de inicio).
¿por Que hacer una cadena de clase? bien, aunque esta clase carece de sobrecarga de operadores necesito, y penso que alguien migth beneficio de la misma.
ACTUALIZACION: se ha Añadido caso sensibles StartsWith y EndsWith
CORREGIDO : Errores en la Izquierda, a la Derecha, mas Rapido conteo de palabras (copiada de QStrings)
unidad IMLCommon
interfaz
usos
& nbsp & nbsp SysUtils, Clases
tipo
& nbsp & nbsp TCharSet = Set Char
& nbsp & nbsp TString = clase
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp de Bufer: AnsiString
& nbsp & nbsp & nbsp & nbsp FWordSeparators: TCharset
& nbsp & nbsp & nbsp & nbsp funcion GetLength: Integer
& nbsp & nbsp & nbsp & nbsp funcion GetRefCount: Integer
& nbsp & nbsp & nbsp & nbsp funcion GetCharacter(const Index: Integer): Char
& nbsp & nbsp & nbsp & nbsp funcion GetWordSeparators: TCharSet
& nbsp & nbsp & nbsp & nbsp funcion GetAsPChar: PChar
& nbsp & nbsp & nbsp & nbsp funcion GetAsInteger: Integer
& nbsp & nbsp & nbsp & nbsp funcion GetAsWord: La palabra
& nbsp & nbsp & nbsp & nbsp funcion GetWordCount: Integer
& nbsp & nbsp & nbsp & nbsp procedimiento SetLength(const Valor: Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetCharacter(const Indice: Integer const Valor: Char)
& nbsp & nbsp & nbsp & nbsp procedimiento SetWordSeparators(const Valor: TCharSet)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAsPChar(const Valor: PChar)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAsInteger(const Valor: Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAsWord(const Valor: Word)
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp funcion FindEx(Const Subcadena: Cadena const distingue mayusculas de minusculas: Boolean = True
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const StartPos: Integer = 1 const ForwardSearch: Boolean = True): Integer
& nbsp & nbsp & nbsp & nbsp funcion InternalInteger(var Variable: Integer const HighBound, LowBound: Integer): Boolean
& nbsp & nbsp & nbsp & nbsp funcion InternalWord(Const Index: Integer): Cadena
& nbsp & nbsp publico
& nbsp & nbsp & nbsp & nbsp funcion a la Izquierda(Count: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp funcion Rigth(Count: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp funcion Media(const AStart, Cuenta: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp funcion en Mayusculas: Cadena
& nbsp & nbsp & nbsp & nbsp funcion en Minusculas: Cadena
& nbsp & nbsp & nbsp & nbsp funcion IsEmpty: Boolean
& nbsp & nbsp & nbsp & nbsp funcion StartsWith(const AString:Cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Const distingue mayusculas de minusculas: Boolean = False): Boolean
& nbsp & nbsp & nbsp & nbsp funcion EndsWith(const AString: Cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayusculas de minusculas: Boolean = False): Boolean
& nbsp & nbsp & nbsp & nbsp funcion (Const Subcadena: Cadena const StartPos: Integer = 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayusculas de minusculas: Boolean = True): Integer
& nbsp & nbsp & nbsp & nbsp funcion FindRev(Const Subcadena: Cadena const StartPos: Integer = -1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayusculas de minusculas: Boolean = True): Integer
& nbsp & nbsp & nbsp & nbsp funcion Contiene(const Subcadena: Cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp const distingue mayusculas de minusculas: Boolean = True): Boolean
& nbsp & nbsp & nbsp & nbsp funcion IsNumber: Boolean
& nbsp & nbsp & nbsp & nbsp funcion Append(const Valor: Cadena): Cadena
& nbsp & nbsp & nbsp & nbsp funcion Prepend(const Valor: Cadena): Cadena
& nbsp & nbsp & nbsp & nbsp funcion Remove(const Indice, Longitud: Integer): Cadena
& nbsp & nbsp & nbsp & nbsp procedimiento Truncar(const NewLength: Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento de Relleno(const fue acan: Char NewLength: Integer = -1)
& nbsp & nbsp & nbsp & nbsp procedimiento Insert(const Index: Integer const AString: Cadena)
& nbsp & nbsp & nbsp & nbsp propiedad Contenido: Cadena de Leer Bufer de Escribe Buffer
& nbsp & nbsp & nbsp & nbsp propiedad Recuente:Integer leer GetRefCount
& nbsp & nbsp & nbsp & nbsp propiedad Caracteres[Const Indice: Integer]: Char leer GetCharacter escribe SetCharacter por defecto
& nbsp & nbsp & nbsp & nbsp propiedad Palabras[Const Indice: Integer]: Cadena de leer InternalWord
& nbsp & nbsp & nbsp & nbsp propiedad conteo de palabras: Integer leer GetWordCount
& nbsp & nbsp & nbsp & nbsp propiedad Longitud: Integer leer GetLength escribe SetLength
& nbsp & nbsp & nbsp & nbsp propiedad WordSeparators: TCharSet leer GetWordSeparators escribe SetWordSeparators
& nbsp & nbsp & nbsp & nbsp propiedad AsPChar: PChar leer GetAsPChar escribe SetAsPChar
& nbsp & nbsp & nbsp & nbsp propiedad AsInteger: Integer leer GetAsInteger escribe SetAsInteger
& nbsp & nbsp & nbsp & nbsp propiedad Espada: La palabra leer GetAsWord escribe SetAsWord
& nbsp & nbsp fin
aplicacion
usos
& nbsp & nbsp {JclStrings,} FastStrings
{ TString }
funcion TString.EndsWith(const AString: Cadena
& nbsp & nbsp const distingue mayusculas de minusculas: Boolean): Boolean
begin
& nbsp & nbsp si distingue mayusculas de minusculas
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameStr(AString, Rigth(del Sistema.Longitud(AString)))
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameText(AString,Rigth(del Sistema.Longitud(AString)))
fin
funcion TString.FindEx(const Subcadena: Cadena
& nbsp & nbsp const distingue mayusculas de minusculas: Boolean const StartPos: Integer
& nbsp & nbsp const ForwardSearch: Boolean): Integer
begin
& nbsp & nbsp Resultado := SmartPos(Subcadena, Bufer, distingue mayusculas de minusculas, StartPos, ForwardSearch)
fin
procedimiento TString.De relleno(const fue acan: Char NewLength: Integer)
begin
& nbsp & nbsp si (NewLength < 0)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si Longitud > 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FillChar(Buffer[1], Longitud, ord(Encontrar))
& nbsp & nbsp & nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FillChar(Buffer[1], 1, ord(Encontrar))
& nbsp & nbsp fin
& nbsp & nbsp else
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp SetLength(NewLength)
& nbsp & nbsp & nbsp & nbsp FillChar(Buffer[1], Longitud, ord(Encontrar))
& nbsp & nbsp fin
fin
funcion TString.Encontrar(const Subcadena: Cadena const StartPos: Integer
& nbsp & nbsp const distingue mayusculas de minusculas: Boolean): Integer
begin
& nbsp & nbsp Resultado := FindEx(Subcadena, distingue mayusculas de minusculas, StartPos)
fin
funcion TString.FindRev(const Subcadena: Cadena const StartPos: Integer
& nbsp & nbsp const distingue mayusculas de minusculas: Boolean): Integer
var
& nbsp & nbsp RealStartPos: Integer
begin
& nbsp & nbsp si StartPos < 0 RealStartPos := Longitud de persona RealStartPos := StartPos
& nbsp & nbsp Resultado := FindEx(Subcadena, distingue mayusculas de minusculas, RealStartPos, False)
fin
funcion TString.GetAsPChar: PChar
begin
& nbsp & nbsp Resultado := PChar(Buffer)
fin
funcion TString.GetCharacter(const Index: Integer): Char
begin
& nbsp & nbsp si IsEmpty o (Indice > Longitud)
& nbsp & nbsp & nbsp & nbsp Resultado := #0
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := Buffer[Indice]
fin
funcion TString.GetLength: Integer
var
& nbsp & nbsp P: Puntero
begin
& nbsp & nbsp Resultado := 0
& nbsp & nbsp si Puntero(Buffer) <> nil then
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp P := Puntero(Entero(Puntero(Buffer)) - 4)
& nbsp & nbsp & nbsp & nbsp Resultado := Integer(P^) y (no $80000000 shr 1)
& nbsp & nbsp fin
fin
funcion TString.IsEmpty: Boolean
begin
& nbsp & nbsp Resultado := (Longitud = 0)
fin
funcion TString.A la izquierda(Count: Integer): Cadena
begin
& nbsp & nbsp si Cuenta > Longitud
& nbsp & nbsp & nbsp & nbsp Resultado := Buffer
& nbsp & nbsp else begin
& nbsp & nbsp & nbsp & nbsp del Sistema.SetLength(Resultado, Count)
& nbsp & nbsp & nbsp & nbsp Mover(Buffer[1],Resultado[1],Count)
& nbsp & nbsp fin
fin
funcion TString.En minusculas: Cadena
begin
& nbsp & nbsp Resultado := SysUtils.Minusculas( Buffer )
fin
funcion TString.Mid(const AStart, Cuenta: Integer): Cadena
begin
& nbsp & nbsp Resultado := Copy(Buffer, AStart, ACount)
fin
funcion TString.Rigth(Count: Integer): Cadena
begin
& nbsp & nbsp si Cuenta > Longitud
& nbsp & nbsp & nbsp & nbsp Resultado := '
& nbsp & nbsp else begin
& nbsp & nbsp & nbsp & nbsp del Sistema.SetLength(Resultado, Count)
& nbsp & nbsp & nbsp & nbsp Mover(Buffer[Longitud(Count-1)],Resultado[1],Conde)
& nbsp & nbsp fin
fin
procedimiento TString.SetAsPChar(const Valor: PChar)
begin
& nbsp & nbsp de Bufer := Valor
fin
procedimiento TString.SetCharacter(const Index: Integer const Valor: Char)
begin
& nbsp & nbsp si no IsEmpty
& nbsp & nbsp & nbsp & nbsp si (Indice < Longitud) y (<> GetCharacter(Indice))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Buffer[Indice] := Valor
fin
procedimiento TString.SetLength(const Valor: Integer)
begin
& nbsp & nbsp del Sistema.SetLength( Buffer, Valor )
fin
funcion TString.StartsWith(const AString: Cadena
& nbsp & nbsp const distingue mayusculas de minusculas: Boolean): Boolean
begin
& nbsp & nbsp si distingue mayusculas de minusculas
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameStr(AString, a la Izquierda(el Sistema.Longitud(AString)))
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := AnsiSameText(AString,a la Izquierda(el Sistema.Longitud(AString)))
fin
procedimiento TString.Truncar(const NewLength: Integer)
begin
& nbsp & nbsp Longitud := NewLength
fin
funcion TString.Mayusculas: Cadena
begin
& nbsp & nbsp Resultado := SysUtils.Mayusculas( Buffer )
fin
funcion TString.Contiene(const Subcadena: Cadena
& nbsp & nbsp const distingue mayusculas de minusculas: Boolean): Boolean
begin
& nbsp & nbsp Resultado := Encontrar(Subcadena, 1, distingue mayusculas de minusculas) > 0
fin
procedimiento TString.Insertar(const Index: Integer const AString: Cadena)
begin
& nbsp & nbsp del Sistema.Insertar(AString, Bufer de Indice)
fin
funcion TString.Append(const Valor: Cadena): Cadena
begin
& nbsp & nbsp Insert(Longitud, Valor)
& nbsp & nbsp Resultado := Buffer
fin
funcion TString.Prepend(const Valor: Cadena): Cadena
begin
& nbsp & nbsp Insert(1, Valor)
& nbsp & nbsp Resultado := Buffer
fin
funcion TString.Quitar(const Indice, Longitud: Integer): Cadena
begin
& nbsp & nbsp Resultado := Buffer
& nbsp & nbsp Eliminar(Resultado, el Indice de Longitud)
fin
funcion TString.IsNumber: Boolean
var
& nbsp & nbsp i: Integer
begin
& nbsp & nbsp Resultado := True
& nbsp & nbsp para i := 1 al Duracion
& nbsp & nbsp & nbsp & nbsp si no (GetCharacter(i) en ['0'..'9', ' ','-','.'])
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := False
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp & nbsp & nbsp fin
fin
funcion TString.InternalInteger(var Variable: Integer const HighBound,
& nbsp & nbsp LowBound: Integer): Boolean
var
& nbsp & nbsp ErrorCode: Integer
begin
& nbsp & nbsp Resultado := False
& nbsp & nbsp si IsEmpty o IsNumber entonces Salir
& nbsp & nbsp Val(Buffer, Variable, ErrorCode)
& nbsp & nbsp Resultado := (Errorcode = 0) y ((Variable >= LowBound) y (Variable <= HighBound))
fin
funcion TString.GetAsInteger: Integer
begin
& nbsp & nbsp InternalInteger(Resultado, Alta(Entero), Bajo(Entero))
fin
procedimiento TString.SetAsInteger(const Valor: Integer)
begin
& nbsp & nbsp Str(Valor, Buffer)
fin
funcion TString.GetAsWord: Word
var
& nbsp & nbsp Tmp: Integer
begin
& nbsp & nbsp si InternalInteger(Tmp, 0, 65535)
& nbsp & nbsp & nbsp & nbsp Resultado := Tmp
& nbsp & nbsp persona
& nbsp & nbsp & nbsp & nbsp Resultado := 0
fin
procedimiento TString.SetAsWord(const Valor: Word)
begin
& nbsp & nbsp Str(Valor, Buffer)
fin
funcion TString.GetWordSeparators: TCharSet
begin
& nbsp & nbsp Resultado := FWordSeparators
fin
procedimiento TString.SetWordSeparators(const Valor: TCharSet)
begin
& nbsp & nbsp si FWordSeparators < >
& nbsp & nbsp & nbsp & nbsp FWordSeparators := Valor
fin
funcion TString.InternalWord(const Index: Integer): Cadena
var
& nbsp & nbsp I,J,N: Integer
& nbsp & nbsp L: LongWord
& nbsp & nbsp P: PChar
& nbsp & nbsp: Boolean
begin
& nbsp & nbsp si (Indice <= 0) entonces Salir
& nbsp & nbsp L := Longitud
& nbsp & nbsp P := Puntero(Buffer)
& nbsp & nbsp R := False
& nbsp & nbsp N := 1
& nbsp & nbsp para I := 1 al L
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si no (P^ en WordSeparators)
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si no
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si N = Indice de luego
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp N := L 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inc(P)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp para J := I 1 al L
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si P^ en WordSeparators
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp N := J
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inc(P)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := Copy(Buffer,I,N-I)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp := True
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inc(N)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp fin
& nbsp & nbsp & nbsp & nbsp else if
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp a := False
& nbsp & nbsp & nbsp & nbsp Inc(P)
& nbsp & nbsp fin
& nbsp & nbsp Resultado := '
fin
funcion TString.GetWordCount: Integer
& nbsp & nbsp funcion CountOfWords(const : cadena const Delimitadores: TCharSet): Integer
& nbsp & nbsp asm
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PUSH EBX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TEST EAX,EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JE @@q0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MOV ECX,[EAX 4]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MOV EBX,EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JS @@qz
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PUSH ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp XOR EAX,EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JMP @@lp2
@@iw: INC EAX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JS @@ex
@@lp1: MOVZX ESI,BYTE PTR [EBX ECX]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp BT [EDX],ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JC @@nx
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JNS @@lp1
@@ex: POP ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp POP EBX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RET
@@lp2: MOVZX ESI,BYTE PTR [EBX ECX]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp BT [EDX],ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JNC @@iw
@@nx: DEC ECX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp JNS @@lp2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp POP ESI
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp POP EBX
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RET
@@qz: XOR EAX,EAX
@@q0: POP EBX
& nbsp & nbsp fin
begin
& nbsp & nbsp si IsEmpty
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := 0
& nbsp & nbsp & nbsp & nbsp Salida
& nbsp & nbsp fin
& nbsp & nbsp Resultado := CountOfWords(Buffer, FWordSeparators)
fin
funcion TString.GetRefCount: Integer
var
& nbsp & nbsp P: Puntero
begin
& nbsp & nbsp Resultado := 0
& nbsp & nbsp si Puntero(Buffer) <> nil then
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp P := Puntero(Entero(Puntero(Buffer)) - 8)
& nbsp & nbsp & nbsp & nbsp Resultado := Integer(P^)
& nbsp & nbsp fin
fin
fin.
Una clase string para delphi
By Consejos Y Trucos
Una clase string para delphi : Multi-millones de consejos para hacer su vida más fácil.