Dificuldade com arquivo INI

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Dificuldade com arquivo INI

Mensagem por Jairo Maia »

leandrolinauer escreveu:alguem sabe qual é o formato de retorno da WIN_PRINTDLGDC( @cPrinter, , , )
O retorno dessa função é um Pointer (controlador de ponto), mas da forma que você está fazendo WIN_PRINTDLGDC( @cPrinter ) a variável cPrinter está retornando com tipo Caractere com o nome da impressora selecionada, essa função retorna no primeiro parâmetro passado por referência (@cPrinter) uma string com o nome da impressora escolhida.

O que você não pode fazer é isso:

Código: Selecionar todos

cPrinter := WIN_PRINTDLGDC( @cPrinter)
Se fizer isso a variável cPrinter passa a ser um Handler (Pointer), mas não é seu caso. Como você está usando está correto, não está no retorno do nome da impressora o erro.

Tem como você anexar um INI que você está fazendo a leitura para buscar essa impressora? Se puder será bem mais facil dar uma sugestão.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Dificuldade com arquivo INI

Mensagem por leandrolinauer »

Bom dia Jairo
Segue anexo o INI CONFIG_MAQ.INI
Coloquei apenas uma impressora, detalhe criei este arquivo manualmente com editor de texto, mas com o nome certinho retornado da cPrinter e copiado.

Realmente não consegui ler porque ele reconhece e acha mas ao comparar ele retorna falso.
Teste que fiz

TESTE CERTO

Código: Selecionar todos

oEnvCPrinter:='HP Laserjet Professional M1212nf MFP' //DA CERTO colocando o nome diretamente
oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',oEnvCPrinter))
// hIni[cSecao][cKey] = oEnvCPrinter RETORNA VERDADEIRO
TESTE ERRADO

Código: Selecionar todos


//cPrinter é igual 'HP Laserjet Professional M1212nf MFP' //retornado da WIN_PRINTDLGDC( @cPrinter)

oEnvCPrinter:=cPrinter //NAO DA CERTO informando o nome da variavel preenchida
oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',oEnvCPrinter)) //assim
oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',cPrinter)) //ou assim
// hIni[cSecao][cKey] = oEnvCPrinter ou cPrinter  RETORNA FALSO

Código: Selecionar todos

FUNCTION Retorna_INI(cArq, cSecao, cKey) 
Local hIni  := HB_ReadINI(cArq)
Return hIni[cSecao][cKey] //DA ERRO AQUI
Grato
Anexos
CONFIG_MAQ.INI
(63 Bytes) Baixado 123 vezes
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Dificuldade com arquivo INI

Mensagem por Jairo Maia »

Olá leandrolinauer,

Já foi alertado aqui que para ser encontrado um conteúdo no arquivo INI deve ser exatamente idêntico ao que está no INI, fiz os testes aqui, acrescentei impressoras em seu INI, e tudo funciona.

Apenas não tenho aqui a impressora: "HP Laserjet Professional M1212nf MFP", mas as demias que seleciono e estão no INI tudo funciona.

Para úlçtima análise, rode esse exemplo num computador que tenha instalda a impressora "HP Laserjet Professional M1212nf MFP", e verifique se ambos nomes, ou seja, o que está em seu INI é exatamente como está sendo retornado pela função WIN_PRINTDLGDC(). Nada explica o erro a não ser alguma diferença entre o que está sendo retornado e o que está no INI:

Código: Selecionar todos

