Imprimir Relatórios
Moderador: Moderadores
-
Josmar dos Santos
- Usuário Nível 3

- Mensagens: 277
- Registrado em: 11 Jan 2006 18:36
- Localização: Botucatu-SP
Imprimir Relatórios
Boa noite amigos. No Clipper52 eu estava imprimindo os meus relatórios utilizando uma LIB do Professor Maligno chamada de "WAPI". Nos relatórios ele imprimia na tela e ao acionar a tecla F6 dava-se a opção de uma lista de impressoras conectada na rede para escolher e imprimir o mesmo. No entanto, eu migrei o meu sistema para Harbour e o compilador do mesmo não aceita essa LIB. Eu gostaria de saber se é possível introduzir essa LIB ao Harbour? E se for, como fazer? Caso contrário, há uma outra opção? Se tiver gostaria de pedir gentilmente que os colegar postassem algum exemplo.
Obrigado
Josmar
Obrigado
Josmar
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Imprimir Relatórios
Bom dia Josmar.
Eu usei comandos para capturar as impressoras instaladas no pc.
Esta função apenas seleciona a impressora, a parte de imprimir vem depois, se precisar dela tbem te passo.
Um abraço.
:xau
Eu usei comandos para capturar as impressoras instaladas no pc.
Código: Selecionar todos
Function MyPrinters()
Local aRet:=.T.
Local hDC
Set Key -5 To
hDc := WIN_PRINTDLGDC( @cPrinter, , , ) //mostra a tela de dialog do windows para escolher as impressoras instaladas
If Empty(hDC)
aRet:=.F. //para finalizar
Else
cPrDoor:=WIN_PRINTERPORTTONAME(cPrinter) // pega a porta da impressora
cPrModel:=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL".Or.Left(cPrDoor,2)$"\\","MATRICIAL","LASER")
//cprmodel apenas me informa se a impressora é MATRICIAL ou LASER, eu instalo a impressora MATRICIAL e escrevo no nome dela (MATRICIAL) para que o sistema pelo nome descobre que esta impressora é texto e não gráfico para lá na frente imprimir pelo printfileraw e não win32prn
EndIf
Set Key -5 To MyPrinters()
Return aRet
Um abraço.
:xau
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
Josmar dos Santos
- Usuário Nível 3

