Jump to content
Fivewin Brasil

Geraldo (gbsilva)

Membros
  • Posts

    1,495
  • Joined

  • Last visited

  • Days Won

    6

Everything posted by Geraldo (gbsilva)

  1. Luiz você poderia tentar o seguinte, em vez de usar GROUP BY usar o DISTINCT porque voce não esta somando nada nos resultados e claro colocar a função max() no WHERE. Aliás no WHERE usei o BETWEEN acho mais prático. cSql := "SELECT DISTINCT concat(pe.fornecedor,'-',f.razao)," +; "date_format(pe.data,'%d/%m/%Y')," +; "pe.qtd," +; "pe.valor" +; " FROM pedido as pe" +; " INNER JOIN forne as f on pe.fornecedor = f.codigo" +; " WHERE pe.data BETWEEN "+Any2Sql(cGet[3]) AND "+Any2Sql(cGet[4])" +; " AND pe.produto ='"+cGet[1]+"'" +; " AND pe.tipo='2'" +; " ORDER BY pe.fornecedor," +; "pe.data asc ;" Sds,
  2. Luiz não sei se resolveria, mas não poderia ser algo assim: if parametro = 1 objeto_focu = x elseif parametro = 2 objeto_focu = y elseif parametro = 3 objeto_focu = z etc... endif ACTIVATE DIALOG oDlg ON INIT objeto_focu:setfocus() Sds,
  3. Luiz qual seria exatamente a ordem que você precisa, ordenar por código ascedente e dia e hora descendente ou voce quer apenas o último registro e desse registro a data mais antiga e hora também. Se for a segunda opção se voce fizer um select max(codigo), min(data), min(hora) não funcionaria? Sds,
  4. Pessoal infelizmente se tudo der certo estarei de férias de 11 a 25/11/2013 e não poderei rever os amigos. Nos últimos anos sempre estive, mas estarei em Minas nesses dias, fica para próxima. Abraços a todos.
  5. Pessoal acabei descobrindo uma dica antiga e lá tinha o que eu precisava, mas aproveitando será que alguém teria uma listagem completa dos métodos e atributos da TOleauto. Tem mais uma coisa que tenho de fazer no relatório do excel que é quebrar automaticamente para que o texto seja apresentado na coluna de modo a ser lido, hoje o usuário tem que configurar, mas sempre o ideal é deixar tudo pronto via programação. Abaixo o que encontrei nos meus arquivos pode ser útil para alguém: FUNCTION MAIN() LOCAL oExcel, oSheet oExcel := TOleAuto():New( "Excel.Application" ) oExcel:WorkBooks:Add() oSheet := oExcel:Get( "ActiveSheet" ) oSheet:Name := "Aba 1" oSheet:Cells( 1, 1 ):Value := "Codigo" oSheet:Cells( 1, 2 ):Value := "Nome" oExcel:Sheets:Add() oSheet := oExcel:Get( "ActiveSheet" ) oSheet:Name := "Aba 2" oSheet:Cells( 1, 1 ):Value := "Data" oSheet:Cells( 1, 2 ):Value := "Valor" oSheet:Cells( 1, 1 ):Select() oExcel:Visible := .T. Return Nil Preencher as células: Cells(linha,coluna):Value oSheet:Cells( 2, 1 ):Value := "NÃO" oSheet:Cells( 2, 2 ):Value := " N O M E D O P A I" oSheet:Cells( 2, 3 ):Value := " N O M E D O A L U N O" oSheet:Cells( 2, 4 ):Value := "Ano" oSheet:Cells( 2, 5 ):Value := "Mensalidade" oSheet:Cells( 2, 6 ):Value := "Apostila" oSheet:Cells( 2, 7 ):Value := "Xerox" oSheet:Cells( 2, 8 ):Value := "Uniforme" oSheet:Cells( 2, 9 ):Value := "R.O." oSheet:Cells( 2, 10 ):Value := "Total" Tamanho das colunas: oSheet:Columns(1):ColumnWidth := 3.86 oSheet:Columns(2):ColumnWidth := 40 oSheet:Columns(3):ColumnWidth := 40 oSheet:Columns(4):ColumnWidth := 7 oSheet:Columns(5):ColumnWidth := 6.43 Tamanho da letra e Negrito: oSheet:Cells( 1, 1 ):Font:Size := 14 oSheet:Cells( 1, 1 ):Font:Bold := .T. oSheet:Cells( 2, 1 ):Font:Size := 10 Alinhamento das células oSheet:Cells( 1, 1 ):HorizontalAlignment:= -4108 //Centro oSheet:Cells( 1, 2 ):HorizontalAlignment:= -4131 //Esquerda oSheet:Cells( 1, 3 ):HorizontalAlignment:= -4152 //Direita oSheet:Range("A2:M2"):HorizontalAlignment:= -4131 //Esquerda de A2 até M2 Mesclar células oSheet:Range("A1:M1"):Merge() Escolher fonte de letra: oSheet:Cells:Font:Name := "Times New Roman" oSheet:Cells:Font:Size := 9 Formatar célula: oSheet:Cells( 1, 5 ):Set( "NumberFormat", "#.##0,00" ) Cor da letra: oSheet:Cells( 1, 1 ):Font:ColorIndex := 3 Cor de Preenchimento: oSheet:Cells( 1, 2 ):Interior:ColorIndex := 7 Tabela de cores básicas: Preto = 1 Branco = 2 Azul = 5 Azul Claro = 41 Azul Escuro = 11 Verde = 10 Vermelho = 3 Amarelo = 6 Marron = 53 Violeta = 13 Laranja = 46 Rosa = 7 Colocar Bordas: oSheet:Range("A2:M10"):Borders(1):LineStyle:= 1 oSheet:Range("A2:M10"):Borders(2):LineStyle:= 1 oSheet:Range("A2:M10"):Borders(3):LineStyle:= 1 oSheet:Range("A2:M10"):Borders(4):LineStyle:= 1
  6. Pessoal eu já uso a TOleauto e para definir as larguras das colunas utilizo AutoFit(), mas agora estou precisando definir uma largura diferente em umas colunas e não consegui achar uma solução pesquisando aqui. Agradeço se alguém puder ajudar. Sds,
  7. Lembrei de mais um detalhe nesse campo já havia vários [enter] que consegui eliminar com replace no select, provavelmente terá também barra de espaço ou tab se tiver qual é o chr() dessas teclas, pode ser que necessite. REPLACE(a.aopt,char(13),'') AS s_aopt Grato,
  8. Pessoal obrigado pelas respostas. Postei uma imagem para voces entenderem melhor o problema. João só vou poder testar amanhã na empresa, mas será que mesmo sendo uma linha inteira como esta na imagem essa solução resolveria ou teria que ser outra. Sds,
  9. Pessoal estou com um problema, um campo text que importo do sqlserver vem como a imagem anexa e eu preciso eliminar essas linhas e espaços que o usuário coloca. se eu jogar isso numa variável texto como eu poderia tratar essa variável antes de gerar o relatório deixando apenas 1 espaço entre as frases. Grato,
  10. Judson eu faria diferente, primeiro para pegar os dados de origem eu faria um select e depois usaria um USE SQL ou SqlArray, e faria toda a atualização dentro de uma única transação, pois no seu código voce abre e fecha uma transação a cada registro. Não sou nenhum expert em sql, mas pode ficar mais rápido. O exemplo de código não é o ideal eu atualmente crio uma classe para fazer algo assim, mas é apenas para dar uma idéia e principalmente eu usaria SqlArray, não gosto muito do USE SQL. local cSql,var1,var2 cSql := "SELECT campo1," +; "campo2" +; " FROM tabela" +; " WHERE ... " +; " ORDER BY campo1 ;" USE SQL (cSql) ALIAS tabela NEW Begin Transaction //-> inicia a transação WHILE !tabela->(Eof()) var1 := tabela->campo1 var2 := tabela->campo2 if !Inserir(var1,var2) //-> se der algum erro voce faz rollback endif tabela->(DbSkip() ) END tabela->(DbCloseArea() ) End Transaction //-> fecha a transação Function Inserir(var1,var2) //- aqui faria o insert na tabela de destino return(.t.)
  11. Ariston fiz um pequena alteração e inseriu normalmente, testei usando o EMS, estava dando erro ai tirei a vírgula do campo valor e incluiu os 4 registros, lembrando que criei a tabela com os atributos codigo (char(2)), descricao (varchar(40)) e valor (double(10,2)). INSERT INTO teste (codigo,descricao,valor) VALUES ('1','Descrição do item 1', 4.00), ('2','Descrição do item 2', 3.00), ('3','Descrição do item 3', 2.00), ('4','Descrição do item 4', 1.00) ; commit; Sds,
  12. Pessoal sei que aqui já tem bastante dicas sobre sites desse tipo, mas esse é muito legal é site de busca, basta digitar o nome em inglês do que você quer. Após exibição da lista se você clicar no icone aparece os tamanhos disponíveis, existem alguns pagos, mas a maioria e grátis é só fazer o download e usar. https://www.iconfinder.com/
  13. 001 - Valdir - Jundiaí/SP 002 - Ana - Cianorte/PR 003 - Cesar - Cianorte/PR 004 - EMotta Sistemas - Nova Odessa/SP 005 - EMotta Sistemas - Nova Odessa/SP 006 - EMotta Sistemas - Nova Odessa/SP 007 - EMotta Sistemas - Nova Odessa/SP 008 - EMotta Sistemas - Nova Odessa/SP 009 - Império 010 - Evandro - Curvelo/MG 011 - Dorneles 012 - Dorneles 013 - Kleyber Derick / MA 014 - Geraldo (gbsilva)
  14. Grande amigo Valdir, pode contar com minha presença também.
  15. Concordo com o Motta, o ideal é mesmo criar uma nova classe, assim voce pode criar novos ou modificar a ação de determinado método. Eu que entendo muito pouco consegui fazer uma nova classe herdando da classe database e fiz algumas modificações para atender algumas necessidades, na época com a ajuda de alguns amigos aqui do fórum. *===================================================================================* * Classe : TMyData * * Programador: Geraldo Barbosa da Silva * * Colaboração: * *===================================================================================* * Observação: Classe filha da classe Database do fivewin *===================================================================================* #include "FiveWin.ch" #include "dbinfo.ch" #include "dbstruct.ch" #include "tsbutton.ch" #include "xbrowse.ch" CLASS TMyData FROM TDataBase DATA aDados,aCadastro,aSaldo,aLista,aReturn,aReceber DATA lEdita,lAppend,password,lPassword,lReturn METHOD New() CONSTRUCTOR METHOD LoadArray(_oBrw,_nCampo) METHOD Carga(_oObjeto,_nObjeto,_oFoco) METHOD NewRecord(_oObjeto,_oCad,_nField,_nLenField,_oFoco) METHOD UpRecord(_oBrw,_oCad,_nLenField) METHOD Clean(_oObjeto,_nLenObjetos,_nInicial) #ifdef __HARBOUR__ METHOD Seek( uExp, lSoft, lWildSeek, lCurRec ) #else METHOD Seek( uExp, lSoft ) #endif ENDCLASS METHOD New() CLASS TMyData super:New() super:Open() ::aDados := {} //-> Matriz principal para carregar no browse ::aCadastro := {} //-> Usada para gerar browse para consultas ::aSaldo := {} //-> Usada para gerar browse para consultas ::aLista := {} //-> Usada para gerar browse para consultas/exclusões ::aReturn := {} //-> Usada para pegar daddos retornado de alguma consulta ::aReceber := {} //-> Usada para carregar contas a receber ::lEdita := .f. ::lAppend := .t. ::password := space(10) //-> verificar senha do usuário ::lPassword := .f. ::lReturn := .f. return self //-> Gera código para o próximo registro a ser gravado no banco METHOD NewRecord(_oObjeto,_oCad,_nField,_nLenField,_oFoco) CLASS TMyData local nNextReg:=0 nNextReg := ::RecCount() + 1 ::lEdita := .t. ::lAppend := .t. ::Blank() ::Clean(_oCad) ::aBuffer[_nField] := STRZERO(nNextReg,_nLenField) _oCad[_nField]:VarPut(::aBuffer[_nField]) _oCad[_nField]:refresh() GbFoco(_oFoco) return(.t.) //-> Atualiza dados na dialog de acordo com movimentação no browse METHOD UpRecord(_oBrw,_oCad,_nLenField) CLASS TMyData local nUp DEFAULT _nLenField := Len(::aBuffer) //-> se não existir nenhum cadastro retorna if Len(::aDados) = 0 return(.t.) endif For nUp = 1 to _nLenField _oCad[nUp]:VarPut(::aDados[_oBrw:nArrayAt,nUp]) _oCad[nUp]:refresh() Next ::lEdita := .f. return(.t.) //-> Carrega DBF no Browse, usado para trabalhar com array METHOD LoadArray(_oBrw,_nCampo,_lEmpty,_cFilter,_nColuna) CLASS TMyData local nP ,; nT ,; nReg:=0,; aTemp ,; nDel ,; nTot:=Len(::aDados) local cSelect := "" DEFAULT _nCampo := 1,; _lEmpty := .f. if nTot > 0 for nDel = 1 to nTot DelMatriz(::aDados) next endif nReg := ::RecCount() //-> verifica quantidade de registros no DBF ::Gotop() for nP = 1 to nReg //-> se existir filtro só os registros que atendem a condição são carregados if !empty(_cFilter) if ::aBuffer[_nColuna] <> _cFilter ::skip() //-> skip no DBF loop endif endif aTemp := {} //-> inicia array temporária //-> adiciona 1 registro a array temporária, independente do número de colunas if _lEmpty = .t. //-> Se for .t. inclui uma coluna vazia para usar flag no browse aAdd(aTemp,space(1) ) endif for nT = 1 to Len(::aBuffer) aAdd(aTemp,::aBuffer[nT] ) next //-> adiciona registro da array aTemp para array ::aDados se o campo (padrão _nCampo = 1) não for vazio if !empty(aTemp[_nCampo]) aAdd(::aDados, aTemp ) endif nT := 1 //-> iguala variável do segundo for ::skip() //-> skip no DBF next return(.t.) //-> Carrega na Tela dados do registro METHOD Carga(_oObjeto,_nObjeto,_oFoco) CLASS TMyData local nBuffer DEFAULT _nObjeto := Len(::aBuffer) if ::lBuffer For nBuffer = 1 to _nObjeto _oObjeto[nBuffer]:VarPut(::aBuffer[nBuffer]) _oObjeto[nBuffer]:refresh() Next if !empty(_oFoco) GbFoco(_oFoco) endif endif return(.t.) //-> Limpa get´s METHOD Clean(_oObjeto,_nLenObjetos,_nInicial) CLASS TMyData local nT DEFAULT _nInicial := 1 ,; _nLenObjetos := Len(::aBuffer) ::Blank() for nT = _nInicial to _nLenObjetos _oObjeto[nT]:refresh() next return(.t.) //-> Método Seek Modificado do Original (tirado ::Load() ) #ifdef __HARBOUR__ METHOD Seek( uExpr, lSoft, lWildSeek, lCurRec ) CLASS TMyData #else METHOD Seek( uExpr, lSoft ) CLASS TMyData #endif local lFound DEFAULT lSoft := Set( _SET_SOFTSEEK ) #ifdef __HARBOUR__ If Upper( Left( ( ::nArea )->( OrdKey() ), 5 ) ) == 'UPPER' uExpr := Upper( uExpr ) endif DEFAULT lCurRec := .f. if lWildSeek == .t. .and. ValType( uExpr ) == 'C' lFound = ( ::nArea )->( OrdWildSeek( uExpr, lCurRec ) ) else lFound = ( ::nArea )->( DbSeek( uExpr, lSoft ) ) endif #else lFound = ( ::nArea )->( DbSeek( uExpr, lSoft ) ) #endif //-> Modificado da classe original Fwh1111 31/12/2011 // if ::lBuffer .and. ! ( ::nArea )->( Eof() ) // ::Load() // endif return lFound //-> Idem ao original apenas usando o método sem o _Delete() para Delete() METHOD Delete() CLASS TMyData local lLocked := .f. local lDeleted := .f. if ! ::Eof() .and. ! ::lReadOnly .and. ! ( ::nArea )->( Deleted() ) if ::lShared if ::IsRecLocked( ::RecNo() ) .or. ( lLocked := ::RecLock( ::RecNo() ) ) ( ::nArea )->( DbDelete() ) lDeleted := .t. if lLocked ::Commit() ::RecUnLock( ::RecNo() ) endif else MsgAlert( "DataBase in use", "Please try again" ) endif else ( ::nArea )->( DbDelete() ) lDeleted := .t. endif if lDeleted if Set( _SET_DELETED ) // .or. ! Empty( ( ::nArea )->( DbFilter() ) ) ::Skip( 1 ) if ::Eof() ::GoBottom() endif endif endif endif return lDeleted
  16. Verifiquei no meu five e minha classe também é default é .f. // DATA lVThumbTrack AS LOGICAL INIT .f. // When .t., thumbtrack scrolls the browse. (not suited for slow data access). Tradução do google: Quando. T., Thumbtrack rola a navegação. (não é adequado para o acesso de dados é lenta.
  17. Desculpem teclei enter sem querer, faltou a pergunta: essa função funciona com recursos também? Grande Valdir como vai? Grato a todos.
  18. Wagner, João tudo bem com os senhores.
  19. Eu tive um problema desse e o problema era no servidor, usávamos em um servidor o cara do TI resolver que iria colocar num servidor onde todos tem acessos e criam suas pastas, ai começou essa história de não gravar e outra estação só enxergava se saisse do sistema e entrasse novamente. Não sei explicar o que esse servidor tem além do que mencionei acima e no que funcionava só tinha o windows e o mysql instalado. Se tivesse que apostar, apostaria que é no servidor o problema, não seria possível pegar uma máquina qualquer e instalar o mysql e fazer um teste.
  20. Olá uso essa função criada criada por uma turma dos feras do nosso fórum e funciona muito bem. Fiz algumas alterações para atender minha necessidade, mas esta documentado. Abaixo um exemplo de utilização: local i,nDados,cArquivo cArquivo:= cGetFile32("*.XLS","Escolha o arquivo") IF !File(cArquivo) RETURN ENDIF lNewFile := cArquivo //-> Aqui leio os dados da planilha LeExcel( lNewFile,@aDados, 24, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24},1,2,,.f. ) nDados:=Len(aDados) For i = 1 to nDados ... trato as colunas retornadas e exemplo de tratamento codigo := aDados[i,1] ... chamo função para gravar Next ////////////////////////////DADOS DA FUNCAO//////////////////////////////////////////// // NOME : LeExcel // // AUTOR : Evandro G. de Paula // // COLABORAÇÃO: Gilmer Tavares (toda a parte OLE) // // SINTESE : Ler arquivo xml // // PARAMETROS : <1> cNome do arquivo xml // // <2> Matriz a ser carregado os dados // <3> nTotal de colunas a ler (coluna limite a ser lida) // // <4> aVetor com os números da coluna a serem efetivamente lidas // // <5> nColuna verificação do conteúdo obrigatório. Caso a célula esteja// // vazia, toda a linha será ignorada. (default=aVetor[1]) // // <6> Linha inicial na planilha a ser lida (padrão 1) // <7> Vetor para pegar dados no cabeçalho da planilha lida // <8> Array com as posições a serem lidas na planilhas <linha,coluna> // <9> .f. padrão lê apenas primeira aba, se for .t. lê todas // RETORNO : aVetor com os dados da planilha // /////////////////////////////////////////////////////////////////////////////////////// /* Chamada LeExcel(Vide Abaixo) #include "FiveWin.ch" Function Main() LeExcel( 'original', 4, {1,2,3,4},1 ) //-> Uma chamada mais incrementada LeExcel( lNewFile,@aDados, 21, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21},1,2,,.f. ) return nil */ Function LeExcel(cXlsArquivo,aVetor,nColunas,aColunas,nColObrig,nLinhaInicial,aTitulos,aColAd,cSheets) Local oDlg,oExcel,oFolha,nLinhas Local cProject, cFile, cRota:=cFILEPATH(GETMODULEFILENAME(GETINSTANCE())) // Tirei as 02 linhas abaixo pois não tem necessidade //cXlsArquivo+='.xls' //cXlsArquivo:=strtran( cXlsArquivo, '.xls.xls','.xls' ) if !file( cXlsArquivo ) msgalert( 'Arquivo '+cXlsArquivo+' não encontrado.', 'Verifique' ) else oExcel := TOleAuto():New( "Excel.Application" ) //oExcel:Workbooks:Open(cRota+cXlsArquivo) oExcel:Workbooks:Open(cXlsArquivo) oFolha := oExcel:Get( "ActiveSheet" ) oWork := oExcel:Get( "ActiveWorkbook" ) oWork:Saved:=.t. nLinhas:=oFolha:UsedRange:Rows:Count() oExcel:Workbooks:Close() oExcel:Quit() LeArqExcel( cXlsArquivo,nColunas, aColunas,@aVetor, nColObrig,nLinhaInicial,aTitulos,aColAd,cSheets ) endif return aVetor Function LeArqExcel( cXlsArquivo, nColunas, aColunas, aVetor, nColObrig, nLinhaInicial,aTitulos,aColAd,cSheets ) Local aLinha Local cNome, cMatricula, cChave, cLinha Local nLinhas, x, x1, nPos Local oExcel, oFolha, oWork Local xLinha,nCol:=1,nDados:=0,nH,nSheets:=0,nF Local nT,nP,nColAd,lColAd,nContaAba:=1 //-> geraldo DEFAULT nColObrig:=aColunas[1] DEFAULT nLinhaInicial := 1 DEFAULT cSheets := .f. oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Workbooks:Open(cXlsArquivo) //-> Verifica abas nSheets := oExcel:Sheets:Count() //-> Verifica se vai ler cabeçalho apenas da primeira planilha if cSheets = .f. nLerAba := 1 else nLerAba := nSheets endif For nF := 1 to nSheets oExcel:Worksheets( nF ):Select() oFolha := oExcel:Get( "ActiveSheet" ) oWork := oExcel:Get( "ActiveWorkbook" ) oWork:Saved:=.t. ************************************************************************** //-> Inclui essas linha para pegar cabeçalho (Geraldo 10/11/2009) If nContaAba <= nLerAba if !empty(aColAd) nColAd := Len(aColAd) For nT = 1 to nColAd aAdd( aTitulos, {oFolha:Cells( aColAd[nT,1],aColAd[nT,2] ):Value } ) Next /* Como pegar os dados do cabeçalho For nP = 1 to Len(aTitulos) ? aTitulos[nP,1] Next */ endif nContaAba++ endif ************************************************************************** nLinhas=oFolha:UsedRange:Rows:Count() For x:= nLinhaInicial to nLinhas xLinha:=oFolha:Cells( x, nColObrig ):Value if nColObrig > 0 .and. xLinha == nil loop endif aLinha:={} For x1 = 1 to nColunas if ascan( aColunas, x1 )>0 aadd( aLinha, oFolha:Cells( x, x1 ):Value ) endif Next x1 aAdd( aVetor, aLinha ) Next x Next oExcel:Workbooks:Close() oExcel:Quit() return aVetor Sds,
  21. Acho que voce não faz um WHERE e sim o AND é porque são 2 condições, desculpe. Outra sugestão a tabela detalhes é quem deve ficar a esquerda do LEFT JOIN tente inverter como abaixo. cComm := "select A.NOMECLI, B.IDEXAME, B.NOMEEXA, B.QTDEXAME, B.VLEXAME FROM AMOSTRAS_DET B " cComm += "LEFT JOIN AMOSTRAS_CAB A ON B.IDAMOSTRA = A.IDAMOSTRA " cComm += "AND A.IDAMOSTRA = "+SR_cDBValue( nIDAMOSTRA )
  22. Se ta errado não sei, no mínimo estranho. cComm := "select A.NOMECLI, B.IDEXAME, B.NOMEEXA, B.QTDEXAME, B.VLEXAME FROM AMOSTRAS_CAB A " cComm += "LEFT JOIN AMOSTRAS_DET B ON B.IDAMOSTRA = A.IDAMOSTRA " cComm += "AND A.IDAMOSTRA = "+SR_cDBValue( nIDAMOSTRA ) // não faltou ou WHERE e não AND nessa linha ????? cComm += " WHERE A.IDAMOSTRA = "+SR_cDBValue( nIDAMOSTRA )
  23. Oi Alexandre tudo bem! Aproveitando esse tópico, voce cita o php, posso saber o que usar para fazer as telas em PHP, Pelles não funciona certo. Já vi o Flex, mas esse é muito complicado. Sds,
  24. Sérgio funcionou sim, para falar a verdade ainda não havia utilizado SAY nativo. Muito obrigado.
  25. Pessoal em meus dialog quando posiciono os textos a direita fica ok, mas se usar o for abaixo para colorir a tela o texto fica a esquerda, alguém sabe como resolver isso. Estou usando a ssay. For IdCor = 501 to 504 REDEFINE SENSITIVE SAY ID IdCor COLOR CLR_BLACK OF oDlg FONT nFont Next IdCor Nas imagens anexas dá para ver, se tiro as linhas acima fica a direita, mas não posso usar COLOR na Dialog. Grato,
×
×
  • Create New...