Clipper On Line • Ver Tópico - Primeira letra maiúscula/FOR EACH @
Página 1 de 1

Primeira letra maiúscula/FOR EACH @

MensagemEnviado: 02 Abr 2020 15:13
por JoséQuintas

REQUEST HB_CODEPAGE_PTISO

PROCEDURE MAIN

   LOCAL cText

   SET( _SET_CODEPAGE, "PTISO" )
   CLS
   cText := "ISTO É UMA BENÇÃO"
   @ 1, 0 SAY cText
   @ 2, 0 SAY CaseCapital( cText )
   Inkey(0)
   RETURN

FUNCTION CASECapital( cText )

   LOCAL lUpper := .T., cLetter

   cText := Lower( cText )
   FOR EACH cLetter IN @cText
      IF lUpper .AND. cLetter != Space(1)
         cLetter := Upper( cLetter )
         lUpper := .F.
      ENDIF
      IF cLetter == Space(1)
         lUpper := .T.
      ENDIF
   NEXT

   RETURN cText


upper.png
upper.png (7.94 KiB) Visualizado 4421 vezes

Primeira letra maiúscula/FOR EACH @

MensagemEnviado: 02 Abr 2020 18:36
por alxsts
Olá!

Como o tempo passa!

Tópico de junho de 2009: Converter carcteres maiusculos por minusculos

Primeira letra maiúscula/FOR EACH @

MensagemEnviado: 02 Abr 2020 20:32
por bencz
José, boas noites!!

Bati o olho e ja vi um problema em seu código!
Veja a correção ( eu tirei os acentos e etc, pois meu "uindus" é em inglês, então, o console não mostra os acentos )
Troquei a variavel de entrada do for each, para não utilizar a referencia, pois tenho apenas o xHarbour em meu computador e o xHarbour não suporta variavel por referencia no foreach
Utilize a função "IsSpace" e não "space(1)", caso a string de entrada tenha tabs, por exemplo, a função IsSpace vai identificar isso

PROCEDURE MAIN

   LOCAL cText

   CLS
   cText := "ISTO   E   UMA   BENCAO"
   @ 1, 0 SAY cText
   @ 2, 0 SAY CaseCapital( cText )
   Inkey(0)
   RETURN

FUNCTION CASECapital( cText )

   LOCAL lUpper := .T., cLetter

   cText := Lower( cText )
   FOR EACH cLetter IN cText
      IF lUpper .AND. !IsSpace(cLetter)
         cText[HB_EnumIndex()] := Upper( cLetter )
         lUpper := .F.
      ENDIF
      IF IsSpace(cLetter)
         lUpper := .T.
      ENDIF
   NEXT

   RETURN cText

Primeira letra maiúscula/FOR EACH @

MensagemEnviado: 02 Abr 2020 22:23
por JoséQuintas
bencz escreveu:Veja a correção ( eu tirei os acentos e etc, pois meu "uindus" é em inglês, então, o console não mostra os acentos )


Não sei se funciona igual no Harbour, mas, XHarbour também tem GTWVG.

No Harbour é: hbmk2 projeto.hbp gtwvg.hbc
Sem alterar mais nada.

De console passa a ser uma janela do Windows, e aí fica liberada a codepage do Harbour.

Pensando bem, poderia ser o Empty() ao invés de comparar com espaço.
No aplicativo nem lembro se tenho isso, criei hoje pra um usuário de um fórum, minigui ou algo parecido.
E pra aproveitar e mostrar o uso da referência no for/each.

Primeira letra maiúscula/FOR EACH @

MensagemEnviado: 02 Abr 2020 22:35
por JoséQuintas
E não é que meu aplicativo tem.
Mas esta falha se tiver mais de um espaço em branco.

FUNCTION UpperLower( mTexto )

   LOCAL mTexto2 := "", mMaiuscula := .T., nCont, mLetra

   FOR nCont = 1 TO Len( mTexto )
      mLetra := Substr( mTexto, nCont, 1 )
      DO CASE
      CASE mLetra == " "
         mTexto2 += mLetra
         mMaiuscula  := .T.
      CASE mMaiuscula
         mTexto2 += Upper( mLetra )
         mMaiuscula  := .F.
      OTHERWISE
         mTexto2 += Lower( mLetra )
      ENDCASE
   NEXT

   RETURN mTexto2


Provavelmente dá pra fazer melhor com o hb_RegEx(), mas ainda não faço idéia como usar isso.

Primeira letra maiúscula/FOR EACH @

MensagemEnviado: 29 Jan 2022 17:12
por clodoaldomonteiro
Pra contribuir com o trabalho de vcs e aproveitando o que vcs colocaram aqui.
Vi a necessidade de deixar algumas palavras em minúsculo mesmo, como, "e, de, do, da".
Segua a função:
FUNCTION CaseCapital( cTexto )

   LOCAL x, mRetorno := '', aTexto, mExclusoes := "ao,e,de,do,da", mPalavra, mMask

   cTexto := Lower(cTexto)
   aTexto := HB_ATokens(cTexto, ' ')

   FOR x = 1 TO Len( aTexto )
      mPalavra := AllTrim(aTexto[x])
      If Len(mPalavra) > 0
         If mPalavra $ mExclusoes
            mRetorno += mPalavra + ' '
         Else
            mMask := '!' + Replicate('A', Len(mPalavra)-1)
            mRetorno += Transform( mPalavra, mMask) + ' '
         Endif
      Endif
   NEXT

   RETURN mRetorno

Primeira letra maiúscula/FOR EACH @

MensagemEnviado: 29 Jan 2022 20:47
por alxsts
Olá!

Se você olhar a rotina que postei em 2009 (link acima), verá que este tratamento existe nela.