/*
  Compilar usando: Exemplo.prg xhb.hbc hbwin.hbc
*/
Function Main()

 Clear Screen
 
 /* 
   WIN_PRINTDLGDC():
   Se não selecionar nada (dar ESC), retorna Null, e
   cPrinter não se altera, fica exatmante como estava antes...
 */
 
 cPrinter := "Nao selecionou Impressora Nenhuma!"  // conteudo de cPrinter...
 
 If !Empty( WIN_PRINTDLGDC( @cPrinter ) )

  iRead := HB_ReadIni("CONFIG_MAQ.INI" )
  
  @ 2,2 Say "Verifique se ambos nomes sao EXATAMENTE idênticos:"
  @ 4,2 Say cPrinter                                // nome real da impressora
  @ 5,2 Say "HP Laserjet Professional M1212nf MFP"  // nome como esta no INI
  @ 7,2 Say ""
   
  If cPrinter == "HP Laserjet Professional M1212nf MFP"
  
   i_PRINTER := iRead["Impressora_folha"][cPrinter]

   Hb_Alert( CStr( i_PRINTER ) )
  
  Else
  
   Hb_Alert( "Nomes de Impressoras nao batem!" )
  
  EndIf
   
 Else

  Hb_Alert( cPrinter )  // não selecionou nada, então sem alteração

 EndIf

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Dificuldade com arquivo INI

Mensagem por leandrolinauer »

Boa tarde Jairo.
Muito obrigado pelos esclarecimentos me ajudou demais da conta, cheguei a conclusão que tenho que trocar os óculos.
Graças a seu ultimo post, eu acabei descobrindo a falha era o "J"
Mesmo após vários teste e todos me falando que devem estar diferentes eu não enxerguei aonde estava diferente, e realmente estava diferente.
"HP Laserjet Professional M1212nf MFP" com "HP LaserJet Professional M1212nf MFP"

Quebrei muita cabeça nisto, vou ter que trocar os óculos mesmo.
Agora deu certinho realmente, se eu tivesse partido da criação automática primeiro para depois ler, não teria passado por isto, mas fui fazer o final para depois ver como fazer o inicio. RSRSRSRS.

Como realmente dizem,nada de colocar a carroça na frente dos bois que não funciona.

Fico muito grato e peço desculpas pela teimosia na mesma tecla e não ter enxergado o problema na cara.
Valeu amigos, um abraço a todos, vou pegar uns dias de descanso quem sabe ano que vem venho com visão melhor, rrsrsrsrsrs.
Um feliz natal a todos.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Dificuldade com arquivo INI

Mensagem por leandrolinauer »

Bom dia, eu novamente
Fui prosseguir com INI antes das férias e me deparei com outro problema

Preciso localizar dentro do INI se a impressora que selecionei existe lá.
a que existe retorna certinho Return hIni[cSecao][cKey]

mas a que não existe ainda no INI, eu precisava que não ocorresse erro nesta linha Return hIni[cSecao][cKey]
com

Código: Selecionar todos

If HB_HHasKey( hIni, cSecao ) //a seção achei perfeitamente [Impressora_folha]
   //aqui eu precisava colocar para ver se a chave existe e hb_HhasKey não da certo
    //procurar aqui se a chave existe
    if localizar a chave 
       Return hIni[cSecao][cKey]
    endif 
EndI

Necessito de algo que retornasse a chave da secao
Estou estudando sobre Hash() , mas se alguem já tiver fico grato
Um abraço.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Dificuldade com arquivo INI

Mensagem por leandrolinauer »

Boa tarde a todos,
Pesquisando um pouco mais a fundo sobre hash, consegui descobrir como fazer a leitura, tem que colocar uma hash para a seção já localizada para poder localizar a chave dela, como uma subpesquisa, mais ou menos isto, conforme o código abaixo

Código: Selecionar todos

FUNCTION Retorna_INI(cArq, cSecao, cChave)  //ok funcionando
Local hIni   := HB_ReadINI(cArq) 
Local aSecao 
Local aRet   :="" 
If hb_HHasKey( hIni, cSecao )
   aSecao := hIni[cSecao]
   If hb_IsHash( aSecao )
      If hb_HHasKey( aSecao, cChave ) //é só pesquisar novamente em uma nova hash
         aRet := hb_HGet( aSecao, cChave ) //se achar, retorna a chave, senao retorna a ret vazia
      EndIf
   EndIf
EndIf 
Return aRet
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Dificuldade com arquivo INI