- Mensagens: 277
- Registrado em: 11 Jan 2006 18:36
- Localização: Botucatu-SP
Imprimir Relatórios
Leandro, obrigado pela sua atenção! Sim, eu agradeceria se vc me passasse, estou acumulado todos os materiais possíveis para eu fazer um estudo detalhado para eu poder melhorar o meu sistema...
Agradeço desde já..
Josmar
Agradeço desde já..
Josmar
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Imprimir Relatórios
Bom dia.
Te ajudo sim, segue abaixo mais detalhes da forma de impressão genérica, atende todos os relatórios que antes eu imprimia somente em LX-300 na porta fixa LPT1, passando agora com esta função imprimir tando na LX-300 como demais impressoras registradas no windows.
Começo a utilização da função desta forma abaixo:
ONDE:
C_IMPRIME() // FUNÇÃO QUE CHAMA A IMPRESSORA DESEJADA
IMPRIME() //FUNÇÃO DOS PROWS DA VIDA, MONTAGEM DA IMPRESSÃO ONDE SÓ ALTEREI SET PRINTER PARA ARQUIVO
//Set Device To Print
//Set Printer To &cP_Printer.// AQUI ERA ANTES LPT1
E_IMPRIME() //FUNCAO QUE CHAMA A FORMA DE IMPRESSÃO.
Este é o modo completo de impressão genérico que utilizo, o problema deste modo é que sai tudo igual a impressão, não tem como fazer desta forma um cabeçalho mais detalhado, etc, para isto utilizo um outro metodo para impressão em pixell, aí sim a coisa muda de figura.
A resposta anterior, foi faltado este final porque teclei errado e computador publicou.
Espero ter lhe ajudado.
Bom final de semana.
:xau
Te ajudo sim, segue abaixo mais detalhes da forma de impressão genérica, atende todos os relatórios que antes eu imprimia somente em LX-300 na porta fixa LPT1, passando agora com esta função imprimir tando na LX-300 como demais impressoras registradas no windows.
Começo a utilização da função desta forma abaixo:
Código: Selecionar todos
If NewAnsWer("Confirma impressão?").And.c_Imprime(File1Tmp)
imprime()
e_Imprime()
EndIf
C_IMPRIME() // FUNÇÃO QUE CHAMA A IMPRESSORA DESEJADA
IMPRIME() //FUNÇÃO DOS PROWS DA VIDA, MONTAGEM DA IMPRESSÃO ONDE SÓ ALTEREI SET PRINTER PARA ARQUIVO
//Set Device To Print
//Set Printer To &cP_Printer.// AQUI ERA ANTES LPT1
E_IMPRIME() //FUNCAO QUE CHAMA A FORMA DE IMPRESSÃO.
Código: Selecionar todos
Function c_Imprime(pPrinter,aPo,aLn)
Local aRet:=.T.
Local lIp
Public nPrinter:=If(pPrinter=Nil,"IMPRESSO",pPrinter)
aPo:=If(aPo=Nil,"V",aPo)
aLn:=If(aLn=Nil,If(aPo=="V",137,182),aLn) //tem que ser 137
cP_Printer:=wD_Retorno+nPrinter+".PRN" //manda tudo para o arquivo de impressãoo
aRet:=MyPrinters()
lIp:=If(("DATAMAX" $ Upper(cPrinter)),"DATAMAX","OUTRA") //é que uso tbem a datamax para etiqueta
If lIp=="DATAMAX"
ShowMessage(,,"DATAMAX - Foi selecionado uma impressora etiquetadora, impressão cancelada.",0)
aRet:=.F.
EndIf
If(aRet=.T.,ShowWait(,,"Imprimindo em "+cPrinter+"..."),.T.)
Return aRet
Function MyPrinters()
Local aRet:=.T.
Local hDC
Set Key -5 To
ShowWait(,,"Localizando impressoras")
hDc := WIN_PRINTDLGDC( @cPrinter, , , ) //mostra a tela de dialog do windows para escolher as impressoras instaladas
CloseWindow()
If Empty(hDC)
aRet:=.F. //para finalizar
Else
cPrDoor:=WIN_PRINTERPORTTONAME(cPrinter) // pega a porta da impressora
cPrModel:=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL".Or.Left(cPrDoor,2)$"\\","MATRICIAL","LASER") //nao da certo escrito
c_CfImpressora() //CONFIGURA OS CHR
EndIf
Set Key -5 To MyPrinters()
Return aRet
Function e_Imprime(aLn,aPo,aTl,aNF,aIA,aIL)
Local o_mail
aPo:=If(aPo=Nil,"V",aPo)
aLn:=If(aLn=Nil,If(aPo=="V",137,182),aLn) //tem que ser 137
aTl:=If(aTl=Nil,Nil,aTl) //altura da linha
aIA:=If(aIA=Nil,1 ,aIA)
aIL:=If(aIL=Nil,18,aIL) //22 para o padrao maior mais cumprimido na linha são mais caracteres na linha, menor menos caracteres na linha
aNF:=If(aNF=Nil,.F.,aNF)
If Right(cP_Printer,3)=="PRN" //‚ arquivo
If cPrDoor$"File" //se for arquivo
FRename(wD_Retorno+nPrinter+".PRN",wD_Retorno+cP_Printer+".TXT") //renomear //ver
Else
ImpWIN32PRN(wD_Retorno+nPrinter+".PRN",aLn,aPo,aTl,aNF,aIA,aIL)
FErase(wD_Retorno+nPrinter+".PRN") //apaga prn
EndIf
cPrinter :=WIN_PRINTERGETDEFAULT() //HB_GetDefaultPrinter()
cPrModel:=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL","MATRICIAL","LASER")
cPrDoor :=If(cPrModel=="MATRICIAL","LPT1","USB") //erro provavel
cP_Printer:=cPrDoor
nPrinter :=""
EndIf
CloseWindow()
Return .T.
Function ImpWIN32PRN(cArq,tamrel,aPo,aTl,aNf,aIA,aIL) // arquivo e tamanho da linha
Local cTexto, nLinhas, nA, cLinha, oPrinter
oPrinter:=Win_prn():New(cPrinter) //tem que colocar porque senao nao cria o metodo uso a WIN_PRN (HARBOUR)
If oPrinter:create()
oPrinter:Landscape:=If(aPo=="H",.T.,.F.) //VERTICAL=.F. // HORIZONTAL=.T.
oPrinter:FormType :=1
oPrinter:Copies :=1
oPrinter:CharSet(255)
oPrinter:SetPrintQuality(1) //qualidade da impressãoo 1 rascunho 2 normal 3 media 4melhor
oPrinter:StartDoc()
oPrinter:SetFont("LUCIDA CONSOLE",12,{aIA,aIL},700,.F.,.F.) //ficou menos agredido na folha
nOrgAlt :=oPrinter:LineHeight()
If aTl#Nil //altura da linha
oPrinter:LineHeight :=Int(nOrgAlt-((nOrgAlt*aTl)/100))
EndIf
oPrinter:PosY:=0 //linha |
oPrinter:PosX:=0 //coluna x --->
If cPrModel=="MATRICIAL" //para que use em modo texto
Prn_HANDLE:=FOpen(cArq,1) //abre o arquivo
FSeek (Prn_HANDLE,0,1) //POSICIONE NO INICIO DO ARQUIVO
FWrite(Prn_HANDLE,cComI,1) //comprimir o arquivo de impressao todos condensed
FSeek (Prn_HANDLE,0,2) //POSICIONE NO FIM DO ARQUIVO
FWrite(Prn_HANDLE,cNorI) //volta ao normal a impressora
FClose(Prn_HANDLE)
Win_PrintFileRaw(cPrinter,cArq,"")
Else
oPrinter:TextOut(Space(TamRel),.T.)
cTexto :=MemoRead(cArq)
nLinhas :=mLCount(cTexto,TamRel,1,.F.)
For nA:= 1 To nLinhas
cLinha:=MemoLine(cTexto,TamRel,nA,1,.F.)
aPosCa:=At("",cLinha) //posicao do eject
xLinha:=Left (cLinha,aPosCa)
yLinha:=Right(cLinha,aPosCa)
If aPosCa>0 //tem eject
cLinha:=xLinha+yLinha
EndIf
If aPosCa>0.And.nA<nLinhas //SALTO_PAGINA
oPrinter:NewPage() //eject
ElseIf (Left(AllTrim(cLinha),80)==Repl("Ä",80).Or.;
Left(AllTrim(cLinha),80)==Repl("-",80).Or.;
Left(AllTrim(cLinha),80)==Repl("_",80)).And.;
!Left(AllTrim(cLinha),100)==Repl("-",100)
oPrinter:TextOut(Repl(hb_oemTOansI("-"),TamRel),.T.)
Else //If !Empty(AllTrim(cLinha))
oPrinter:TextOut(HB_oemTOansi(Left(cLinha,TamRel)),.T.)
EndIf
Next
EndIf
oPrinter:EndDoc()
oPrinter:Destroy()
Else
ShowMessage(,,"Erro na criação do arquivo de impressão.",0)
EndIf
Return NIL
A resposta anterior, foi faltado este final porque teclei errado e computador publicou.
Espero ter lhe ajudado.
Bom final de semana.
:xau
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
Josmar dos Santos
- Usuário Nível 3

