Verdades sobre variáveis do tipo Strings a partir do Delphi 2009 !

Delphi

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
Ronaldo Lanhellas

Ronaldo Lanhellas

Curtidas 0

Respostas

Marco Salles

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

Ronaldo Lanhellas

12/07/2011

obrigado pela explicação :D
GOSTEI 0
José

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
POSTAR