Mensagem por Jairo Maia »

leandrolinauer escreveu:Pesquisando um pouco mais a fundo sobre hash
Muito bom, está fazendo a tarefa de casa. Nota 7.

Agora, coloque os óculos e complete:

-Se não achar a seção:
1-crie a secção, a HashKey e atribua o valor dela
2-Salve o INI atualizado.

-Se achar a seção mas não achar a HashTag:
1-crie a HashKey e atribua o valor dela
2-Salve o INI atualizado.

Poste e se tiver tudo certo leva 10. rs...
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Dificuldade com arquivo INI

Mensagem por leandrolinauer »

Bom dia Jairo.
Obrigado pela ajuda e agora já estou mais compreendido no hash.
Realmente já fiz a função para cadastrar ou alterar, fiz uma adaptação do que encontrei aqui no forúm para servir pra mim e funcionou blzinha.

Segue abaixo

Código: Selecionar todos


FUNCTION Retorna_INI(cArq, cSecao, cKey)  //ok funcionando função que retornar o valor da chave
Local hIni   := HB_ReadINI(cArq) 
Local aSecao 
Local aRet   :="" 
If hb_HHasKey( hIni, cSecao )
   aSecao := hIni[cSecao]
   If hb_IsHash( aSecao )
      If hb_HHasKey( aSecao, cKey )
         aRet := hb_HGet( aSecao, cKey )
      EndIf
   EndIf
EndIf 
Return aRet

Function Add_Secao_Key(cArq, cSecao, cKey, cValue )  //função que cadastra ou altera a hash de acordo com a necessidade
Local aRet := .F.
Local hIni := hb_IniRead(cArq,,.F.) 
Local hTemp := hb_HClone( hIni ) // clona a hash
If hb_HHasKey( hTemp, cSecao )   //se existir
   If hb_IsHash( hTemp[cSecao] )
      hb_HSet( hTemp[ cSecao ], cKey, cValue ) //altera o valor da chave 
      aRet:=.T. //retorna verdadeiro para nao entrar abaixo
   EndIf
EndIf
If aRet=.F.   //se nao existir 
   hb_HSet( hTemp, cSecao, { => } ) // cria a secao
   hb_HSet( hTemp[ cSecao ], cKey, cValue ) // cria a chave e atribuiu o valor
   aRet:=.T.
EndIf   
hIni := hb_HClone( hTemp ) // atualizo hIni 
hTemp := NIL
hb_IniWrite( cArq, hIni) //gravo a atualização em arquivo
Return aRet
Muito grato a todos que me ajudaram.
Um feliz natal e um próspero ano novo a todos.
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Dificuldade com arquivo INI

Mensagem por Jairo Maia »

leandrolinauer escreveu:fiz uma adaptação do que encontrei aqui no forúm para servir pra mim e funcionou blzinha
Muito bom... Então: 10

Apenas para registro:

Nessa postagem do Itamar tem todas as funções necessárias para ler e gerenciar um INI. Muito bom Exemplo:
NOTE : case sensitive regarding section/key names (could easily modified to become case insensitive, though)
Case Sensitve para busca de Seção e Chaves. Pode ser facilmente alterado para Case Insensitive.
hb_IniGetValue( hIni, [cSection], cKey )
- Pega o valor de uma HashKey

hb_IniSetValue( @hIni, [cSection], cKey, xVal, [cIniFile] )
- Altera/Atribui um valor a uma HashKey (opcionalmente salva com outro nome)

hb_IniDelKey( @hIni, cSection, cKey, [cIniFile] )
- Deleta uma HashKey (opcionalmente salva com outro nome)

hb_IniDelSECTION( @hIni, cSection, [cIniFile] )
- Deleta uma Seção (opcionalmente salva com outro nome)

hb_IniSaveFile( cIniFile, hIni, [lComments] )
- Salva o INI (opcionalemte atribui um comentário)
Fonte: Ler conteudo de arquivo INI
Autor: Pete D. 2014/11/11
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder