Primeira letra maiúscula/FOR EACH @

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Primeira letra maiúscula/FOR EACH @

Mensagem por JoséQuintas »

Código: Selecionar todos


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) Exibido 5099 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Primeira letra maiúscula/FOR EACH @

Mensagem por alxsts »

Olá!

Como o tempo passa!

Tópico de junho de 2009: Converter carcteres maiusculos por minusculos
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Primeira letra maiúscula/FOR EACH @

Mensagem 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

Código: Selecionar todos

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
Imagem
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Primeira letra maiúscula/FOR EACH @

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Primeira letra maiúscula/FOR EACH @

Mensagem por JoséQuintas »

E não é que meu aplicativo tem.
Mas esta falha se tiver mais de um espaço em branco.

Código: Selecionar todos

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Primeira letra maiúscula/FOR EACH @

Mensagem 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:

Código: Selecionar todos

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
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Primeira letra maiúscula/FOR EACH @

Mensagem por alxsts »

Olá!

Se você olhar a rotina que postei em 2009 (link acima), verá que este tratamento existe nela.
[]´s
Alexandre Santos (AlxSts)
Responder