- Mensagens: 277
- Registrado em: 11 Jan 2006 18:36
- Localização: Botucatu-SP
Imprimir Relatórios
Leandro, mais uma vez obrigado por compartilhar os seus conhecimentos. Já copiei as fontes e já vou começar os testes hoje mesmo. Assim que eu tiver os resultados te informarei no fórum. Que Deus te abençoe.
Josmar
Josmar
-
Josmar dos Santos
- Usuário Nível 3

- Mensagens: 277
- Registrado em: 11 Jan 2006 18:36
- Localização: Botucatu-SP
Imprimir Relatórios
Bom dia Leandro, essas funções: ShowMessage, ShowWait e CloseWindow pertencem à biblioteca "hbwin" ? Se for, essa biblioteca já está configurada no meus arquivos *.hbp. Te pergunto isso porque estou adaptando essas funções q vc me passou ao meu sistema e ao compilar deu erro no harbour, ou seja: está pedindo essas funções.
Josmar
Josmar
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Imprimir Relatórios
Bom dia Josmar.
Desculpe a demora, eu não havia acessado o fórum por estes dias, muitas tarefas.
Bom, estas funções ShowMessage, ShowWait e CloseWindow são funções de tratamento de tela (desenhos), criadas por mim.
Showmessage(), mostra tela de mensagem de erro.
ShowWait(), abre a tela de mensagem mas não finaliza
CloseWindow(), finaliza uma showwait(), Openwindow() e a showmessage().
Não fazem parte essencial do funcionamento da função de impressão, ou seja, cada um tem um modo de chamar tela de desenho ou mensagens exemplo ALERT(), ou seja, não atrapalham em nada.
Mas se você quiser elas, te passo tbem.
Um abraço.
T+
:xau
Desculpe a demora, eu não havia acessado o fórum por estes dias, muitas tarefas.
Bom, estas funções ShowMessage, ShowWait e CloseWindow são funções de tratamento de tela (desenhos), criadas por mim.
Showmessage(), mostra tela de mensagem de erro.
ShowWait(), abre a tela de mensagem mas não finaliza
CloseWindow(), finaliza uma showwait(), Openwindow() e a showmessage().
Não fazem parte essencial do funcionamento da função de impressão, ou seja, cada um tem um modo de chamar tela de desenho ou mensagens exemplo ALERT(), ou seja, não atrapalham em nada.
Mas se você quiser elas, te passo tbem.
Um abraço.
T+
:xau
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
Josmar dos Santos
- Usuário Nível 3

