Primeira letra de nomes em maiúscula exceto (de, dos, do...)

Delphi

27/03/2004

Preciso converter a primeira letra de nomes para maiúscula exceto (de, dos, do, das...), como posso fazer, sabem alguma função?

Muito obrigado.


Ibraimjr

Ibraimjr

Curtidas 0

Respostas

Fabio.hc

Fabio.hc

27/03/2004

Tente assim:

function CaixaMista (mNome: string): string;
var
   tam,pos1,pos2 : integer ;
   pal : string;
begin
   tam := Length(mNome); 
   mNome := TrimRight(mNome) + ´ ´;
   mNome := AnsiUpperCase(mNome);
   while True do
      begin
      pos1:=POS( ´ ´ , mNome) ;
      if pos1 = 0 then
         break;
      pal := Copy(mNome,1,pos1) ;
      pos2 := pos(pal, ´ DA - DAS - DE - DO - DOS ´);
      If pos2 > 0 then
         pal :=AnsiLowerCase (pal)
      else
         pal:=Copy(pal,1,1) + AnsiLowerCase(Copy(pal,2,tam)) ;
      result := result + pal ;
      mNome := copy(mNome,pos1+1,tam)
      end;
end;



GOSTEI 0
Ibraimjr

Ibraimjr

27/03/2004

Valeu cara muito obrigado....


GOSTEI 0
Mário Reis

Mário Reis

27/03/2004

A tua função é fixe, mas falha em situações especiais/particulares e não é fácil resolver com o apostrofe ou por causa dele e há muitos .
Se estou bem lembrado ISA D'ELREY DE SÁ deveria dar " Isa d'Elrey de Sà e não "Isa D'elrey de Sá" D'AGUIAR O'NEIL, D'OLIVEIRA etc

Como resolver isto? alguém sabe?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

27/03/2004

tente assim:
function CaixaMista(mNome: string): string;
const
  aPrep: array[0..5] of string = (' da ', ' de ', ' do ', ' dos ', ' das ', ' e ');
var
   Tam, iPos, nOffset: integer;
begin
  Tam := Length(mNome);
  nOffset := 1;
  mNome := AnsiLowerCase(mNome); // coloca todas em minúsculas

  if Tam > 0 then
    mNome[1] := AnsiUpperCase(mNome[1])[1]; // primeira letra maiúscula

  // capitaliza as iniciais após os espaços
  repeat
    iPos := Pos(' ', mNome, nOffset);
    if (iPos > 0) and (iPos < Tam) and (mNome[iPos+1] <> ' ') then
      mNome[iPos+1] := AnsiUpperCase(mNome[iPos+1])[1]; // capitaliza
    nOffset := iPos+1;
  until iPos = 0;

  // trata das iniciais quando há apóstrofo
  // D'avila fica d'Avila
  nOffset := 1;
  repeat
    iPos := Pos('''', mNome, nOffset);
    if (iPos > 1) and (iPos < Tam) and (mNome[iPos] = '''') and (mNome[iPos+1] <> ' ') then
    begin
      mNome[iPos-1] := AnsiLowerCase(mNome[iPos-1])[1]; // minúscula
      mNome[iPos+1] := AnsiUpperCase(mNome[iPos+1])[1]; // maiúscula
    end;
    nOffset := iPos+1;
  until iPos = 0;

  // substitui as preposições e/ou junções
  for iPos := Low(aPrep) to High(aPrep) do
    mNome := StringReplace(mNome, aPrep[iPos], aPrep[iPos], [rfReplaceAll, rfIgnoreCase]);

  result := mNome;
end;
GOSTEI 0
POSTAR