
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Dados Não Aparecem No Qrdbrichtext
pergunta respondeu ao cristianobackup de Micheus em Delphi, Kylix
cristianobackup, utilizar RichEdit (seja TRichEdit, TDBRichEdit, TQRDBRichEdit ou TQRRichEdit) só se justifica se você estiver formatando o texto (tipo, utilizando cor, estilo de fonte, ...), do contrário é utilizar, no caso do QuickReport, o TQRDBText ou TQRMemo. O campo normalmente utilizado para este fim é do tipo Memo, Blob, Text (conforme banco de dados) []s -
VDLR, implementei um exemplo, utilizando o código do post #2 e não obtive qualquer erro. Acessei uma tabela em um banco Firebird, utilizando os componentes: SQLConnection, SQLQuery, DataSetProvider e ClientDataSet ("ligados" nesta sequência). Deve haver alguma partibularidade em seu caso. Alterei, também, algumas propriedades e nada. Não sei mais como lhe ajudar, sinto muito. Há um probleminha com relação a atualização da caixa de texto quando você, utilizando o back-space, apaga o 1º caracter do texto de pesquisa - a caixa deveria ficar limpa, mas isso não ocorre. Para corrigir: procedure TMainForm.EDpesquisaChange(Sender: TObject); var Aux : integer; StrToSearch :String; begin EDpesquisa.OnChange := nil; Aux := EDpesquisa.SelStart; StrToSearch := copy(EDpesquisa.Text, 1, EDpesquisa.SelStart); if DMdados.TBcadequip.Locate('DESCRICAO', StrToSearch, [loPartialKey]) then EDpesquisa.Text := DMdados.TBcadequipDESCRICAO.AsString else EDpesquisa.Text := StrToSearch; // *** retirado um if antes desta linha EDpesquisa.SelStart := Aux; EDpesquisa.OnChange := EDpesquisaChange; end; Abraços.
-
Werner, comecei um pequeno projeto com MySQL e então baixei a versão 6.6.0 - beta (ZeosLib). Pelo que pude notar, a funcionalidade que você utilizava deve poder ser implementada com o componente ZSQLProcessor, através da propriedade Script. []s
-
Consulta Sql Entre Duas Tabelas
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
Se a mensagem é "Codigo not found", ela parece clara e sugere que você esteja utilizando um nome de campo que não existe na tabela. Qual a mensagem original? Qual a estrutura das tabelas envolvidas? Lembre-se também de comentar que banco você utiliza e componente de acesso. A sugestão do colega Kikonanet é correta. você deve buscar na cláusula SELECT apenas os campos que necessita. Isto evitará trafego de dados desnecessários entre o banco e sua aplicação. []s -
Jon Pline, o exemplo abaixo mostra como listar todos "indivíduos" da tabela Pessoas onde o mês de nascimento seja igual ao passado no parâmetro mês. Veja se consegue ajustar a suas necessidades. Query1.SQL.Clear; Query1.SQL.Add('SELECT *'); Query1.SQL.Add('FROM Pesoas'); Query1.SQL.Add('WHERE extract(month from DAT_NASCIMENTO) = :mês'); Query1.ParamByName('mês').AsInteger := mês; // número do mês a procurar Query1.Open; Se interessar avaliar o dia, utilize "extract(day from ..." OBS: Não utilize o acento "^" em mês - foi colocado automaticamente pelo editor do forum.
-
Procedimento Para Manipular Botões
pergunta respondeu ao gleistoncardoso de Micheus em Delphi, Kylix
gleistoncardoso, aparentemente não teria qualquer problema que impedisse de funcionar - os comandos parecem corretos.Está havendo alguma mensagem de erro? De que pontos você está chamando o procedimento? Eder Moraes, seu exemplo está correto para o caso de inversão dos status dos botões. Entretanto, o colega gleistoncardoso está manipulando os status dos botões baseado na condição em que encontra-se uma tabela (inserção/edição/browse). []s -
Pirambu!, em primeiro lugar você não pode usar o LIKE. Observe que você quer contabilizar um item específico, então compare utilizando um "=".O SQL da query que totaliza os itens para uso no cálculo deveria ficar assim: SELECT SUM (entradaPA.Quantidade) AS TotalEntrada FROM entradaPA WHERE fichatecnicaID = :ID No evento OnCalcField da tabela TableItensPedidos (onde você criou os campos calculados) você coloca o código mais ou menos assim: procedure TableItensPedidosCalcFields(...); begin Query1.paramByName(ID).Value := TableItensPedidosfichatecnicaID.Value; Query1.Open; TableItensPedidosTotalEntrada.AsFloat := Query1.FieldByName('TotalEntrada').AsFloat; // ou Query1TotalEntrada.AsFloat // Se adicionou os campos na query1 Query1.Close; end;Assim, no grid, este campo calculado aparecerá com o valor obtido na Query1. []s p.s. Voltarei a ler as mensagens apenas dia 1º de janeiro. Boas festas de fim de ano!
-
Churc, a título de implementação de teste, acho que era isto mesmo; o uso de array deixou-o bem simples. Apenas acho que será mais conveniente, que a declaração das constantes e tipo (TInfoPlugin e similares) fiquem numa unit separada, a ser compartilhada pelos projetos. Também acho conveniente que comece a numerar os eventos a partir de 1 e não zero. Outra coisa, haverá a possibilidade de existirem mais que 32 eventos diferentes? Se ouver, talvez tenha que ser encontrada outra solução (apesar que tem o tipo int64). Não sei com que frequência seus plugins serão acionados, entretanto valeria avaliar se vale à pena carregar a DLL a cada chamada a um evento e descarregá-la depois. Quando for necessário carregar a DLL para executar um evento, você não a descarrega mais da memória. Só no término do programa. Então você poderia utilizar a propriedade Objects da sua lista de plugins para armazenar o handle do plugin carregado. Na hora de carregar, checa se já está inicializado, se não estiver carrega, do contrário utiliza o handle alocado. []s
-
luizf, você pode criar uma unit só para ela ou, ainda, definí-la na unit do form principal (no seu caso Form1), "exportá-la" colocando a definição (cabeçalho) da procedure antes da sessão Implementation e colocando o código completo após Implementation (junto com o código do form). Neste caso, para usá-la nos outros form's, você adiciona a unit do form principal na cláusula uses do form em questão. Se todos os form's que você quizer aplicar esta procedure tiverem os CheckBox cb_1 e cb_2, vamos passar como parâmetro o form atual. E para não nos preocuparmos com quem é o form principal, sabendo que queremos terminar a aplicação ao fechá-lo, vamos chamar logo o Application.Terminate (assim, fica um pouco mais genérica - vai que você troca o nome do form, daí tem que sair alterando...): procedure Fechar(FormAtual :TForm); var cb_1, cb_2 :TCheckBox; begin cb_1 := FormAtual.FindComponent('cb_1') as TCheckBox; cb_2 := FormAtual.FindComponent('cb_2') as TCheckBox; if not Assigned(cb_1) or not Assigned(cb_2) then // apenas uma proteção contra esquecimento;-) Raise Exception.Create('Não foram encontrados os CheckBox esperados.'); if cb_1.Checked then // *** só fecha alguma coisa se checked begin if cb_2.Checked then // *** se checked, fecha aplicação através do close do form principal Application.Terminate else // senão fecha janela atual FormAtual.close; end; end; Então, para chamar você usa, por ex.: procedure Tform2.Button2Click(Sender: TObject); begin Fechar(Self); // o self é a instância do próprio form end;
-
Pirambu!, parece-me que este tópico está relacionado ao outro seu tópico (Problema com table). Lá eu lhe sugeri uma "solução" para a obtenção dos SUN's e cálculo do Saldo através de compos calculados (post #2).Você já tentou daquele modo? []s
-
Normalmente você utiliza este recurso para criar campos Calculado ou Lookup. Você quer dizer que cria um campo do tipo Lookup, onde a origem dos dados é a query?
-
Campos calculados são utilizados justamente para apresentarem valores calculado da forma como você precisa.Para definir um campo calculado (forma mais fácil), você deve acessar a lista de campos do dataset (TQuery, TTable, ...) - botão direito do mouse sobre o componente, tem uma opção relacionada aos fields (agora não estou lembrado). Na pequena janela que abre você clica com o botão direito e seleciona Add Field (acho que é assim). Então informa os dados solicitados, selecionando no radiobox a opção referente a calculado. Este tipo de campo só pode ser manipulado no evento OnCalcField do dataset em questão. Dê preferência a utilizar os valores do dataset evocando o tipo. Ex. tabitensVALOR.AsFloat, isso pode evitar problemas com campos que possam estar nulos e que serão convertidos, neste exemplo, para zero; A questão da coluna do DBGrid no modo ReadOnly (propriedade = true) é porque a edição será feita no grid e os campos calculados não poderão ser alterados lá - eles são calculados no evento apropriado. Este evento irá ocorrer a cada campo da tabela que for alterado. Assim, o ideal não utilizá-lo em excesso (se você depurar, vai ver que o evento é chamado muitas vezes). Toda operação que você fizer com eles será referente ao registro atualmente posicionado no dataset. Clariou um pouco? Não pude dar informações mais precisas, porque onde estou não tenho o Delphi. []s
-
VDLR, parece que não há risco de estar acessando conteúdo inválido. Só para confirmar, você utilizou a sugestão que dei no post #2 no sentido de fazer o processo de copy da string para a variável auxiliar antes de passá-la ao Locate? []s
-
Provavelmente algum dos valores está com nulo. você depurou para verificar com que valor as variáveis estão? Esta instrução eu não conheço não. Como é que você usa ela no SQL? []s
-
Pela mensagem de advertência, significa que você ainda não tinha incluído a chamada da procedure nos eventos do botão (é o que normalmente ocorre).Quando você passou para public, será que você já não teria adicionado a chamada? Então. É como coloquei em vermelho negrito no último post. No post #4 eu havia colocado um ";" depois do form1.close (não pode ter ";" antes de um else), o que gerou o erro e fez com que você introduzisse o begin..end; Só que nesta situação, você modificou a lógica que eu havia proposto. []s
-
Cabecao Bruno você vestá GRITANDO? É o que representa utilizar caixa alta nas mensagens. Se é por conta do outro post, de igual teor, ainda não respondido, o correto seria você fazer um up (adicionado como resposta para fazê-lo subir). Também se você necessitar refazer a pergunta, enquanto não houver uma resposta ao seu post, e estando registrado, você pode editá-lo. Bom, como ninguém postou nada (mas acho que talvez não possa acrescentar muito neste setido), vou colocar alguns comentários então. - Com relação ao banco de dado a utilizar, qual você utilizava com o Java? Talvez você possa aproveitar um pouco do seu conhecimento, sobre ele, no Delphi. - Acompanha o Delphi o Paradox e Interbase (não sei se em todas as versões), mas você poderia utilizar MySQL, Firebird, PostGre (todos Free), entre outros. Dependendo de qual você escolher, poderá opinar pelos componentes/método de acesso ao mesmo a partir do Delphi. []s
-
Então sabe porque se no caso eu for usar Type eu pretendo colocar um lugar pra armazenar os Eventos do plugin, pra não ficar carregando a cada evento todos os plugins e ficar passando o evento, acho que pode prejudicar na performance da aplicação, dar um LoadLibrary e FreeLibrary em todos os plugins a cada evento sendo que se eu der um loop e apenas chamar os plugins que tem aquele evento associado acho que vai ser bem melhor...Claro não precisa ser especificamente uma array, apenas um exemplo do porque eu queria armazenar os eventos dos plugins rs Bom, se entendi direito, cada DLL será um plugin, que poderá responder a diferentes eventos. É isso. Se for, você vai ter que carregar ela (DLL) ao menos uma vez para obter a lista de eventos que o plugin manipula, certo?! Vou exemplificar o que eu estava pensando: const OnStart = 1; OnExit = 2; OnDraw = 3; - Relação dos plugins a carregar(instalados) ListaPlugins ('Plug1', 'Plug2', 'Plug3', 'Plug4') - Relação dos plugins que respondem a determinado evento ListaEventos(('Plug1', 'Plug2', 'Plug3'), // OnStart ('Plug1', 'Plug2', 'Plug3'), // OnExit ('Plug2', 'Plug4')) //OnDraw Daí para responder ao evento OnExit, iria na ListaEventos e passaria por todos Plugins para execução do evento:for Idx := Lo(ListaEventos(OnExit)) to Hi(ListaEventos(OnExit)) do begin Carrega/executa plugin -> ListaEventos(OnExit)(Idx) passando o evento OnExit .. end; Não entendi muito bem o que você quis dizerCom os detalhes acima, será que ficou mais claro? Ok. Amanhã estarei on-line somente a noite.
-
Pelo jeito você nunca utilizou o QuickReport, não é?!Dá uma olhada neste tutorial do colega Progr'amador - Criando Um Relatório no QuickReport Passo a Passo Se ainda tiver dificuldade em entender, posta aí. []s
-
Vixe!!! tá feia a coisa heim?! :D Me dá uma dica. Declaração: type TForm2 = class(TForm) ... private procedure Fechar; // não vai necessitar de parâmetros ... end; Código da procedure:procedure TForm2.Fechar; begin if cb_1.Checked then // *** só fecha alguma coisa se checked begin if cb_2.Checked then // *** se checked, fecha aplicação através do close do form principal form1.Close else // senão fecha janela atual close; end; end; Chamar a procedure, por exemplo em tres botões com apenas a chamada desta procedure em comum.procedure Tform2.Button1Click(Sender: TObject); begin linha de código 1 linha de código 2 Fechar; end; procedure Tform2.Button2Click(Sender: TObject); begin Fechar; end; procedure Tform2.Button3Click(Sender: TObject); begin linha de código 1 linha de código 2 linha de código 3 linha de código 4 linha de código 5 Fechar; end; É isso aí.
-
Por enquanto vou responder esta, depois sigo a próxima. ;) luizf, o erro deveria estar em outro lugar. O problema continua devido aos posicionamentos dos begin..end; Vou colocar com os begin..end (que não seriam necessários) para ver ser você descobre onde está o verdadeiro erro. if cb_1.Checked then // *** só fecha alguma coisa se checked begin if cb_2.Checked then // *** se checked, fecha aplicação através do close do form principal begin form1.Close; end else // senão fecha janela atual begin close; end; end;Observe no código (comentários em vermelho): "2- Com o cb_1 checado e o cb_2 não checado, não fecha nada, era para fechar o form atual, form2." Se cb_1 Checked, testa cb_2; Se cb_2 Checked fecha o form1, senão fecha o atual; "3- Com o cb_1 não checado e o cb_2 checado, mas desabilitado por causa do cb_1 não estar checado, fecha o form atual, mas não era para fechar nada, pois o cb_1 não esta checado e o cb_2 esta checado, mas desabilitado, o que tambem desabilita qualquer função que esteja por traz deste, não é isso?" Se cb_1 não Checked, não tem nada a fazer. Agora é que eu entendi porque você tinha o erro. É que eu havia deixado um ";" depois do form1.close - era só remover. []s
-
Chr0n0, um pouco de atenção :excl: você não pode simplesmente substituir o código pelo que eu coloquei, simplesmente porque ele está incompleto! Observe as reticências (...). Faça o seguinte, você precisa é no seu projeto (parece-me já estar adiantado) colocar apenas o código da procedure KillTask, adicionar na cláusula uses a unit Tlhelp32 e no evento OnClick dos seus botões (a imagem que você postou tem 6 botões cada um com o nome do programa a encerrar) colocar a chamada ao procedimento. Por exemplo: procedure TForm1.Button1Click(Sender: TObject); begin KillTask('firefox.exe'); end; procedure TForm1.Button2Click(Sender: TObject); begin KillTask('node32kui.exe'); end; ... procedure TForm1.Button6Click(Sender: TObject); begin KillTask('iexplorer.exe'); end;Eu usei o "..." denovo heim?! []s
-
Só para não deixar você completamente sem resposta, com os componentes da paleta BDE posso afirmar que as tabelas/consultas são fechadas automaticamente ao destruir o form, porque já testei antes (monitorando o destroy). Muito provavelmente deve ocorrer a mesma coisa com os demais componentes - sem garantias, só testando.Particularmente, não sou muito a favor não. []s
-
Sendo pré definidas, não ficaria melhor o uso de constantes para indicar o tipo de evento? Neste caso, sua função poderia utilizar um CASE e não if's testando string. Apesar de não ocupar muita memória, o uso de array de um type, pode ser uma saída simples, mas a questão de limitar e, ao mesmo tempo, pré alocar 256 posições será que é uma boa idéia. Complicado usar uma dinâmica? Também imaginei que seria armazenado apenas o nome do plugin (não os eventos - o que não requer um record), já que o nome dele será repetido em outros eventos caso ele os processe. Bom, eu imaginei que se você tem uma lista dos plugins na stringlist, ao obter a lista de eventos do plugin, você faria uma "triagem", onde cada evento corresponde a uma posição na lista de eventos, e daí, nesta posição, você inclui o nome do plugin numa outra lista. Deste modo ao ser disparado o evento, você tem o índice no array de eventos (direto) e com isso acessa a lista de plugins que você tem que acionar. (não era isso?)* quando falo lista, pode ser um array, ok?! []s
-
Que banco de dados você utiliza?Com paradox, o uso de aspas duplas para delimitar texto é permitido e elimina este problema. Este exemplo utilizando alias do DBDEMOS (base que acompanha o D7) é válido: select * from vendors.db where vendorname = "Divers' Supply Shop" []s
-
luizf, acho que você se atrapalhou com os if's..else. Veja como deveria ter ficado: 1 - if cb_1.Checked then // *** só fecha alguma coisa se checked 2 - begin 3 - if cb_2.Checked then // *** se checked, fecha aplicação através do close do form principal 5 - form1.Close; 7 - else // senão fecha janela atual 9 - close; 10- end; mantive os nº para você verificar o que foi removido Vamos simplificar?cb_2.Enabled := cb_1.Checked; []s