Verdades sobre variáveis do tipo Strings a partir do Delphi 2009 !
Bom... Estou abrindo este tópico afim de discutir um assunto que deixa um ponto de integorração ao falar sobre "tratamento de strings no delphi". Afinal qual a diferença entre os tipos AnsiString, WideString, UnicodeString e String. Sei que uma das diferenças é o tamanho da UTF, isto é, a quantidade de caracteres suportados, porém não vi diferença entre AnsiString e WideString e nem entre UnicodeString e String
Ronaldo Lanhellas
Curtidas 0
Respostas
Marco Salles
12/07/2011
Bom... Estou abrindo este tópico afim de discutir um assunto que deixa um ponto de integorração ao falar sobre "tratamento de strings no delphi". Afinal qual a diferença entre os tipos AnsiString, WideString, UnicodeString e String. Sei que uma das diferenças é o tamanho da UTF, isto é, a quantidade de caracteres suportados, porém não vi diferença entre AnsiString e WideString e nem entre UnicodeString e String
A representatividade de WideString e String é a mesma. Ja AnsiString tem representatividade limitada
Vc pode testar os dois codigos abaixo
var
S:Pchar;
W:WideChar;
A:AnsiChar;
begin
S:=#21205;
W:=#21205;
A:=#21205;
Showmessage(S+sLineBreak+W+sLineBreak+A);
Showmessage(
inttostr(SizeOf(Char))+sLineBreak+inttostr(SizeOf(WideChar))+sLineBreak+inttostr(SizeOf(AnsiChar)));
var
s:String;
W:WideString;
A:AnsiString;
begin
S:=#$d869#$ded6;
W:=#$d869#$ded6;
A:=#$d869#$ded6;
Showmessage(S+sLineBreak+W+sLineBreak+A);
Então qual a diferença ???
Vamos entender ...
Antes do Delphi 2007 tinhamos
Ansistring = String
WideString **** Sem contagem de Referencia ( 2 Byte )
UnicodeString *** Com contagem de Referencia (Novo Tipo de estrutura Desde o Delphi 2007)
Char = 1 Byte
AnsiChar = 1 Btye
WideChar = 2 Btye
Agora temos
AnsiString *** Com Contagem de Referencia
AnsiChar = 1 Byte
WideString **** Sem contagem de Referencia (formado por caracter de 2 bytes cada)
String = UnicodeString
Char = 2 Bytes
AnsiChar = 1 Byte
WideChar = 2 Byte
E a contagem de referencia ????
Como nos programamos em Delphi, e o tipo String diferentemente de outra linguagens nos não preocupamos com Ponteiros . Mas nos bastidores Strings são ponteiros para estruturas contendo informações sobre Comprimento
contagem de Referencia , e o Vetor de Caracteres qie compõem a STring propriamente dita . Tb ha um Gerenciamento de memória nesta brincadeira. Em outras palavras nos sentamos o Pau
Vamos ver o Comprimento e a contagem de Referencia nas tres estruturas
Execute
var
str:String; // UnicodeString *** mesma coisa
copia:string;
Len:Pinteger;
Controle_Referencia:PInteger;
begin
Str:=edit1.Text;
Len:=Pinteger(integer(Str)-4);
showmessage('A String "Str" cujo conteudo é '+str+' Tem comprimento de '+inttostr(Len^)+sLineBreak+
' Mesmo resultado se fossemos usar o métododo Length(str) = '+ inttostr(length(str)));
Controle_Referencia:=Pinteger(integer(Str)-8);
Showmessage('Controle De Referencia = '+inttostr(Controle_Referencia^));
copia:=str;
Showmessage('Controle De Referencia = '+inttostr(Controle_Referencia^));
Depois troque os Tipos
Str:String por Str:WideString e finalmente Str:AnsiString;
Copia:String por Copia:WideString e finalmente Copia:AnsiString;
Então WideString é mais lento porém ocupa menos memória ja que não existe este ofset Pinteger(integer(Str)-8);
nesta estrutura quando comparado a String(UnicodeString) nas novas versões do Delphi
Acho que basicamente é isto...
GOSTEI 0
Ronaldo Lanhellas
12/07/2011
obrigado pela explicação :D
GOSTEI 0
José
12/07/2011
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0