Página 2 de 2

Dificuldade com arquivo INI

Enviado: 18 Dez 2021 07:20
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.

Dificuldade com arquivo INI

Enviado: 18 Dez 2021 10:06
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

Dificuldade com arquivo INI

Enviado: 19 Dez 2021 10:16
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

Dificuldade com arquivo INI

Enviado: 20 Dez 2021 16:35
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.

Dificuldade com arquivo INI

Enviado: 21 Dez 2021 12:37
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.

Dificuldade com arquivo INI

Enviado: 21 Dez 2021 17:13
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

Dificuldade com arquivo INI

Enviado: 22 Dez 2021 08:45
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...

Dificuldade com arquivo INI

Enviado: 23 Dez 2021 12:27
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.

Dificuldade com arquivo INI

Enviado: 25 Dez 2021 09:11
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