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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 3109
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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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