Página 1 de 2

Dificuldade com arquivo INI

Enviado: 09 Dez 2021 16:09
por leandrolinauer
Boa tarde a todos.
Estou com uma certa dificuldade com arquivos .INI, segue abaixo o que preciso fazer.

Código: Selecionar todos

If NewMyPrinters(.T.) //minha função que pega o nome da impressora
 	iRead    :=HB_ReadIni("CONFIG_MAQ.INI" ) //configuração da maquina, individual para cada maquina contendo abaixo a linha que necessito.
              /// linha do config_maq.ini 
             ///[Impressora_folha]
            ///HP Laserjet Professional M1212nf MFP=29
        //cPrinter = guarda o nome da impressora retornado pela funcao newmyprinters() = "HP Laserjet Professional M1212nf MFP"
        i_PRINTER:=iRead["Impressora_folha"][cPrinter]  //aqui o problema, preciso passar o nome da impressora para pegar o valor = 29
       //Exatamente assim abaixo que da certinho, mas não na variavel cPrinter:
       // i_PRINTER:=iRead["Impressora_folha"]["HP Laserjet Professional M1212nf MFP"]  //aqui o problema, preciso passar o nome da impressora para pegar o valor = 29
EndIf

Pergunto, como passo para ler o arquivo ini com o nome da impressora dentro da variavel, já tentei e da erro.
"cPrinter"
"&cPrinter"
&cPrinter.
(cPrinter)
' " '+cPrinter+' " "
' " '+(cPrinter)+' " "
Como não trabalho com INI, só o básico e neste eu não consegui.
Se alguem puder me passar como se faz com variavel, fico grato.

Atenciosamente
Leandro

Dificuldade com arquivo INI

Enviado: 09 Dez 2021 16:37
por Jairo Maia
Tente mudar essa linha:

Código: Selecionar todos

i_PRINTER:=iRead["Impressora_folha"][cPrinter]
Para essa forma:

Código: Selecionar todos

i_PRINTER:=iRead["Impressora_folha"][@cPrinter.]
Se ainda não funcionar, tente dessa forma:

Código: Selecionar todos

i_PRINTER:=iRead["Impressora_folha"]["@cPrinter."]
Veja se dá certo.

Dificuldade com arquivo INI

Enviado: 09 Dez 2021 17:23
por leandrolinauer
Boa tarde Jairo.
O primeiro modo da erro de compilação

Código: Selecionar todos

i_PRINTER:=iRead["Impressora_folha"][@cPrinter.]

O segundo modo da erro de execução

Código: Selecionar todos

i_PRINTER:=iRead["Impressora_folha"]["@cPrinter."]
Erro: Descrição..........: Bound error

Persiste a dúvida.

Dificuldade com arquivo INI

Enviado: 09 Dez 2021 17:55
por Jairo Maia
Ok. Estou pressupondo que cPrinter seja uma variável Private que é definida na função NewMyPrinters(.T.), é isso? Tem certeza que cPrinter está retornando com o nome da impressora e não como NIL?

Se houver dúvida, abaixo da chamada de NewMyPrinters(.T.) coloque o seguinte:

Código: Selecionar todos

Hb_Alert( CStr( cPrinter ) )
Isso vai mostrar exatamente o que tem em cPrinter. Se quiser, faça esse teste, estou achando que cPrinter não está retornando correto então.

Dificuldade com arquivo INI

Enviado: 09 Dez 2021 18:22
por Vlademiro
Olá. Analisa o formato do hash retornado através da função hb_valtoexp.

? Hb_valtoexp( iRead )

Dificuldade com arquivo INI

Enviado: 10 Dez 2021 11:27
por leandrolinauer
Bom dia Jairo
"
Ok. Estou pressupondo que cPrinter seja uma variável Private que é definida na função NewMyPrinters(.T.), é isso? Tem certeza que cPrinter está retornando com o nome da impressora e não como NIL?
"
Sim, é uma variavel publica no inicio do programa para ver qual o nome da impressora.
Sim, esta variavel esta sendo manipulada pela Myprinter() e retorna com o nome, já visualizei ela certinho antes de passar para para o INI.

Respondendo do Vlademiro tbem aqui.
a Variavel cPrinter vem com o conteudo certinho "HP Laserjet Professional M1212nf MFP"
Quando passo escrito o nome i_PRINTER:=iRead["Impressora_folha"]["HP Laserjet Professional M1212nf MFP"] da certinho pega o valor no arquivo ini "29"
Quando passo a variavel i_PRINTER:=iRead["Impressora_folha"][cPrinter] //da bond error

O problema é como passar em variavel para ler arquivo INI.

Grato

Dificuldade com arquivo INI

