O Delphi possui função para formatação de espaços em branco?

Delphi

09/05/2004

Amigos....
por acaso o Delphi possui alguma função que retirei os espaços em braco a mais em uma string???
Exemplo:
[u:b005e38994][b:b005e38994]String SEM Formatação[/b:b005e38994][/u:b005e38994]
abcde   fghi      jlmno      pqrs  tuvxz     123 45           678          910


[u:b005e38994][b:b005e38994]String COM Formatada[/b:b005e38994][/u:b005e38994]
abcde fghi jlmno pqrs tuvxz 123 45 678 910


Até mais galera....

[b:b005e38994][color=red:b005e38994]Editado pelo Moderador (AZ) - Inserido BBCode para facilitar a leitura[/color:b005e38994][/b:b005e38994]


Janbaceiredo

Janbaceiredo

Curtidas 0

Respostas

Janbaceiredo

Janbaceiredo

09/05/2004

Obs: Enviei a mensagem mas oa pagina do Forum formatou os espaços em branco que havia na mensagem.... Entãon coloquei ______ significando o espaço em branco...


Amigos....
por acaso o Delphi possui alguma função que retirei os espaços em braco a mais em uma string???
Exemplo:
String SEM Formatação
abcde____ fghi____jlmno___pqrs____ tuvxz_____123___45__678______910

String COM Formatada
abcde fghi jlmno pqrs tuvxz 123 45 678 910

Até mais galera....


GOSTEI 0
Fabio.hc

Fabio.hc

09/05/2004

Tente assim:

function RemoveEspaco(Str:String): String;
Var
   x : Integer;
Begin
   x:=0;
   while x <= Length(Str) do
      begin
      inc(x);
      if Str[x] = ´ ´ then
         if Str[x+1] = ´ ´ then
            begin
            Delete(str,x,1);
            Dec(x);
            end;
      end;
   Result := Str;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Edit2.Text:=RemoveEspaco(trim(Edit1.Text));
end;



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

09/05/2004

ou apenas:

function RemoveEspaco(sStr:String): String;
begin
       Result := StringReplace(sStr,´   ´,´ ´,[rfReplaceAll] );
       while pos(´   ´,Result) > 0 do
             Result := StringReplace(Result,´   ´,´ ´,[rfReplaceAll] );
end;



GOSTEI 0
Aroldo Zanela

Aroldo Zanela

09/05/2004

Colega,

Se eu entendi o problema, uma solução (OO) seria:

1. Criar um unit para implementar uma classe, conforme abaixo:

unit Unit2;

interface
type
TFormataFrase = Class(TObject)
  private
    FLinhaEntrada: String;
    FLinhaSaida: String;
    public
      property LinhaEntrada: String write FLinhaEntrada;
      property LinhaSaida: String read FLinhaSaida;
      procedure Execute;
      procedure Clear;
end;
implementation

{ TFormataFrase }

procedure TFormataFrase.Clear;
begin
FLinhaEntrada:= ´´;
  FLinhaSaida:= ´´;
end;

procedure TFormataFrase.Execute;
var Pilha: String[1];
i, x: SmallInt;
begin
Pilha := Chr(255);
  FLinhaSaida := ´´; // Adicionado em 11/05/2004 - 9h
  x := Length(FLinhaEntrada);
  For i := 1 to x do
  begin
  if FLinhaEntrada[i] <> Pilha then
    FLinhaSaida := FLinhaSaida + FLinhaEntrada[i];
    Pilha := FLinhaEntrada[i];
  end;
end;

end.


2. Utilizar a classe, instanciando conforme exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var FormataFrase: TFormataFrase;
LinhaFormatada: String;
begin
with TFormataFrase.Create do
  begin
  LinhaEntrada:= ´abcde   fghi      jlmno      pqrs  tuvxz     123 45           678          910´;
Execute;
  LinhaFormatada := LinhaSaida;
  Free;
  end;
end;


Desta forma, será mantido apenas um espaço em branco entre as palavras.

abcde fghi jlmno pqrs tuvxz 123 45 678 910



GOSTEI 0
Janbaceiredo

Janbaceiredo

09/05/2004

Ai Emerson e Fabio....
Valeu pela ajuda.

O Fabio fez um exemplo bem didatico e de facil compreenção.
Já o Emerson passou um exemplo um pouco mais avançado.... Por isso gostaria se possivel é claro de tirar um duvida...

