
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
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
-
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. ;)
-
Como Faço Para Expirar Um Programa?
pergunta respondeu ao Walter Gazzarrini Neto de Micheus em Delphi, Kylix
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) -
(Resolvido) Ficar Piscando O Caption Da Aba Se For Habilitado O C
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
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. ;) -
(resolvido) Como Tratar O Erro "is Not Valid Floating Point Value
uma questão respondeu Micheus em Delphi, Kylix
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 -
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?
-
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.
-
(resolvido) Como Tratar O Erro "is Not Valid Floating Point Value
uma questão respondeu Micheus em Delphi, Kylix
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 -
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
-
é questão de, talvez, criar outra função utilizando o componente que você precisa. Mais a idéia é sempre a mesma. ;)
-
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');
-
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.
-
Como Usar Um Dbnavigator P/ Várias Janelas Mdi?
pergunta respondeu ao Warrior.of.Ice de Micheus em Delphi, Kylix
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 -
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.
-
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)
-
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
-
vai depender que banco de dados você está utilizando. De qual estamos falando? Que componente de acesso você está utilizando?
-
Como Usar Um Dbnavigator P/ Várias Janelas Mdi?
pergunta respondeu ao Warrior.of.Ice de Micheus em Delphi, Kylix
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 -
(Resolvido) Buscar Código/mostrar Dados Nos Campos/gravar Dados N
pergunta respondeu ao mxvinicius de Micheus em Delphi, Kylix
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. ;) -
(Resolvido) Buscar Código/mostrar Dados Nos Campos/gravar Dados N
pergunta respondeu ao mxvinicius de Micheus em Delphi, Kylix
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 -
Como Faço Para Expirar Um Programa?
pergunta respondeu ao Walter Gazzarrini Neto de Micheus em Delphi, Kylix
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. ;) -
Como Usar Um Dbnavigator P/ Várias Janelas Mdi?
pergunta respondeu ao Warrior.of.Ice de Micheus em Delphi, Kylix
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 -
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".
-
Como Usar Um Dbnavigator P/ Várias Janelas Mdi?
pergunta respondeu ao Warrior.of.Ice de Micheus em Delphi, Kylix
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 -
Justificação E Entre-linhas Em Richedit
uma questão postou Micheus Tutoriais & Dicas - Delphi, Kylix
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