Dificuldade com arquivo INI

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

Moderador: Moderadores

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.
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
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 »

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.
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.
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.
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 »

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.
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)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Dificuldade com arquivo INI

Mensagem por Vlademiro »

Olá. Analisa o formato do hash retornado através da função hb_valtoexp.

? Hb_valtoexp( iRead )
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
"
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
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Dificuldade com arquivo INI

Mensagem 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
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/
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 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
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.
Alguém já passou por isto?, leitura dinâmica de um arquivo INI?
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Dificuldade com arquivo INI

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
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.
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
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Dificuldade com arquivo INI

Mensagem 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 )
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: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
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.
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
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,

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
Editado pela última vez por Jairo Maia em 18 Dez 2021 07:29, em um total de 2 vezes.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Responder