Função para caixabaixa em char??

07/08/2004

Salve galera..

Estou com o seguinte problema:
Preciso percorrer uma string e transforma-la em minuscula letra a letra:
para transformar em MAIUSCULA, eu utilizo a seguinte construção

for k := Length(Linha) do
begin 
  Linha[k&93; := UpCase(linha&91;K&93;);
end;


Mas não estou conseguindo encontrar a função inversa..
Já tentei Lower(). AnsiStrLower(), StrLower(). o problema é que AnsiStrLower(), e StrLower() trabalhamcom Pchar e quanto utilizo

a construção do [b:105dbe9546]For[/b:105dbe9546], cada item da variavel linha é retornada como Char.. ai tenho a seguinte msg de erro:
[b:105dbe9546][Error] UString.pas(53): Incompatible types: ´Char´ and ´PChar´[/b:105dbe9546]

Se alguém puder me ajudar desde já agradeço

Fausto


Faustoalves

Respostas

07/08/2004

Oscar Candido

Tente usar a função:

  Linha[k&93; := AnsiLowerCase(linha&91;K&93;);


Espero ter ajudado
um abraço


Responder Citar

07/08/2004

Emerson

só uma pequena correção:

// deve ser solicitado o primeiro elemento, visto que AnsiLowerCase()
// retorna uma string, mas Linha[k] espera um char
for k := 1 to Length(linha) do
    Linha[k] := AnsiLowerCase(linha[K])[1];


Responder Citar

07/08/2004

Faustoalves

só uma pequena correção: // deve ser solicitado o primeiro elemento, visto que AnsiLowerCase() // retorna uma string, mas Linha[k] espera um char for k := 1 to Length(linha) do   Linha[k] := AnsiLowerCase(linha[K])[1];


Não deu certo, na verdade estou com uma unit que converte o nome próprio para maiuscula desconsiderando as letras e silabas de junção de nomes, ex:
[b:0c609e4c6d]jose da silva[/b:0c609e4c6d] fica [b:0c609e4c6d]Jose da Silva[/b:0c609e4c6d]
Mas ela somente faz isto se toda a string já for minuscula estou convertendo uma base de dados e os nomes estão todos em maiusculas ai eu estou fazendo assim:

[b:0c609e4c6d]Se eu Chamar a função assim não funciona:[/b:0c609e4c6d]

ClienteFBNOMECLIENTE.Value := Proprio(ClienteDBFCLINOM.Value);


[b:0c609e4c6d]Mas se eu chamar a função assim funciona:[/b:0c609e4c6d]
ClienteFBNOMECLIENTE.Value := Proprio(LowerCase(ClienteDBFCLINOM.Value));


[b:0c609e4c6d]Observe que nesta ultima chamada eu utilizo o LowerCase[/b:0c609e4c6d](NomeCampo).


Mas o ideal seria inserir o LowerCase dentro da função que esta definita assim:
function Proprio(Letra: String):String ;
begin
  // o ideal seria que aqui ele transformasse tudo em minuscula
  // Já tentei assim
  
  Letra := LowerCase(Letra);

  // e assim também

   for i := 1 to length(Letra) do
    Letraaux := AsiLowerCase(Letra[i&93;)&91;1&93;;
    Letra := LetraAux;

Em ambos os casos não funcionou... 


Se alguém puder me dar uma dica desde já agradeço

Fausto


Responder Citar

07/08/2004

G1b4

Tenta isso:

function Proprio(Letra: String):String ;
var
  resultado:string;
  k: integer;
begin
  resultado:=´´;
  for k:=1 to length(linha) do 
      resultado:=resultado+AnsiLowerCase(Letra[k&93;);
 result:=resultado
end;


:wink:


Responder Citar

07/08/2004

Emerson

veja se essa função te ajuda:

// formata nome para iniciais em maiúsculas
function FormataNome(Texto: string): string;
const Excessao: array[0..5] of string = (´ de ´,´ do ´,´ da ´,´ dos ´,´ das ´,´ e ´);
var i: integer;
begin
    Result := Texto;

    if Texto = EmptyStr
    then exit;

    Result[1] := AnsiUpperCase(Result[1])[1];

    for i := 2 to Length(Result) do
        if Result[i-1] = ´ ´ then
            Result[i] := AnsiUpperCase(Result[i])[1]
        else
            Result[i] := AnsiLowerCase(Result[i])[1];

    for i := 0 to High(Excessao) do
        Result := StringReplace( Result,Excessao[i],Excessao[i],[rfReplaceAll,rfIgnoreCase] );

end;


Responder Citar