Fórum WideString Versus Strings .. Diferença prática #317882
30/03/2006
0
Exemplo:
WideUpperCase(const S: WideString): WideString;
Versus
function AnsiUpperCase(const S: string): string;
o efeito prático é o mesmo :cry: ...
Para que essa definição de WideString ???
Ocupa mais Espaço na memória ??? Qaundo devemos começar a usar esses tipo de dados ???
Obrigado..
Marco Salles
Curtir tópico
+ 0Posts
30/03/2006
Massuda
Unicode é uma outra convenção usada paa codificar caracteres que, ao invés de se limitar a 256 caracteres, suporta até 65535 (ou 65536?) caracteres. Um caractere Unicode ocupa dois bytes e, por conveniencia, os 256 primeiros caracteres correspondem aos caracteres usuais.
Os caracteres adicionais servem para acomodar os diferentes idiomas (chines, russo, etc).
Gostei + 0
30/03/2006
José Henrique
65536 caracteres, de 0 a 65535.
Gostei + 0
31/03/2006
Ipc$
Gostei + 0
31/03/2006
Massuda
Gostei + 0
31/03/2006
Marco Salles
Veja definição de duas funçoes , que praticamente são ´iguias´
function WideFormat(const Format: WideString; const Args: array of const): WideString; overload; function WideFormat(const Format: WideString; const Args: array of const; const FormatSettings: TFormatSettings): WideString; overload;
function Format(const Format: string; const Args: array of const): string; overload; function Format(const Format: string; const Args: array of const; const FormatSettings: TFormatSettings): string; overload;
Mas na prática da uma diferença que não estou conseguindo entender
Vejam :
[b:dbe303b854]showmessage(WideFormat(´¬8.2f´, [123.456])); //retorna 12 :?: :?:
showmessage(Format(´¬8.2f´, [123.456]));[/b:dbe303b854] //retorna 12,46
:?: :?: :?: :?: :?:
Gostei + 0
03/04/2006
Massuda
[quote:6818d6765d=´Marco Salles´]...showmessage(WideFormat(´¬8.2f´, [123.456])); //retorna 12[/quote:6818d6765d]ShowMessage não sabe tratar WideStrings, provavelmente está truncando a string (Unicode) retornada por WideFormat no quinto byte e não no quinto caractere, já que ShowMessage assume implicitamente que um caractere = um byte enquanto WideFormat está assumindo que um caractere = dois bytes.
Gostei + 0
03/04/2006
Marco Salles
Veja um detalhe curioso
var TextString:String; textoWide:WideString; i:integer; begin textoString:=Format(´¬8.2f´,[12,345]); textoWide:=WideFormat(´¬8.2f´,[12,345]); for i:=1 to length(texto) begin showmessage(textoString[i]); showmessage(TextWide[i]); end; end;
Voce vera que o TextWide tem o tamanho de ´oito´ igualzinho ao TextString , so que ele[b:66dac53843] dispoe [/b:66dac53843]os caracters de uma maneira esquisita
textoString[1] = ´´ textoWide[1]:=´´
[b:66dac53843]engraçado que
textoWide:=WideFormat(´¬2.5f´,[12,345]); apresenta 12,34 , Houve uma inversão da parte que cabe ao decimal com o tamanho da string... Mas se aproxima da realidade.. Isto parece que não esta documentado .. A unica diferença alem da inversão é que não esta arredondando[/b:66dac53843]
:idea: :idea: :idea:
Fiz um pequeno exemplo par que possas entender melhor a quem interressar o que estou falando
procedure TForm1.Button7Click(Sender: TObject); var texto1:String; texto2,texto3:WideString; a2,a3,i:integer; //a2 seria a parte decimal ; a3 seria o tamanho da String a1:Extended; begin if trystrtofloat(edit1.text,a1) then begin //numero de casas decimais if trystrtoint(edit2.Text,a2) then begin //Tamanho if trystrtoint(edit3.Text,a3) then begin listBox1.Clear; listBox2.Clear; listBox3.Clear; texto1:=Format(´¬*.*f´, [a3,a2, a1]); texto2:=WideFormat(´¬*.*f´, [a3,a2,a1]); //note a inversão da parte decimal com o tamanho da String texto3:=WideFormat(´¬*.*f´, [a2,a3,a1]); showmessage( texto1+´ Tamanho : ´+inttostr(length(texto1+13+ texto2+´ Tamanho : ´+inttostr(length(texto2)+13+ texto3+´ Tamanho : ´+inttostr(length(texto3))); for i:=1 to length(texto1) do listbox1.items.add(texto1[i]); for i:=1 to length(texto2) do listbox2.items.add(texto2[i]); for i:=1 to length(texto3) do listBox3.Items.Add(texto3[i]); end else begin showmessage(´ATENÇÃO : Valor Incorreto.. Digite o Tamanho no edit3´); edit3.setfocus; end; end else begin showmessage(´ATENÇÃO : Valor Incorreto..Digite as casas decimais´); edit2.SetFocus; end end else begin showmessage(´ATEÇÃO : para este procedimento digite´+13+ ´ um Numero "Real" válido no Edit1´); edit1.setfocus; end; end;
abraços...
Gostei + 0
03/04/2006
Massuda
O suporte a Unicode do Delphi sempre foi considerado precário (tem rotinas que suportam Unicode, mas a VCL não suporta Unicode).
Caso você tenha real necessidade de usar Unicode (vai exportar software para a Europa Oriental ou países asiáticos?), existem os componentes da [url=http://www.tntware.com/delphicontrols/unicode/]TntWare[/url] (freeware com fontes) e um biblioteca de funções para lidar com WideString´s da [url=http://www.soft-gems.net/UnicodeLibrary.php]Soft-Gems[/url] (open source).
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)