Enviado: 10 Dez 2021 18:10
por JoséQuintas
Faça uma comparação entre a string digitada e a retornada.
Pode ter alguma "letrinha" diferente que está passando.

Código: Selecionar todos

#define NOME_TESTE "HP Laserjet..."

IF ! cPrinter == NOME_TESTE
   ? "alerta e mostrar"
ENDIF
Outro dia tinha uma letra diferente aqui, e deu trabalho pra perceber.

NÃO se esqueça que a != b não é o mesmo que ! a == b, que não é o mesmo que ! a = b

Dificuldade com arquivo INI

Enviado: 11 Dez 2021 10:47
por leandrolinauer
Bom dia a todos
Achei uma função no fórum e adaptei ela pra mim, segue abaixo ela.

Código: Selecionar todos

FUNCTION Retorna_INI(cArq, cSecao, cKey)  
Local hIni  := hb_IniRead(cArq) 
Local aSecao:= hIni[cSecao] 
Return aSecao[cKey] 

Código: Selecionar todos


       //notem que o conteudo da variável abaixo é o mesmo na linha que funciona escrito o nome, já na variavel não funciona
	oEnvCPrinter:='HP Laserjet Professional M1212nf MFP'
      	oMxPaper:=Val(Retona_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha','HP Laserjet Professional M1212nf MFP')) //assim funciona

      	oMxPaper:=Val(Retona_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',&oEnvCPrinter.)) //assim não
      	oMxPaper:=Val(Retona_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',&oEnvCPrinter)) //assim tbem não
      	oMxPaper:=Val(Retona_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',oEnvCPrinter)) //assim tbem não

Grato

Dificuldade com arquivo INI

Enviado: 14 Dez 2021 14:38
por leandrolinauer
Boa tarde a todos.
Alguém já passou por isto?, leitura dinâmica de um arquivo INI?

Dificuldade com arquivo INI

Enviado: 14 Dez 2021 15:56
por alxsts
Olá!

Os nomes de campos chave de uma variável do tipo hash são case sensitive. Para recuperar o valor de um elemento do hash através de sua chave, esta precisa ser escrita exatamente como foi definida na criação do hash. Verifique o conteúdo da variável cKey. Ele tem que estar exatamente igual ao que está buscando (maiúsculas e minúsculas), sem espaços ao final.

Dificuldade com arquivo INI

Enviado: 14 Dez 2021 16:17
por leandrolinauer
Boa tarde.
Meio caminho andado com a função hb_valtoexp()

Código: Selecionar todos

FUNCTION Retorna_INI(cArq, cSecao, cKey)  
Local hIni  := hb_IniRead(cArq) 
Local aSecao:= hIni[cSecao] 
hb_valtoexp( aSecao[cKey] ) //ACRESCENTANDO ESTA LINHA EU CONSIGO ENVIAR AGORA POR UMA VARIÁVEL.
Return aSecao[cKey] 

Abaixo o preparo para envio em variável

Código: Selecionar todos

oEnvCPrinter:='HP Laserjet Professional M1212nf MFP'
oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',oEnvCPrinter)) //AGORA FUNCIONA ENVIANDO PELA VARIAVEL
Agora continuo com problema porque não consigo enviar a variável

Código: Selecionar todos

oEnvCPrinter:=cPrinter
oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',oEnvCPrinter)) //DA ERRO NA LINHA HB_VALTOEXP()

Código: Selecionar todos

oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',cPrinter)) //DA ERRO NA LINHA HB_VALTOEXP()

Código: Selecionar todos

oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',&cPrinter.)) //DA ERRO NA LINHA HB_VALTOEXP()

Código: Selecionar todos

oEnvCPrinter:="'"+cPrinter+"'" 
oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',oEnvCPrinter)) //DA ERRO NA LINHA HB_VALTOEXP()
Então continuo com o problema e tbem não entendi o porque a HB_VALTOEXP informada o conteudo dentro do programa, mas carregando não.

Grato
Um abraço a todos

Dificuldade com arquivo INI

Enviado: 14 Dez 2021 19:18
por Vlademiro
A função hb_valtoexp é para pesquisar o conteúdo de uma variável qualquer. É geralmente usada para fins de depuração, para vc ver se está tudo bem. Nesse caso essa função deve ser usada em conjunto com alguma outra para ver o retorno dela. Por exemplo:

Alert( hb_valtoexp( variável ) )

Ou então

? Hb_valtoexp( variável )

Dificuldade com arquivo INI

Enviado: 15 Dez 2021 08:34
por Jairo Maia
leandrolinauer escreveu:Meio caminho andado com a função hb_valtoexp()
Negativo! Você ainda está em briga de foice no escuro, ou seja, está "perdidinho" rs...

Vou tentar explicar algumas coisas, veja:

Você está salvando seu INI de forma errada para o que você quer. Considerando que seu objetivo é pesquisar por uma impressora e obter um valor de identificação (no caso do exemplo, o 39), veja como seria o raciocínio para salvar isso em seu INI:

Para Salvar:

Código: Selecionar todos

Function Main()
 Local hSaveIni := Hash()

 hSaveIni["Impressora_folha"] := Hash()  // cria o grupo "Impressora_folha"
      
 cPrinter := "HP Laserjet Professional M1212nf MFP"   // define o nome da HashTag
 nIdPrinter := 39                                     // define o conteúdo da HashTag

 hSaveIni["Impressora_folha"][cPrinter] := nIdPrinter // Salva a HashTag no Ini

 HB_WriteIni( "Teste.ini", hSaveIni )

Return Nil
Para Ler:

Código: Selecionar todos

Function Main()
 Local hReadIni := HB_ReadIni( "Teste.ini" )

 cGrupo := "Impressora_folha"                        // define em qual grupo pesquisar
 cPrinter := "HP Laserjet Professional M1212nf MFP"  // define a HashTag a pesquisar

 nIdPrinter := hReadIni[cGrupo][cPrinter]            // retorna o conteúdo da HashTag

 hb_Alert( CStr( nIdPrinter ) )                      // mostra o conteudo retornado

Return Nil

Dificuldade com arquivo INI

Enviado: 16 Dez 2021 12:22
por leandrolinauer
Bom dia.
Estou perdido mesmo, rsrsrsrs e continuo rsrsrs

Código: Selecionar todos

///cPrinter retorna o nome da impressora através da função 
 //   hDc := WIN_PRINTDLGDC( @cPrinter, , , ) //mostra a tela de dialog do windows para escolher as impressoras instaladas e retorna o conteudo na variavel publica cprinter
// neste momento a cprinter contem o nome da impressora como abaixo
oEnvCPrinter:='HP Laserjet Professional M1212nf MFP' //DA CERTO colocando o nome diretamente
oEnvCPrinter:=cPrinter //NAO DA CERTO informando o nome da variavel preenchida
oMxPaper:=Val(Retorna_INI( wD_IniExe+'CONFIG_MAQ.INI','Impressora_folha',oEnvCPrinter))

Código: Selecionar todos

FUNCTION Retorna_INI(cArq, cSecao, cKey)  
Local hIni  := HB_ReadINI(cArq) 
Return hIni[cSecao][cKey] 
///função retorna ini é igualzinha a sua passada, só com outras variaveis.

Código: Selecionar todos

Function Main()
 Local hReadIni := HB_ReadIni( "Teste.ini" ) = Local hIni  := HB_ReadINI(cArq) 

 cGrupo := "Impressora_folha"                        //   (PASSO na cSecao)
 cPrinter := "HP Laserjet Professional M1212nf MFP"  // r (PASSO na cKey)

 nIdPrinter := hReadIni[cGrupo][cPrinter]            //  = Return hIni[cSecao][cKey] 

 hb_Alert( CStr( nIdPrinter ) )                      // mostra o conteudo retornado

Return Nil
O problema que não funciona se eu enviar a cPrinter

Dificuldade com arquivo INI

Enviado: 16 Dez 2021 12:39
por leandrolinauer
Bom dia,

Fui dar uma olhada na cPrinter e descobri que o problema é só nela mesmo.
Esta variável publica esta com algum conteudo retornado pela WIN_PRINTDLGDC( @cPrinter, , , ) que não passa pela leitura da HASH

Problema, não sei consertar isto, visto que o conteudo dela é visto no sistema certinho e lido sem problema, mas já na HASH da erro.

alguem sabe qual é o formato de retorno da WIN_PRINTDLGDC( @cPrinter, , , )
Pra mim ela retorna uma string caracter tanto que mostro ela no sistema na mensagem e ela é igualzinha se tivesse sido preenchida com o conteudo
Assim:

Código: Selecionar todos

cPrinter:='HP Laserjet Professional M1212nf MFP'
WIN_PRINTDLGDC( @cPrinter, , , )
parece que para a HASH os conteudos acima são diferentes, mas aonde e no que?
Não descobri nada sobre isto, sou leigo em HASH, eu utilizava ela fixa como todos os exemplos na net.
Desta forma:

Código: Selecionar todos

[Config]
SERVIDOR=\\SERVIDOR
MODO=PRODUCAO
....
Agora preciso usar dinamico

Código: Selecionar todos

[Impressora_folha]
HP Laserjet Professional M1212nf MFP=29
Onde o nome da impressora antes do valor =29 é dinamico, de acordo com cada impressora instalada e por maquina,

Estou testando apenas leitura, não parti para a gravação ainda.
Grato a todos