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

Una clase string para delphi : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación