Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Micheus

    Emulador

    Alguns que contém dicas que você vai precisar: - Preencher Campo De Outro Programa, Mais/menos igual o teclado virtual do XP (WM_SETTEXT) - Função Findwindow (Significado de uma variável) - Ponteiro Se Movimentando Sozinho (até post #39) - Verificar Existencia De Outro Programa Aberto
  2. Eder, vai ajudar se você colocar qual o relacionamento entre estas tabelas - que campo, de que tabela está relacionada a outra (que lado é 1 e qual é N). Aparentemente não é relatório complicado não. ;)
  3. o link que postei anteriormente estava causando falha ao "clická-lo", então vou sugerir novamente que você dê uma olhada no componente TMXProtector veja no site MaxComponents (ao clicar em download, na tela que se segue, clique sobre a versão do seu compilador delphi e aguarde iniciar o download. Tem demos para vários tipos de expirações - talvez algum lhe interesse)
  4. Não vamos assassinar a lógica pessoal... o trecho de código acima, continuaria claro, muito mais lógico e otimizado, desta forma abaixo: ... procedure TForm1.Timer1Timer(Sender: TObject); begin PageControl1.OwnerDraw := CheckBox1.Checked; end; ... Esta explicação do Churc, pode ajudar na compreensão. ;)
  5. Nem tanto, mas acreditaria se eu disse que é só hobby?!Em meu emprego oficial, sou apenas usuário. ;) MXVinícius, a título de observação, vale lembrar que tudo o que estiver após um RAISE não será executado. Então, você deve mover o foco para o componente desejado antes de chamar o raise: ... if DBEdit52.text = '' then begin DBEdit52.SetFocus; // <======== AQUI raise Exception.Create('O Campo para o código do vendedor está vazio'); end; ... Abraços
  6. Micheus

    Máximo Do Campo

    VDLR, por acaso este dataset (Query1) é o mesmo que você utiliza para mostrar os dados no DBGrid?Se a resposta for não, você poderia colocar o código existente no referido botão?
  7. Micheus

    Máximo Do Campo

    VDLR, você tem que fazer um:MAX(rttnr) AS rttnr para usar este nome de campo no FieldByname. A mensagem reclamando "Cliente" não tem nada a ver com a sua instrução SQL, logo parece que você tem algum campo adicionado em design-time ao seu Query1 e daí, no Open, ele reclama. Dê uma conferida.
  8. Melhor forma é você tratar o conteúdo antes de utilizá-los na operação. Por exemplo, você pode no OnExit testar se o valor é válido ou inválido: procedure TForm1.DBEdit1(sender :TObject); begin try StrToFloat((Sender as TDBEdit).Text); // não atribuirá a ninguém o resultado, é apenas para tentar obter o erro except on E:Exception do begin E.Message := 'Valor digitado não é válido'; raise; end; end; end;Com isto você pode atribuir este procedimento de um evento OnExit de um DBEdit para todos os outros envolvidos (que farão a mesma validação) já que está descrito de forma genérica - utilizamos o Sender que é o DBEdtit que gerou o evento. a idéia é semelhante a deste post
  9. Micheus

    (Resolvido) Qrexpr

    R.: Carinha deu erro [Error] Bomba_Res.pas(168): Left side cannot be assigned to por isso que eu disse "teoricamente" e "teste". :rolleyes: Isso significa que não é possível atribuir algum valor a QRExpr.Value.dblResult. que era a outra opção que falei: QRLabel + FormatFloat. Com a possibilidade de utilizar o QRLabel para mostrar, você poderia tentar fazer: var Valor :Double; begin QrLabelResultado.caption := FormatFloat('Saldo do Período: #,###,##0.00 litros', QRExpr1.Value.dblResult - QRExpr2.Value.dblResult); end;quanto mais pontos de milhar precisar a frente, basta acrescentar "###,". Com esta formatação, a única coisa certa é que você terá 1 casa antes da vírgula e 2 após dela (são ref. aos zeros que você vê), o resto será ajustado conforme necessário. por exemplo: 1050,5 formatado assim: FormatFloat('Saldo do Período: #,###,##0.00 litros', 1050.5); resulta em: "Saldo do Período: 1.050,50 litros" Abraços
  10. Micheus

    Máximo Do Campo

    é questão de, talvez, criar outra função utilizando o componente que você precisa. Mais a idéia é sempre a mesma. ;)
  11. lmroot, seja claro em seus posts! Esse código, qual o objetivo: é o código que agora está funcionando ou que ainda tem problema? <_< Apenas adiantando, se seu banco for MySQL, se formatar a data deste modo a consulta não funciona: FormatDateTime('mm/dd/yyyy') ela deverá estar formatada: FormatDateTime('yyyy-mm-dd');
  12. Micheus

    Máximo Do Campo

    VDLR, você mesmo já disse ter criado uma função para retornar o MAX baseado em algo que postei. A restposta a sua pergunta está neste seu post.
  13. Warrior.of.Ice, troque a propriedade BorderStyle dos MDIChild para bsDialog - deve resolver. Obs: para próximas dúvidas, tente manter assuntos diferentes em tópicos diferentes (crie um tópico para cada dúvida). Esta última dúvida, por exemplo, não tinha nada a ver com DBNavigator ou acesso as tabelas. Assim, mantemos a ordem no forum e facilitamos futuras buscas. ;) Abraços
  14. Paltrin, isto que o Jhonas postou até pode ser uma "solução".Entretanto, uma vez que você está utilizando componentes data-aware (os TDBEdit's), tenho que perguntar qual é o dataset que você vinculou a eles? E os dados retornados por ele, são mostrados em algum momento nestes TDBEdit's ou você os utilizou apenas para entrada de dados? Porque ser foi apenas para entrada de dados, melhor opção é a que o Jhonas colocou, mas se não for, talvez seja mais interessante utilizar o componente ZUpdateSQL combinado com o ZQuery, porque daí você os dados digitados nos DBEdits podem ser gravados diretamente no dataset, apenas com um Post. Claro que o componente ZUpdateSQL terá que ter suas propriedades ModifySQL, InsertSQL, DeleteSQL,... corretamente.
  15. lmroot, acho que o problema vem destas "atribuições":ORIGEM = 'P' e ORIGEM = ''R'' se você quer que exista uma coluna Origem com os valores P e R, troque por algo como: ... AS VENDAS, 'P' AS ORIGEM FROM CORPOPED ... e ao colocar na linha SQL.Add, devido a existência da aspas simples, digite ela duplamente: SQL.Add('SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = ''P'' FROM CORPOPED') observe que são duas aspas simples (' - uma após a outra), não é uma áspas dupla (" - única)
  16. Micheus

    (Resolvido) Qrexpr

    Eder, a propriedade Mask serve apenas para formatar a saída quando o "valor" (resultado) do seu QRExpr é apenas numérico. Caso você tenha utilizado estas variáveis globais apenas para montar o resultado no seu último QRExpr (pela contrução, não parece uma totalização), então acho que uma sugestão mais "limpa" poderia ser você utilizar a propriedade Value dos expressions para calcular o valor total. Assim, você não interceptaria os eventos para os dois primeiros expressions, apenas o último. Exemplificando: QRExpr.Value.dblResult := QRExpr1.Value.dblResult - QRExpr2.Value.dblResult; isto poderia ser realizado no BeforePrint da banda onde estes expressions estão; Em teoria, funciona corretamente. Teste. ;) mas como você pretende colocar o resultado e uma frase, o exemplo do Jhonas (para esta parte) deve funcionar parcialmente pois falta informar a precisão (casas decimais): Value := 'Saldo do Período: '+format(%.2n,[LitrosBomba - LitrosAbaste])+' Litros'; Juntando isto ao que coloquei antes, Value := 'Saldo do Período: '+format(%.2n,[QRExpr1.Value.dblResult - QRExpr2.Value.dblResult])+' Litros'; Se você precisar mostrar o separador de milhar, então vai ter que fazer uso da função FormatFloat. A título de sugestão, para este último resultado um QRLabel já serviria, não há necessidade de ser um QRExpr (isso é opcional) Abraços
  17. vai depender que banco de dados você está utilizando. De qual estamos falando? Que componente de acesso você está utilizando?
  18. Warrior.of.Ice, neste caso, vale o que você mesmo já disse: "na verdade eu teria que mudar o evento onclick pra janela que estivesse ativa no momento" vou dar duas sugestões: 1) criar um procedimento que modifica o evento OnClick dos botões conforme MDIChild ativo: - no seu MDIMain (janela MDI "pai") crie uma função para fazer a atribuição do evento; - nos seus MDIChild (janelas MDI "filhas") crie os procedimentos para cada evento necessário. segue exemplo conceitual (não faça um copiar-colar): // No código do MDIMain ("pai") - uMDIMain.pas type TMDIMain = class(TForm) ... public ... procedure SetButtonEvento(BtnID :Byte; BtnEvent :TNotifyEvent); end; ... procedure TMDIMain.SetButtonEvento(BtnID :Byte; BtnOnClick :TNotifyEvent); begin case BtnID of 1 : BtnInsert.OnClick := BtnOnClick; // botão para insert recebe respectivo evento... 2 : BtnEdit.OnClick := BtnOnClick; // botão para edit recebe respectivo evento... 3 : BtnCancelar.OnClick := BtnOnClick; // botão para cancelar recebe respectivo evento... ... // outros botões end; end; // No código de cada MDIChild ("filhas") - uMDIChild1.pas type TMDIChild = class(TForm) ... public ... procedure btnInsert(Sender :TObject); procedure btnEdit(Sender :TObject); ... // os outros eventos necessários end; uses uMDIMain; ... procedure TMDIChild.btnInsert(Sender :TObject); begin TabNome.Insert; TabNomeCodNome.Value := Max(CodNum)+1; // isto também é conceitual... ... // outras inicializações end; procedure TMDIChild.btnEdit(Sender :TObject); begin ... // inicializações... TabNome.Edit; end; procedure TMDIChild.FormActivate(Sender: TObject); begin MDIMain.SetButtonEvento(1, btnInsert); MDIMain.SetButtonEvento(2, btnEdit); ... // outros botões end; ... // os outros eventos necessários 2) modificar o dataset a ser utilzado peles eventos OnClick dos botões conforme MDIChild ativo: - no seu MDIMain (janela MDI "pai") você coloca um componente TDataSource (DataSourceMain) e cria os eventos OnClick dos botões de forma genérica; - nos seus MDIChild (janelas MDI "filhas") no evento OnActivate, você modifica o dataset linkado ao DataSourceMain; segue exemplo conceitual (não faça um copiar-colar): // No código do MDIMain ("pai") - uMDIMain.pas type TMDIMain = class(TForm) ... procedure btnInsertClick(Sender :TObject); // eventos dos botões criado pelo duplo click nos mesmos procedure btnEditClick(Sender :TObject); // eventos dos botões criado pelo duplo click nos mesmos procedure btnDeleteClick(Sender :TObject); // eventos dos botões criado pelo duplo click nos mesmos public ... private ... end; ... procedure TMDIMain.btnInsertClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin DataSet.Insert; ... // outras ações end; end; procedure TMDIMain.btnEditClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin DataSet.Edit; ... // outras ações end; end; procedure TMDIMain.btnDeleteClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin if MessageDlg('Confirma exclusão do registro selecionado?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DataSet.Delete; end; end; procedure TMDIMain.btnDeleteClick(Sender :TObject); begin if Assigned(DataSourceMain.DataSet) then // proteção do código with DataSourceMain do begin if MessageDlg('Deseja cancelar alterações realizadas?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then DataSet.Cancel; end; end; // No código de cada MDIChild ("filhas") - uMDIChild1.pas type TMDIChild = class(TForm) ... procedure FormActivate(Sender: TObject); private ... public ... end; uses uMDIMain; ... procedure TMDIChild.FormActivate(Sender: TObject); begin MDIMain.DataSourceMain.DataSet := TabNome; // isto é uma atribuição conceitual. Atribua o dataset adequado. end; Esta última abordagem considero mais simples, do ponto de vista de codificação, porém exige uma boa padronização no uso dos datasets fazendo uso dos seus eventos: - OnNewRecord para inicializações de campos, - OnBeforePost para validação de campos antes da "postagem"; e alguns outros, conforme aplicação em desenvolvimento. Eu tenho um projeto, onde tenho cadastros simples (uns 10), feitos em DBGrids colocados cada um em um TabSheet, onde existem apenas 3 botões (Inclusão, Alteração e Exclusão) mas com função de 5 (ficam inclusos: Cancelar e Gravar) - a cada Guia selecionada o parent dos botões são alterados. Há um DataSourceGenerico que também é atualizado para cada Guia selecionada. Deste modo, há apenas o código para os três botões funcionando para todos os 10 cadastros! Espero que consiga captar a idéia e utilizá-la em seu projeto. Abraços
  19. Vinícius, acho que você não entendeu nada do que eu disse. <_< Se você ler com atenção, vai ver que ao invés de usar a linha: DBEdit154.Text := DBEdit54.text * IntToStr(DBEdit134.Text); (IntToStr em um texto? :blink: - fora a falta de conversão dos outros campos...) Deveria ter feito algo como: DBEdit154.Text := IntToStr((StrToInt(DBEdit54.text) * StrToInt(DBEdit134.Text)); ou DBEdit154.Text := FloatToStr((StrToInt(DBEdit54.text) * StrToInt(DBEdit134.Text)); Quando você utiliza a referência a um datamódule, como a que você fez, para simplificar o código você pode utilizar with <object ou record> do. Mas, agora que você exemplificou utilizando TDBEdit's a minha sugestão é que você utilize os campos do seu dataset na operação - Vai facilitar muito!!! Vamos supor que seu: - DBEdit154 esteja se referindo ao campo Preço Total do item do pedido -> DataModule1.TPedidoPrecTotal.Value; - DBEdit54 esteja se referindo ao campo Quantidade do item do pedido -> DataModule1.TPedidoQtd.Value; - DBEdit134 esteja se referindo ao campo Preço Unitário do item do pedido -> DataModule1.TPedidoPrecUn.Value; Então, toda a operação realizada com os DBEdit's seria substituida por: with DataModule1 do begin ... // outros códigos antes da operação TPedidoPrecTotal.Value := TPedidoQtd.Value * TPedidoPrecUn.Value; ... // resto do código end; Veja como simplifica as coisas! Então, vai uma dica: SEMPRE que você tiver os campos do seu dataset no seu projeto, utilize eles nas operações. Não os TDBEdit's!!! Os DBEdits, automaticamente receberão os valores destes campos - não há o que se preocupar. ;)
  20. MXVINICIUS, não tenha dúvida que dará. Voce deve ter observado que está tentando fazer uma operação matemática utilizando texto como argumento. Voce tem que converter o texto (números, é verdade) para um valor numérico (inteiro ou double) fazer a operação - isto resultará em um número! Então você converte este número para texto e mostra no edit. <variavel_inteira> := StrToInt(<texto_numerico>); // a função converte texto para número inteiro <variavel_double> := StrToFloat(<texto_numerico>); // a função converte texto para número com ponto flutuante <texto> := IntToStr(<variavel_inteira>); // a função converte número inteiro para texto <texto> := FloatToStr(<variavel_double>); // a função converte número com ponto flutuante para texto é por aí o caminho. Abraços
  21. Walter, você poderia dar uma olhada num tal de TmxProtector - veja neste post da seção links. Achei ele lá por acaso, mas acho que pode ser bem útil. Se você testá-lo, dê um retorno para o pessoal. ;)
  22. até aqui eu entendi... mas aqui, eu me perdi. :unsure: Por acaso, você está querendo colocar em cada janela MDIChild um botão para inclusão dos dados ao invés de utilizar o botão insert do DBNavigator? (mas manterá o esquema com o DBNavigator já resolvido) espero que você não conheça tanta gente assim, senão não vamos dar conta. :D Abraços
  23. tem certeza que você postou na área certa? Para mim, isto é VB. Não. Não foi isso que o colega Jhonas postou, foi isto:Select * from Tabela order by data que é um comando SQL que retorna todos os campos (*) da tabela "Tabela" ordenada pelo campo "data".
  24. Warrior.of.Ice, sendo a instância de um objeto uma área de memória (ponteiro), então você deve utilizar NIL.-> NULL, seria para atribuir um valor nulo a uma variável do tipo Variant; -> '' (sem espaço entre as áspas simples) seria para atribuir um valor nulo a uma variável do tipo String Abraços
  25. A partir do RichEdit 3.0 é possível justificar parágrafo/texto em um RichEdit. Entretanto, no componente TRichEdit (ao menos até a versão 7), não há esta opção de alinhamento (apenas, taLeftJustify, taRightJustify e taCenter). Logo, temos que fazer uso de chamadas à API do Windows para que consigamos esta formatação. Um outro recurso que pode ser aproveitado por quem utilizar TRichEdit em pequenos editores de texto é a variação do entre-linhas. Abaixo, seguem duas funções para estes recursos mencionados: // AllText : True=todo o texto; False=parágrafo atual procedure JustifyRichEdit(RichEdit :TRichEdit; AllText :Boolean); const TO_ADVANCEDTYPOGRAPHY = $1; EM_SETTYPOGRAPHYOPTIONS = (WM_USER + 202); EM_GETTYPOGRAPHYOPTIONS = (WM_USER + 203); var ParaFormat :TParaFormat; SelStart, SelLength :Integer; begin ParaFormat.cbSize := SizeOf(ParaFormat); if SendMessage(RichEdit.handle, EM_SETTYPOGRAPHYOPTIONS, TO_ADVANCEDTYPOGRAPHY, TO_ADVANCEDTYPOGRAPHY) = 1 then begin SelStart := RichEdit.SelStart; SelLength := RichEdit.SelLength; if AllText then RichEdit.SelectAll; ParaFormat.dwMask := PFM_ALIGNMENT; ParaFormat.wAlignment := PFA_JUSTIFY; SendMessage(RichEdit.handle, EM_SETPARAFORMAT, 0, LongInt(@ParaFormat)); // Restaura seleção caso tenhamos mudado para All RichEdit.SelStart := SelStart; RichEdit.SelLength := SelLength; end; end; // Espaçamento: 0=simples; 1=1,5; 2=duplo procedure LineSpaceRichEdit(RichEdit :TRichEdit; Espacamento :Integer; AllText :Boolean); var ParaFormat :TParaFormat2; begin if AllText then RichEdit.SelectAll; ParaFormat.cbSize := SizeOf(ParaFormat); ParaFormat.dwMask := PFM_LINESPACING or PFM_SPACEAFTER; ParaFormat.dyLineSpacing := Espacamento; ParaFormat.bLineSpacingRule := Espacamento; SendMessage(RichEdit.handle, EM_SETPARAFORMAT, 0, LongInt(@ParaFormat)); // Restaura seleção caso tenhamos mudado para All RichEdit.SelStart := SelStart; RichEdit.SelLength := SelLength; end; Para usá-las, você possui 2 alternativas: 1) Todo o texto: JustifyRichEdit(RichEdit1, True); // justifica todo o texto LineSpaceRichEdit(RichEdit1, 2, True); // espaçamento duplo em todo o texto 2) Parâgrafo atual ou selecionado(s): JustifyRichEdit(RichEdit1, False); // justifica parágrafo(s) LineSpaceRichEdit(RichEdit1, 1, False); // espaçamento 1,5 no(s) paragrafo(s) Obs: É necessário declarar a unit RichEdit na cláusula uses do seu form. Espero que sejam úteis. Abraços ______________ Ref. msdn: About Rich Edit Controls
×
×
  • Criar Novo...