Como automatizar seleção de letras com e sem acento?

12/06/2008

1

Eu criei um dicionário, mas devido ao fato de estar sempre colocando novas palavras, de vez em quando preciso reimprimir, mas para a cada vez eu tenho que reimprimir tudo, inclusive as letras que não foram modificadas, portanto resolvi imprimir letra por letra e aí surgiu um problema para o qual busco uma solução prática. Existem diversas palavras que começam com letras acentuadas, vamos a um exemplo: A, À e Á, só que se mando imprimir a letra A, as letras À e Á não são impressas pois os seus valores são diferentes do A = 65, Á = 181, e À = 183.
Pergunto se alguém sabe algum método para automatizar este processo, facilitando a minha vida, para que eu não tenha que colocar um monte de comparações dentro de IF´s para cada uma das letras que podem possuir acento.


Responder

Posts

12/06/2008

Weber

Usando banco de dados FB 2 basta definir o collate como PT_BR.


Responder

12/06/2008

Edilcimar

Isto que você falou eu já faço, porém não funciona, se eu mandar imprimir de A até Z ele não imprime os caracteres com valores superiores a 128, para poder imprimir de A até Z tenha que mandar imprimir de A até Ü, aí sim todas as letras são impressas em ordem alfabética, de forma correta. Se eu mandar imprimir apenas a letra A, as letras Á e À não são impressas, apesar de que as mesmas aparecem na tela.


Responder

13/06/2008

Carlosrm

Edilcimar,

Dá para aproveitar essa função?

function RemoveAcento(Str:String): String;
Const
  ComAcento = ´àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ´;
  SemAcento = ´aaeouaoaeioucuAAEOUAOAEIOUCU´;
Var
  x : Integer;
Begin
  For x := 1 to Length(Str) do
    if Pos(Str[x],ComAcento)<>0 Then
      Str[x] := SemAcento[Pos(Str[x],ComAcento)];
  Result := Str;
end;


espero que ajude. carlosrm


Responder

13/06/2008

Edilcimar

Carlosrm, eu não usei a função inteira, mas ela me forneceu uma idéia para fazer algo simples, grato.
Ficou assim:
Isto abaixo é feito de um loop
With table1 do
Begin
   First;
   While not eof do
   Begin
      Letra1 := Copy(FieldByName(´xyz´).AsString,1,1);
      Next;
      Letra2 := Copy(FieldByName(´xyz´).AsString,1,1);
      If ((Letra1 <> Letra2) and ((Pos(Letra1,SemAcento) <> 0) and (Pos(Letra2,ComAcento) <> 0))) OR
      ((Letra1 <> Letra2) and (Pos(Letra1,ComAcento) <> 0) and (Pos(Letra2,SemAcento) <> 0))) then
         Ejetar := False
      Else If (Letra1 <> Letra2) then
         Ejetar := True
   End;
End;



Responder

13/06/2008

Carlosrm

Edilcimar.
legal que tenha sido útil de alguma forma. Confesso que peguei essa função na internet e tenho usado para imprimir em matriciais.
Já aproveitei posts seus e de outros colegas do fórum para tirar duvidas e aprender. E a cada dia aproveito mais.
Como se dizia antigamente: ´Uma mão lava a outra e as duas lavam o rosto.´


Responder

13/06/2008

Weber

No select é para funcionar corretamente, pois usando o collate pt_br o where funciona correto e como você mesmo já diz o order by também funciona.

Where xyz like (´A¬´)

O resultado do select será tudo que inicia com A a Á á Ã ã...


Responder

13/06/2008

Edilcimar

Weber, o programa é um dicionário para uso próprio, tem poucas palavras, vou acrescentando mais a medida que vou aprendendo, é para uso em um único computador, portanto uso uma table. O programa me permite através de 2 edits dizer qual a letra inicial e qual a letra final a ser impressa, portanto uso um filtro, o qual apesar de ser um processo lento, aqui é impercepitível, pois só é utilizado durante a impressão, na tela ele mostra todos os caracteres em ordem alfabética, o problema era só durante a impressão, portanto creio que seja um problema com o filtro, mas do jeito que fiz o problema foi solucionado.


Responder