A tempos queria postar sobre uma função muito interessante, que é o Format.
Uma das coisas que eu detesto em um código Delphi é a concatenação de string.
Olha este exemplo horrível (sim, estou lhe induzindo a achar horrível):
procedure TForm2.Button1Click(Sender: TObject); var sMessage : string; begin sMessage := 'Aluno: ' + Self.FNome + ' Endereço: ' + Self.FEndereco + ' Nota: ' + Self.FNota; ShowMessage(sMessage) end;
Compare com o código abaixo:
procedure TForm2.Button2Click(Sender: TObject); var sMessage : string; begin sMessage := Format('Aluno: %s Endereço: %s Nota: %d',[Self.FNome,Self.FEndereco,Self.FNota]); ShowMessage(sMessage); end;
Perceba que no segundo exemplo o código ficou mais legível. Qualquer um vai entender o resultado da concatenação sem muito esforço mental. Já no primeiro exemplo...
Então a idéia básica é passar uma string com marcações especiais (identificadas com o símbolo %) e em seguida os argumentos.
As marcações que eu considero mais úteis no dia a dia são:
%s - String
%d - Número decimal
%f - Float
Mas existem outras! Veja no Help no Delphi.
Uma característica que valorizo no Format é a possibilidade de alinharmos os valores, ajudando a formatar um bom arquivo de log por exemplo.
Para isso basta informar o número de caracteres que você deseja. %s pode vira um %15s por exemplo, onde o 15 é o tamanho. Ainda neste aspecto, vale salientar que a palavra será jogada para a direita e na maioria das vezes é mais adequado à esquerda. Para isso usamos um traço, ficando: %-15s.
Bom, é isso. Tem outros aspectos mas acho que iria tornar o assunto mais chato do que o necessário. Eu sempre incentivo o uso do Format. Na minha opinião é mais profissional. Quando você se acostumar irá ter a mesma opinião que tenho sobre o primeiro exemplo lá em cima deste post: horrível. :)
Exemplo completo (aplicação console):
program Console; {$APPTYPE CONSOLE} uses SysUtils, Windows; procedure ExemploSimples; var sResult : string; begin sResult := Format('Nome: %s Endereco: %s Idade: %d',['Fulano','Terra do Nunca',10]); Writeln('Codigo.....: Format(''Nome: %s Endereco: %s Idade: %d'',[''Fulano'',''Terra do Nunca'',10])'); Writeln('Resultado..:' + sResult); end; procedure ExemploListagemSemIdentacao; var i : Integer; sNome : string; iIdade : Integer; begin Writeln('Codigo.....: Format(''Nome....: %s Indade...: %d'',[sNome,iIdade])'); Writeln('Resultado..:'); for i := 1 to 5 do begin case i of 1 : begin sNome := 'Maria'; iIdade := 34; end; 2 : begin sNome := 'Kleberson'; iIdade := 18; end; 3 : begin sNome := 'Dona Florinda'; iIdade := 60; end; 4 : begin sNome := 'Bazzinga'; iIdade := 28; end; 5 : begin sNome := 'Fatima'; iIdade := 40; end; end; WriteLn(Format('Nome: %s Idade: %d',[sNome,iIdade])); end; end; procedure ExemploListagemComIdentacao; var i : Integer; sNome : string; iIdade : Integer; begin Writeln('Codigo.....: Format(''Nome....: %15s Indade...: %d'',[sNome,iIdade])'); Writeln('Resultado..:'); for i := 1 to 5 do begin case i of 1 : begin sNome := 'Maria'; iIdade := 34; end; 2 : begin sNome := 'Kleberson'; iIdade := 18; end; 3 : begin sNome := 'Dona Florinda'; iIdade := 60; end; 4 : begin sNome := 'Bazzinga'; iIdade := 28; end; 5 : begin sNome := 'Fatima'; iIdade := 40; end; end; WriteLn(Format('Nome: %-15s Idade: %d',[sNome,iIdade])); end; end; var bContinue : Boolean; sEntrada : string; begin try bContinue := True; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN OR BACKGROUND_BLUE); repeat Writeln(' '); Writeln('/===============================================================\'); Writeln('| Escolha a opcao: |'); Writeln('| |'); Writeln('| 1) Exemplo simples; |'); Writeln('| 2) Exemplo de listagem SEM identacao |'); Writeln('| 3) Exemplo de listagem COM identacao |'); Writeln('\===============================================================/'); Writeln(' '); Write('Digite: '); Readln(sEntrada); Writeln(' '); if (sEntrada = '1') then begin ExemploSimples; Continue; end; if (sEntrada = '2') then begin ExemploListagemSemIdentacao; Continue; end; if (sEntrada = '3') then begin ExemploListagemComIdentacao; Continue; end; bContinue := False; until not (bContinue); Write('Fim da execucao!'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
Forte abraço!