- Mensagens: 277
- Registrado em: 11 Jan 2006 18:36
- Localização: Botucatu-SP
Imprimir Relatórios
Boa tarde Leandro. Obrigado por responder. Se vc poder me passar eu agradeceria. É sempre bom ter algo a mais para aprendizado. Só uma pergunta: O meu sistema está em modo console. Essas funções de captação da caixa de diálogo do Windows de impressão funcionam em modo console? Talvez seja até uma pergunta boba, mas para mim não é!!!
Um abraço
Josmar
Um abraço
Josmar
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Imprimir Relatórios
Boa tarde
Não você terá que migrar para GUI, não testei se a função WIN_PRINTDLGDC funciona em console, mas creio que não porque ela é gui.
Então vc terá que migrar para gui, o que eu to usando como gui é a GT_WVW, mas não gostei dela limita muito o designer e estou tentando migrar para HW_Gui, só não consegui ainda porque as duas não funcionam juntas, pelo menos não consegui ainda.
Então já que você ainda não esta em GUI, sugiro que migre para HW_GUI e daí as minhas funções não lhe serviriam, mas contudo colocar o fonte abaixo.
::Janelas
::fecha janelas
:: MENSAGENS
:: botões para a newanswer, showmessage e/ou direto
//ufa, creio que é o final de todas os defines abaixo para execução em gui da forma acima.
#include "Fileio.ch"
#include "Fiscal.ch"
#include "setcurs.ch"
#Include "button.ch"
#Include "box.ch"
#include "inkey.ch"
#include "memoedit.ch"
#include "common.ch"
#Include "winuser.ch"
#Include "HBGtinfo.ch" //tanto para gtwvw como gtwvg
#Include "Windows.Ch"
#Include "hbsetup.ch"
#Include "tbrowse.ch"
#Include "hbclass.ch"
#include "Directry.ch"
#include "error.ch"
#include "getexit.ch"
#include "WINGDI.CH"
#include "hbcompat.ch" //impressao
#include "hbsqlit3.ch"
#include "tip.ch"
Espero ter lhe ajudado e não confundido, hehehehe.
Demorei para chegar neste padrão de tela, mas mesmo assim quero migrar para HW_GUI.
Um abraço
T+
)
:)Pos
Não você terá que migrar para GUI, não testei se a função WIN_PRINTDLGDC funciona em console, mas creio que não porque ela é gui.
Então vc terá que migrar para gui, o que eu to usando como gui é a GT_WVW, mas não gostei dela limita muito o designer e estou tentando migrar para HW_Gui, só não consegui ainda porque as duas não funcionam juntas, pelo menos não consegui ainda.
Então já que você ainda não esta em GUI, sugiro que migre para HW_GUI e daí as minhas funções não lhe serviriam, mas contudo colocar o fonte abaixo.
::Janelas
Código: Selecionar todos
Procedure OpenWindow(nTop,nLft,nBot,nRig,sTxt,iTxt,cBtt,cDsk,lSom,dB,nSty,nStr)
Local LCursor:=SetCursor(),aRow:=Row(),aCol:=Col(),LColor:=SetColor()
SetCursor(0)
cBtt:=If(cBtt=Nil,"GR+/B",cBtt) // -> cor do titulo
cDsk:=If(cDsk=Nil,"W/W",cDsk) // -> cor da tela
nSty:=If(nSty=Nil,0,nSty)
COR_WINDOWS_XP
nBot:=If(nBot=Nil,w_MxR,nBot) //maxima 25
nRig:=If(nRig=Nil,MaxCol()-1,nRig)
nBot:=If(nBot > w_MxR,w_MxR,nBot)
nCurWindow:=WVW_NOpenWindow(If(sTxt=Nil,"",sTxt),nTop+1,nLft,nBot,nRig) //cria a janelas
WVW_SetIcon(,wD_Images+"icon.ico")
ResetObjects( nCurWindow )
COR_DE_FUNDO
If nSty>0
NewDrawField(nTop+1,nLft ,nRig,,10,nTop+4) //faz o quadrado de cima da janela
NewShowLabel(nTop+1,nLft,Right(sTxt,Len(sTxt)-4),"ESQUERDA","NAVYBLUE",64,14,nTop+3,nRig-7,RGB(230,230,250),"ARIAL",,Str(nCurWindow,5)+"FUNDO_JANELA_TOP") //escreve o texto da janela
NewDrawField(nTop+1,nRig-6,nRig,,10,nTop+4) //faz o quadrado de cima da figura lado direito
AddObjects(nCurWindow,{|nWindow| wvw_DrawImage( nWindow,nTop+1,nRig-6,nTop+3,nRig,nSty)}) //figura do lado direito em cima
If nStr#Nil //cor do fundo //se habilitado o desenho debaixo
NewShowLabel(nBot-2,nLft,"","ESQUERDA","VERMELHO",10,,nBot+1,nRig,nStr) //cor do fundo
NewDrawField(nBot-2,nLft ,nRig,,12,nBot+1) //linha do fundo
EndIf
EndIf
wvw_paint(nCurWindow)
COR_NORMAL
Return Nil
Código: Selecionar todos
Procedure CloseWindow()
Local lCursor:=SetCursor(0)
Local Ls,Cs,Li,Ci
WVW_lCloseWindow()
nCurWindow--
wvw_paint(nCurWindow)
SetCursor(lCursor)
Return .T.
Código: Selecionar todos
Procedure ShowMessage(nTop,nLft,cMsg,cTime,cTxt) //mensagens FIXA
Return DrawShow(cMsg,cTxt,nTop,{"&Ok"},1,1,2)
//*
Procedure ShowWait(nTop,nLft,cMsg,cTxt) //mensagem de processamento
Return DrawShow(cMsg,cTxt,nTop,,,,3)
//*
Procedure ShowWaitProc(aMessage,oTempo)
Local xTempo:=Seconds()-aSeconds
WVW_ProcessMessages()
If oTempo # Nil .And. oTempo > 0
ShowWait(,,aMessage)
Inkey(oTempo)
CloseWindow()
EndIf
If xTempo>2.Or.mpg=0//segundos
aSeconds:=Seconds()
mpg:=If(mpg>60,0,mpg+1)
wvw_Paint(nCurWindow)
EndIf
Return .T.
//*
Function NewAnsWer(cMsg,cTxt,nTop,nBut,nNil,nEsc,nFoc,nSho) //perguntas
Return DrawShow(cMsg,cTxt,nTop,nBut,nEsc,nFoc,nSho)
// SHOWMESSAGE, SHOWWAIT, NEWANSWER chamam a debaixo para execução.
Function DrawShow(cMsg,cTxt,nTop,nBut,nEsc,nFoc,nSho) // FAZ TODA TELA DE EXECUCAO : ANSWER, SHOWWAIT, ETC chamando a DRAWEXEC
Local nLft,nRig,nBot // controla a posicao da janela, ficando controlado os valores para cada uma delas
Local aMsg:={} //controla a mensagem, colocando assim local fica as escritas corretas para cada janela
mpg :=0 //controla o carrinho passando, assim fica uma posicao para cada janela
//////////// DEFINICAO DAS VARIAVEIS ACIMA
//////////// Acerto dos dados abaixo
nSho:=If(nSho=Nil,1,nSho)
cMsg:=If(cMsg=Nil.And.nSho=3,{"Aguarde processamento..."},If(cMsg=Nil,"Escolha a opção desejada, ou <ESC> para cancelar.",cMsg))
nFoc:=If(nFoc=Nil,2,nFoc)
cTxt:=If(cTxt=Nil,"Atenção!",cTxt)
nTop:=If(nTop=Nil,10,If(nTop>15,1,nTop))
nBot:=nTop+8
//////////// Transforma cMsg em MATRIZ
If ValType(cMsg)=="A"
aMsg:=cMsg
Else
AAdd(aMsg,cMsg)
EndIf
/// chamo a drawexec e oresto é faz tudo
Return DrawExec(aMsg,cTxt,nTop,nLft,nRig,nBot,nBut,nEsc,nFoc,nSho)
//*
Function DrawExec(aMsg,cTxt,nTop,nLft,nRig,nBot,nBut,nEsc,nFoc,nSho)
Local Keyin:=0,aRet:=If(nBut=Nil,"L","N") //controla se é logico ou nao
Local oMText:=0
nBut:=If(nBut=Nil,{"&Sim","&Não"},nBut)
nLft:=If(nSho=3,10,If(Len(nBut)=4,15,If(Len(nBut)=3,20,25)))
nRig:=If(nSho=3,70,If(Len(nBut)=4,65,If(Len(nBut)=3,60,55)))
//////////// Verifica qual linha é a maior para saber o tamanho da janela abaixo
For ixx:=1 To Len(aMsg)
oMText:=If(Len(aMsg[ixx]) > oMText,Len(aMsg[ixx]),oMText)
Next
//////////// Arruma o tamanho da janela de acordo com o texto
While oMText > (nRig-nLft-4) //-08 -5
nLft-- //mais para esquerda
nRig++ //mais para direita
If nLft <= 1 //.Or. nRig > 100
Exit
EndIf
End
//////////// Emite som apenas para pergunta e exclamação
//////////// nsho 1 = PERGUNTA
//////////// nsho 2 = EXCLAMACAO
//////////// nsho 3 = AGUARDE BONECO
//////////// nsho 4 = AGUARDE CARRINHO
//////////// nsho 5 = PROCESSAMENTO AZUL
If nSho=1 //pergunta
C_PLAYSOUND(wD_Audios+"pergunta.wav")
ElseIf nSho=2 //exclamacao
C_PLAYSOUND(wD_Audios+"notifica.wav")
EndIf
//////////// AQUI COMEÇA O DESENHO
//SetCursor(0)
//////////// 1º= LABEL TEXTO EM NEGRITO ; 2º= LINHA SEPARADORA ; 3º= BOX COM FUNDO BRANCO PARA TEXTO ; 4º= LINHA SEPARADORA
If wE_ModelSys$"NB".And.nSho=2 //resposta vermelho
//novo
xDfB:=nBot-nTop
nTop:=If(nTop-2 > 1,nTop-2,nTop)
nBot:=nTop+xDfB
OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(139,0,0))}) //39,64,139 54,54,54
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot ,nRig ,RGB(139,0,0))}) //39,64,139 54,54,54
NewShowLabel(nTop-1,nLft," "+cTxt,"ESQUERDA","AMARELO",64,14,nTop-1,nRig-8,RGB(139,0,0),"ARIAL")
ElseIf wE_ModelSys$"NB".And.nSho=1 //pergunta azul
xDfB:=nBot-nTop
nTop:=If(nTop-2 > 1,nTop-2,nTop)
nBot:=nTop+xDfB
OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(0,0,139))}) //39,64,139 54,54,54
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot ,nRig ,RGB(0,0,139))}) //39,64,139 54,54,54
NewShowLabel(nTop-1,nLft+1," "+cTxt,"ESQUERDA","AMARELO",64,14,nTop-1,nRig-8,RGB(0,0,139),"ARIAL")
ElseIf wE_ModelSys$"NB".And.nSho=3 //showwait
xDfB:=nBot-nTop
nTop:=If(nTop-2 > 1,nTop-2,nTop)
nBot:=nTop+xDfB
OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(255,215,0))}) //39,64,139 54,54,54
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot ,nRig ,RGB(255,215,0))}) //39,64,139 54,54,54
NewShowLabel(nTop-1,nLft+1," "+cTxt,"ESQUERDA","PRETO",64,14,nTop-1,nRig-8,RGB(255,215,0),"ARIAL")
Else //antigo
OpenWindow(nTop-2,nLft,nBot,nRig) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_DrawLabel(nWindow,nTop+1,nLft+1,cTxt+":",TA_LEFT,,RGB( 0,0,0),,"ARIAL",20-o_wvwFR,12-o_wvwLR,700,,.T.,)})
EndIf
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot-3,nRig,RGB(255,255,255))}) //
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nTop+1,nLft,nTop+1,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nBot-3,nLft,nBot-3,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID linha final
/////////// Desenha a imagem da tela //pergunta exclamacao a esquerda
AddObjects( nCurWindow, {|nWindow| wvw_DrawImage( nWindow,nTop+2,nLft,nTop+5,nLft+7,nSho)})
If nSho=3
/////////// Desenha a imagem da tela a direita se for aguarde processamento
AddObjects(nCurWindow,{|nWindow| wvw_DrawImage( nWindow,nTop+2,nRig-8,nTop+5,nRig,6)})
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nBot-1,nLft,nBot ,nRig,RGB(255,255,255))}) //
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nBot-2,nLft,nBot-2,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nBot ,nLft,nBot ,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID linha final
/////////// Desenha o carrinho em baixo a esquerda
AddObjects( nCurWindow, {|nWindow| wvw_DrawImage( nWindow,nBot-1,nLft+mpg,nBot,nLft+3+mpg,4)})
EndIf
/////////// Abaixo as linhas com os textos se existirem
If Len(aMsg)>=3
If(Len(aMsg)>=1,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+2,If(nSho<=2,nLft+10,40),aMsg[1],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
If(Len(aMsg)>=2,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+3,If(nSho<=2,nLft+09,40),aMsg[2],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.)
If(Len(aMsg)>=3,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+4,If(nSho<=2,nLft+09,40),aMsg[3],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
If(Len(aMsg)>=4,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+5,If(nSho<=2,nLft+09,40),aMsg[4],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
ElseIf Len(aMsg)>=1
If(Len(aMsg)>=1,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+3,If(nSho<=2,nLft+10,40),aMsg[1],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
If(Len(aMsg)>=2,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+4,If(nSho<=2,nLft+09,40),aMsg[2],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.)
EndIf
MyKeyBoard("")
////////// CHAMA O REDEZENHO NO ATO DO FINAL DA EDICAO DA MENSAGEM passi so para nsho3
wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse
/////////// Se for pergunta ou mensagem, mostra o botão e fecha a janela
If nSho<=2
Keyin:=MyNewButton(nBot-1,nFoc,nBut,nRig,.F.)
CloseWindow()
Else
EndIf
Return If(aRet=="L",Keyin=1,Keyin)
Código: Selecionar todos
Function BtClick(OnClick)
oBKey:=nBPos:=OnClick
HB_KeyPut(13)
Return .T.
//*
Static Procedure PCNewButton(nBot,nFoc,nBut,nCol)
nBSty:=1
nBStB:=Nil //0.5 //1.0 = todo botao, 0.5 50% 0 = nao vai ser estidado
nBM3D:=Nil //.T. //.T. transparante .f. nao transparente
nBImg:=Nil //wD_Images+"OK3D.BMP"
nColA:=nCol-11 //11 77 ou 69 -1 inicial na direita da tela
wvw_pbsetfont(, ,19-o_wvwFR,8-o_wvwLR,FW_BOLD)
If Len(nBut)>=5 //tem quarto botao //img //bloco //aof //1.0 0.5 0
If(nBPos>0,wvw_PBDestroy(NIL,nBt5),.T.) //se existir eu apago //IT
nBt5:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=5,"(","")+ MyWinLetra(nBut[5])+If(nFoc=5,")",""),nBImg, {|| BTClick(5) }, Nil,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt5,If(nFoc=5,nBSty,)) //TRANSPARENTE
nColA:=nColA-12
EndIf
If Len(nBut)>=4 //tem quarto botao //img //bloco //aof //1.0 0.5 0
If(nBPos>0,wvw_PBDestroy(NIL,nBt4),.T.) //se existir eu apago //IT
nBt4:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=4,"(","")+ MyWinLetra(nBut[4])+If(nFoc=4,")",""),nBImg, {|| BTClick(4) }, Nil,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt4,If(nFoc=4,nBSty,)) //TRANSPARENTE
nColA:=nColA-12
EndIf
If Len(nBut)>=3 //tem terceiro botao
If(nBPos>0,wvw_PBDestroy(NIL,nBt3),.T.)
nBt3:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=3,"(","")+ MyWinLetra(nBut[3])+If(nFoc=3,")",""),nBImg, {|| BTClick(3) }, NIL,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt3,If(nFoc=3,nBSty,))
nColA:=nColA-12
EndIf
If Len(nBut)>=2 //tem segundo botao
If(nBPos>0,wvw_PBDestroy(NIL,nBt2),.T.)
nBt2:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=2,"(","")+ MyWinLetra(nBut[2])+If(nFoc=2,")",""),nBImg, {|| BTClick(2) }, NIL,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt2,If(nFoc=2,nBSty,))
nColA:=nColA-12
EndIf
If Len(nBut)>=1 //tem primeiro botao
If(nBPos>0,wvw_PBDestroy(NIL,nBt1),.T.)
nBt1:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=1,"(","")+ MyWinLetra(nBut[1])+If(nFoc=1,")",""),nBImg, {|| BTClick(1) }, NIL,nBStB,nBM3D) //__Keyboard(K_ENTER)
wvw_pbSetStyle(NIL, nBt1,If(nFoc=1,nBSty,))
EndIf
wvw_pbSetFocus(NIL,If(nFoc=5,nBt5,If(nFoc=4,nBt4,If(nFoc=3,nBt3,If(nFoc=2,nBt2,nBt1))))) //focaliza
Return
Procedure MyNewButton(nBot,nFoc,nBut,nCol,nAud,nVie,nLft,nTxt,nFun)
Local xbFundo:=RGB(245,245,220)
Private oBKey:=nBPos:=nBSty:=Ch:=0
Private nBt1:=nBt2:=nBt3:=nBt4:=nBt5:=""
nAud:=If(nAud=Nil,.T.,nAud)
nVie:=If(nVie=Nil,.F.,nVie) //mostra a imagem do boneco
nLft:=If(nLft=Nil,nCol-(10*Len(nBut)),nLft) //coloca a imagem no canto esquerdo da tela
If nAud = .T.
C_PLAYSOUND(wD_Audios+"pergunta.wav")
If nVie = .T.
/////////// Desenha a imagem da tela //pergunta // exclamacao
NewDrawField(nBot-1,nLft,nCol,"",10,nBot+2) //8 linha
NewShowLabel(nBot-1,nLft,"",3,"VERMELHO",30,10,nBot+1,nCol,xbFundo) //,,"FUNDO_BUTTON")
If nTxt # Nil
NewShowLabel(nBot,nLft+1,nTxt,"ESQUERDA","NAVYBLUE",24,11,nBot,nCol,xbFundo) //,,"FUNDO_BUTTON")
EndIf
wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse
EndIf
EndIf
PcNewButton(nBot,nFoc,nBut,nCol)
nBPos:=nFoc //foco do botao
nTBt:=Len(nBut) //tamanho do botao
nTBw:=If(nFun # Nil,0,0) //tempo de execucao automatica do botao
Do while !((ch:=inkey(nTBw))==K_ESC) //1 segundo para ele entrar e desenhar a função
If nFun # Nil
ChkLibVenda(.F.) //funcao minha de venda que nao importa para desenhos
EndIf
Do Case
Case ch==K_ENTER //.Or.ch==K_LDBLCLK //enter para selecionar o botao nao colocar
oBKey:=nBPos //recebe o botao posicionado
Case ch==K_TAB .Or. ch==K_RIGHT .Or. ch==K_DOWN //tab avan‡a
nBPos++
Case ch==K_SH_TAB.Or. ch==K_LEFT .Or. ch==K_UP //shift + tab volta
nBPos--
Case (ch<=-1.And.ch>=-9).Or.ch=28.Or.ch=-40.Or.ch=-41 //Fs chama as teclas de funcao
aBlock:=SetKey(ch)
If aBlock#Nil
EVal(aBlock)
ch:=0
EndIf
OtherWise
For i2:=1 To nTBt //varre o vetor
If "&"+Upper(Chr(ch)) $ Upper(nBut[i2])
oBKey:=nBPos:=i2
Exit //sai da execucao com a posição aceita do for
EndIf
Next
EndCase
nBPos:=If(nBPos > nTBt,1,if(nBPos < 1,nTBt,nBPos))
PcNewButton(nBot,nBPos,nBut,nCol)
If oBKey>0 //se okey ja for escolhido no caso das letras, ja sai
Exit
EndIf
EndDo
//apagar o botao
For iX:=1 to nTBt
wvw_PBDestroy(NIL,If(iX=1,nBt1,If(ix=2,nBt2,If(ix=3,nBt3,If(ix=4,nBt4,nBt5)))))
Next
//WVW_SETMOUSEMOVE(,lMouseMove)
If nAud = .T.
If nVie = .T. //apagar
/////////// Desenha a imagem da tela //pergunta // exclamacao
NewDrawField(nBot-1,nLft,nCol,"",10,nBot+2) //8 linha
NewShowLabel(nBot-1,nLft,"",3,"VERMELHO",30,10,nBot+1,nCol,xbFundo) //,,"FUNDO_BUTTON")
EndIf
EndIf
wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse ver se vai ficar aqui
Return oBKey
#include "Fileio.ch"
#include "Fiscal.ch"
#include "setcurs.ch"
#Include "button.ch"
#Include "box.ch"
#include "inkey.ch"
#include "memoedit.ch"
#include "common.ch"
#Include "winuser.ch"
#Include "HBGtinfo.ch" //tanto para gtwvw como gtwvg
#Include "Windows.Ch"
#Include "hbsetup.ch"
#Include "tbrowse.ch"
#Include "hbclass.ch"
#include "Directry.ch"
#include "error.ch"
#include "getexit.ch"
#include "WINGDI.CH"
#include "hbcompat.ch" //impressao
#include "hbsqlit3.ch"
#include "tip.ch"
Espero ter lhe ajudado e não confundido, hehehehe.
Demorei para chegar neste padrão de tela, mas mesmo assim quero migrar para HW_GUI.
Um abraço
T+
:)Pos
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
Josmar dos Santos
- Usuário Nível 3

- Mensagens: 277
- Registrado em: 11 Jan 2006 18:36
- Localização: Botucatu-SP
Imprimir Relatórios
Boa tarde Leandro. Obrigado por compartilhar o seu conhecimento..e parabéns pelo seu trabalho. Muito Objetivo e Profissional...
Um Abraço
Josmar
:{
Um Abraço
Josmar
:{