No exemplo que vc passou
function RemoveEspaco2(sStr:String): String;
begin
      Result := StringReplace(sStr,´   ´,´ ´,[rfReplaceAll] );
      while pos(´   ´,Result) > 0 do
            Result := StringReplace(Result,´   ´,´ ´,[rfReplaceAll] );
end;


Você colocou três espaços em branco para ser procurado na função....
Alterei seu codigo e coloquei dois espaços em branco e o resultado foi igual ao mesmo codigo com tres espaços.
function RemoveEspaco2(sStr:String): String;
begin
      Result := StringReplace(sStr,´  ´,´ ´,[rfReplaceAll] );
      while pos(´  ´,Result) > 0 do
            Result := StringReplace(Result,´  ´,´ ´,[rfReplaceAll] );
end;

Minha duvida é:
É indiferente a quantidade de caracteres que vc coloca para ser comparado na String????

Mesmo assim agradeço novamente ao Fabio e ao Emerson pela a ajuda que vcs me deram. Ambos os exemplos funcionaram....
Valeu galera....


GOSTEI 0
Janbaceiredo

Janbaceiredo

09/05/2004

Ai Aroldo,
valeu pela sua dica tambêm....
Dá mesma forma que tive uma duvida na solução colocada pelo Emerson, tenho uma com a sua solução.....

A duvida seria:
Qual a vantagem e desvantagens em utilizar essa rotina, Orientada a Objeto com os exemplos anteriores em [b:56d96c7890]function[/b:56d96c7890](funções) dado pelo nossos amigos Fabio e Emerson????
Tem alguma diferença em velocidade de execução no processamento quando o volume de informação a ser verificado é muito alto???

Mesmo assim valeu pela ajuda, o exemplo passado por vc tambem rodou legal aqui na maquina.
Valeu mesmo,
Muito obrigado.


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

09/05/2004

Colega,

A vantagem em utilizar o paradigma OO ao invés de funções estruturadas, entre outras coisas, é o encapsulamento. No que se refere a performance, acho que quem poderia avaliar a diferença de time entre as soluções apresentadas aqui é o nosso colega Fernando Allen que é especialista em qualidade de software e nosso parceiro na moderação do fórum. Vou passar uma MP à ele solicitando um parecer sobre esta thread.

Independente de performance, eu prefiro utilizar OO pois faço projetos para outras linguagens, bem como, a tendência (ou realidade atual) é a orientação à objeto. Por exemplo, para se projetar esta funcionalidade no Together (Ferramenta Case da Borland), você não escaparia de implementação OO para automatizar a fase de projeto.


GOSTEI 0
Allen74

Allen74

09/05/2004

Olá Amigos.

Estou colhendo as informações e as soluções dadas neste tópico e posso fazer uma pequena análise de performance/arquitetura, somente para esclarecimento e efeito didático (se os autores das respostas não se importarem, é claro).


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

09/05/2004

Caro Allen,

Só ratificando! Estou de acordo.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

09/05/2004

janbaceiredo,

na verdade deveriam ser 2 espaços em branco. deve ter havido algum problema na postagem da resposta. a sua correção na função está perfeita.


GOSTEI 0
Cebikyn

Cebikyn

09/05/2004

Não sou nenhum especialista no assunto, mas a alternativa do [b:ffae056768]Aroldo Zanela[/b:ffae056768] é [b:ffae056768]bem melhor[/b:ffae056768] (em performance) que todas as outras!

Para um mesmo volume de dados:

função do Fabio.HC: cerca de 500ms
função do emerson.en: cerca de 1100ms
solução do Aroldo Zanela: cerca de 30ms

Agora vamos aguardar a análise do Allen74 para termos certeza.


GOSTEI 0
Beppe

Beppe

09/05/2004

cebi, testa essa:
function RemoveDupSpaces(const S: String): String;
var
  I, Total: Integer;
  InHole: Boolean;
begin
  SetLength(Result, Length(S));
  Total := 0;
  InHole := True;
  for I := 1 to Length(S) do
  begin
    if not InHole or (S[I] <> ´ ´) then
    begin
      Inc(Total);
      Result[Total] := S[I];
    end;
    InHole := S[I] = ´ ´;
  end;
  SetLength(Result, Total);
end;

Detalhe: não testei, apenas fiz um bom teste de mesa. mAs tenho certeza que é eficiente. Trabalhando com PChar, o código ficaria uns 20¬ melhor ainda.

O que se deve evitar são as repetitivas movimentações de dados(em Delete, StringReplace e concatenação), e alocações de memória(apenas na concatenação, NESTE caso)


GOSTEI 0
POSTAR