
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
flavioavilela, que bom que encontrou outra solução. Como volta e meia aparece dúvida similar, voce poderia fazer a gentileza de postar os links para que sejam úteis a outros colegas também?! Abraços
-
Como Pegar o Nome da Musica que toca no WMP?
pergunta respondeu ao Clark Kent de Micheus em Delphi, Kylix
Dê uma olhada nestes links. Não tem um código específico para o que você quer, mas podem dar uma pista de como se conectar como Media Player: - Windows Media Player 11 SDK - Windows Media Player Plug-ins - Media Player Visualizations (by Chris Bell) - Delphi Media Player Visualizations (atenção a The Media Player 9 type library - no Delphi, menu Component->Install Activex Control... = gerar arquivo WMPLib_TLB.pas. Faz parte dos fontes fornecidos pelo autor) Boa sorte. -
Entendo... Bom, eu apenas montei uma estrutura de tabelas e dados de acordo com o que você passou. Na prática, você pode ter alguma situação em que não foi prevista por mim.Postando aqui o que pus no código: select Referencia, Descricao from Produto P where not exists(select * from Estrutura E where E.Filho = P.Referencia) order by Descricao // esta consulta tem como objetivo buscar os nós raiz // dada a falta de informação mais específica sobre quem compõe o // 1º item da hierarquia, foi assumido que este produto será aquele // que não é filho na tabela Estrutura. E esta é uma suposição que pode não ser verdadeira - apenas você poderá saber se é válida em todos os momentos. Em caso de não ser, fica a continuação do comentário: // O uso de um campo, na tabela Estrutura, indicando o nível do item nela // existente, ajudaria em muito neste processo na verdade você não está sabendo o que comparar. Observe pelo seu exemplo que você quer procurar pelo texto da descrição do produto e não do pai (que é um código, penso eu, e que corresponde a referência do produto) Assim, se a idéia é pesquisar apenas nos nós raiz (os pais iniciais), a única alteração a ser feita e nesta SQL que busca os nós raiz e ele ficaria assim select Referencia, Descricao from Produto P where not exists(select * from Estrutura E where E.Filho = P.Referencia) and upcase(P.Descricao) like :Descricao order by Descricao no código: ... QryPai.SQL.Add('select Referencia, Descricao'); QryPai.SQL.Add('from Produto P'); QryPai.SQL.Add('where not exists(select * from Estrutura E where E.Filho = P.Referencia)'); QryPai.SQL.Add('and upper(P.Descricao) like :Descricao'); // <<<<<<<< AQUI QryPai.SQL.Add('order by Descricao'); try QryPai.ParamByName('Descricao').AsString := AnsiUpperCase(Edit1.Text); // <<<<<<<< AQUI // se for componente da paleta ADO: QryPai.Parameters.ParamByName('Descricao').Value := AnsiUpperCase(Edit1.Text); QryPai.Open; while not QryPai.EOF do ... observar que usamos a função UPPER no SQL e passamos o parâmetro já convertido em caixa alta de modo a garantir que não haja distinção entre maiúsculas e minúsculas. Abraços
-
se não forem muitas colunas, e se for apenas para visualização, talvez você pudesse mostrar as informações em um TreeView mesmo. Veja como poderia ser feito (é só uma idéia e que talvez você possa aproveitar: By micheus at 2008-09-17 Exemplo comentado: TreeView Colunado Foram setadas as propriedades ReadOnly=True e ShowRoot=False; Para o header usei o componente THeaderControl (paleta Win32), configurado com as colunas da largura que são usadas no desenho do treeview. Abraços
-
Christiane, neste caso, esqueça a parte que eu falei sobre o quick (observe que no Post#4 eu percebi que não era apenas algo relacionado a ele) e veja o que o colega Vivendo&Aprendendo, postou depois: Veja se não é a sua situação. Abraços
-
claudyo, não deveria, mas diante do que você anda experimentando... Apesar de talvez ficar um pouco trabalhoso (não sei quantos parâmetros você passa), ao invés de atribuir o valor de um Edit.Text vazio. Teste o valor antes de atribuir ao parâmetro e, se estiver em branco, não atribua ao parâmetro: ... if Edit2.Text <> '' then ADOQuery1.Parameters.ParamByName('Fone').Value := Edit2.Text; ... ou esta outra variante, onde garantimos que o valor do parâmetro está nulo:... if Edit2.Text <> '' then ADOQuery1.Parameters.ParamByName('Fone').Value := Edit2.Text else ADOQuery1.Parameters.ParamByName('Fone').Value := null; ... da forma como está agora, aparentemente os inserts estão sendo montados (pelo driver) mais ou menos assim: INSERT Pessoa ('Codigo', 'Nome', 'Fone') VALUES (125, 'Pedro Amaro', '') a idéia é forçar que os campos não informados sejam passados como nulos, ou seja, obter algo assim: INSERT Pessoa ('Codigo', 'Nome', 'Fone') VALUES (125, 'Pedro Amaro', NULL) Veja o que acontece. Abraços
-
claudyo, como você está fazendo esta inserção. Voce está utilizando componentes data-aware ligados ao dataset, ou está usando queries (com insert) parametrizadas? Abraços
-
O que havia feito tinha também este recurso. ;) facilite sua vida e use apenas: TreeView1.FullExpand; Abraços
-
então, se você já visualizou a impressão, deve ter percebido que a seqüência de impressão ocorre linha após linha na primeira coluna e depois segue para a segunda: | :¨| :¨ | : | : | : | : +-> +-> agora ficou mais claro. Voce grava a quantidade em uma tabela. Então, na impressão do relatório, a consulta (query) tem estas informações. Perfeito! Vou supor que você já preparou seu relatório no que diz respeito a colocar os TQRLabels e TQRDBTexts na banda detalhe (rbDetail) - é apena o que precisamos. Iniciamos pela questão da impressão da quantidade de etiquetas conforme cadastrado na sua tabela (e que você retorna na query1). Como eu disse anteriormente, usaremos o evento OnNeedData e você não deve relacionar seu QuickRep com a query1 (via propriedade DataSet, como seria o comum - ela deve estar vazia). - Declare na sessão private do form do relatório, uma variável ContaEtq :Integer; - No evento BeforePrint do QuickRep, inicialize ela ContaEtq := 0 e posicione sua query1 no início (query1.First). Isto é necessário, porque a manipulação dos dados agora será por nossa conta - normalmente o próprio quick se preocupa em posicionar no início do dataset, mas nós não estamos permitindo isto; - No evento OnNeedData, o parâmetro MoreData (mais dados?) é que controlará até que momento queremos que o quick reporte imprima algo em suas bandas. De um modo geral, faremos o óbvio: MoreData := not Query1.EOF, ou seja, tem mais dados enquanto não for o fim do arquivo; - No evento AfterPrint da banda detalhe (a etiqueta em si), iremos avançar a linha do dataset, que é o registro referente ao item a ser impresso na etiqueta. Entretanto, apenas faremos isto, quando ContaEtq atingir a quantidade registrada no respectivo campo do dataset; - se houver alguma informação a ser movida para a banda detalhe antes de ela ser impressa, utilize o evento BeforePrint ... procedure TForm1.QuickRep1BeforePrint(Sender: TQuickRep; var PrintReport: Boolean); begin ContaEtq := 0; end; procedure TForm1.QRBand1AfterPrint(Sender: TQRCustomBand; BandPrinted: Boolean); begin Inc(ContaEtq); // quando o contador chegar ao número esperado, avançamos o dataset // o igual, é justamente porque começamos o contador em 0 (se fosse em 1, // precisaríamos usar apenas o maior if ContaEtq >= query1.FieldByName('Quantidade').AsInteger then begin query1.Next; // avançamos o registro ContaEtq := 0; // reinicializamos o contador end; end; procedure TForm1.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean); begin MoreData := not query1.EOF; end; Acho que não esqueci de nada, então faça esta parte e confira se funciona. Estando Ok, passaremos a questão da definição das coordenadas da etiqueta inicial, que consistirá de uma adaptação (inclusão) ao que já temos aqui - assim, não embolamos o meio de campo. Abraços p.s. quanto a add ao MSN, só em casos específicos faço isto (já imaginou minha lista de contatos? não ia nem poder ficar on-line ;))
-
claudyo, dê uma olhada se na estrutura das suas tabelas no MSAcces e veja se estes campos não estariam com a propriedade Permitir comprimento zero = Não - isto se encaixaria como motivo para esta sua solução funcionar, bem como o erro apresentado - experimente. Abraços
-
tirado de outro tópico similar... Quando da utilização de GROUP BY, nesta cláusula devem constar todos os campos que estão definidos no SELECT menos os que correspondem a função de agregação. Por exemplo: SELECT CADMOV.data_mov, CADMOV.nota_fisc, VENDEDOR.NOME, SUM(CADMOV.Total_nota) AS Total_nota FROM (CADMOV INNER JOIN TIPOS ON CADMOV.tipo_oper = TIPOS.TIPO) INNER JOIN vendedor ON CADMOV.Cod_vend = vendedor.COD_vend GROUP BY CADMOV.data_mov, CADMOV.nota_fisc, VENDEDOR.NOME Procure ler alguma apostila sobre SQL - irá ajudar bastante. Abraços
-
Como criar o executável do Projeto
pergunta respondeu ao LucaPurificação de Micheus em Delphi, Kylix
Se você já conseguiu executar seu programa, você já gerou um .exe; Caso contrário, dê uma olhada neste tópico: Compilando Arquivos Dica aos iniciantes: - Antes de seguir os tutoriais, procurem ler apostilas, livros ou artigos que apresentem a ferramenta - conheça ela, antes de tudo (tente, pelo menos, conhecer as possibilidades); - Apostila completa de Delphi (147 Páginas) (ref. Apostilando.com) Abraços -
Continuamos sem as respostas aos meus questionamentos... :( esta configuração diz respeito a propriedade Columns (QuickRep.Page.Columns)?Pergunto isto, porque nesta configuração, o quickreport estará fará a impressão das informações na seqüência coluna x linha e não linha x coluna e isto influencia na questão de que o usuário deverá informar a coluna/linha inicial. mas sem as quantidades não é?!Estas quantidades estão sendo mantidas aonde? Em TEdit's? Como tentei explicar antes, esta forma não serve para o quickreport. Isto funcionar bem quando você imprime direto para a impressora (ou gera um arquivo).No caso do QuickReport ou você tem as informações nos datasets ou controla sua impressão via evento OnNeedData, que determina até quando as bandas devem ser processadas (impressas). De algum modo temos que saber que etiquetas deverão ser impressas (lógico, que as que tiverem quantidade definidas) e esta informação ou estará no dataset (que parece não ser o seu caso) ou deverá haver outro meio de sabermos que etique e a sua quantidade a ser impressa. E para sugerir algo, que você compreenda, faz-se necessário saber como você está tratando esta informação. Espero ter sido mais elucidativo sobre meus questionamentos. Abraços
-
claudyo, pela mensagem você está usando driver ODBC (eu costumo usar MS Jet). Voce não poderia configurar seu ADOConnection para utilizar JET no lugar de ODBC e então testar?Voce está passando algum parâmetro nesta ADOQuery? Veja estes posts: Erro ao inserir dados via ODBC e tableadapter -Valor de precisão inválido General Sql Error Abraços
-
Jhonas, como já implementei algo similar tempos atrás, permita-me dar um picato neste tópico... Pirambu!, como já disse o colega Jhonas, você precisará alterar a propriedade ImageIndex do respectivo item no seu TreeView. Aparentemente você tem seu TreeView fixo, ou seja, ele é apresentado com todas as opções de menus do seu programa. Por default, a propriedade ImageIndex é 0 (zero). Voce não informou se guarda no arquivo de controle do acesso, para cada usuário, a informação sobre todos os itens do menu (se tem ou não acesso) ou se apenas os itens que o usuário tenha acesso. Seja lá como for, o TreeView não sabe nada sobre isto e, deste modo, quando você seleciona um usuário, deverá inicializar todo o TreeView verificando na tabela de acesso, que item o usuário tem ou não acesso e ajustando a propriedade ImageIndex (para isto você usará um IF como já sugeriu o colega Jhonas). isto você fará também manipulando a propriedade ImageIndex.No evento OnDblClick do TreeView, você verifica o conteúdo da propriedade ImageIndex do item atualmente selecionado (p.e. TreeView1.Selected.ImageIndex). Se estiver com 0 você troca por 1 e vice-versa. No caso dos botões o procedimento é similar - tem que manipular o item selecionado. Quanto a gravar na tabela, você tem a opção de fazer neste mesmo momento, ou de após as alterações, oferecer uma opção para que as informações sejam gravadas e, então, você "varre" o TreeView e grava a informação adequadamente na tabela. Abraços
-
Nanielli, este problema aparentemente não tem relação com esta sessão que é de programação Delphi. Talvez ficasse melhor na sessão Remoção De Malwares (se estiver associado a vírus) ou Microsoft Windows, aqui do forum. Uma pesquisa no Google por "svchost erro de aplicativo" traz as seguintes respostas - ver resultado (você encontrará algumas possibilidades) OBS: Não use caixa ALTA ao escrever seus tópicos - significa que você está gritando!
-
Se você está se referindo ao nome do programa final (o executável), além é claro de renomear ele próprio via windows explorer, você pode renomear o seu projeto utilizando a opção do menu: File->Save Project As.... Depois disto, sempre que você compilar seu programa, o executável terá o novo nome - o executável tem sempre o nome do projeto. Convém lembrar que o fato de renomear o projeto, não elimina o projeto com o nome antigo. Assim, é conveniente que após renomeado o projeto, você exclua tudo que diga respeito ao arquivo de projeto antigo (que normalmente tem extensões como <nome projeto>.dsk, <nome projeto>.res, <nome projeto>.cfg, <nome projeto>.dof, <nome projeto>.dpr) Abraços
-
Bom, até o momento, eu saberia menos ainda. :unsure: Para tentar lhe ajudar, você deveria pelo menos postar as colunas da tabela(s)(e/ou relacionamentos) em questão.
-
Frega, se você conseguir trazer um indicador de níveis, ou algo que os identifique o nível junto ao registro retornado pelo dataset, talvez possamos fazer um ajuste visual utilizando os eventos OnDrawColumnCell. Veja o que consegue e post um exemplo do resultado da consulta com os campos em questão. Abraços
-
Como você está usando o quickreport, a resposta é não necessariamente! Esta quantidade é armazenada em alguma tabela (temporária ou não)? Se você preparar em uma tabela temporária as etiquetas a serem utilizadas pelo quickreport, então você poderá fazer uso de um loop para gerar a quantidade correta de etiqueta para cada produto e o quickreport utiliza este dataset temporário para imprimir as etiquetas adequadamente. Se não vai fazer uso de tabela temporária, então o caminho é outro e não vai utilizar um loop tipo FOR. Neste caso, uma sugestão depende da informação de como esta quantidade será manipulada. Mas, adianto que passa pela manipulação do evento OnNeedData - Sempre que os dados a serem impressos não corresponderem exatamente ao que consta no dataset principal (normalmente, vinculado ao quickreport), significa que o controle será feito "na mão" e através deste evento. Uma coisa que você não comentou é se está usando a opção colunas, ou seja, se definiu um valor superior a 1 na propriedade Columns. Abraços
-
Dionísio Júnior, lendo o post anterior e pensando melhor sobre a questão, vejo que usar o QRComposit não cabe no seu caso, porque o objetvo dele é agrupar relatórios (um após o outro). Ele não iria imprimir uma linha detalhe do primeiro, depois uma do segundo, depois a próxima do primeiro, .... Que parece-me é o que você precisa. Como sugeri antes, há um modo que considero simples de fazer isto. Usa apenas um form de relatório, menos componentes, agrupa e diminui a codificação. Porém, do ponto de vista do desesenho do relatório, o processo não é dos mais elegantes. Como estou em viajem de trabalho, não tenho tempo para explicar detalhadamente agora - se julgar necessário, volto a postar aqui no fim de semana. Deixo o link para um exemplo que fiz e coloquei alguns comentários nele que tenho certeza você conseguirá aproveitar se lhe interessar: Relarorio Composto.zip (descompactar e testar para observar o resultado) Abraços
-
Bom, neste caso, se não é apenas a listagem na forma como você postou antes, tem que visualizar o layout final esperado para uma melhor avaliação. Com os componentes padrões não dá para fazer isto de forma direta. Vai precisar buscar os dados de tal forma que possam ser utilizados no desenho personalizado do componente (seja um DBGrid ou TreeView). Abraços
-
Violação de acesso/ query.create(nil) e query.free
pergunta respondeu ao Gabriel Cabral de Micheus em Delphi, Kylix
Gabriel Cabral, tomara que tenha mesmo conseguido resolver o problema. O fato de utilizar o mesmo TQuery para fazer duas coisas distintas, pode mesmo ter sido a causa de seu problema - dependendo de como você estava tratando o uso dela para a consulta. Pela última mensagem de erro que você postou, parece que você teria adicionado os campos ao dataset, o que após substituir a instrução SQL que os adicionou, por outra que não inclua os campos definidos (em Fields), vai sim gerar erro ao abrir esta consulta. De qualquer modo, nesta sua Query2, você deveria utilizar a mesma consulta que utilizava antes para a obtenção do maior valor - usando MAX. Abraços -
Frega, baseado no exemplo que você postou, não ficaria mais simples va utilizar um TreeView para fazer isto? Abraços
-
gisele, basta que você utilize os método IndexOf da propriedade Items do TListBox. Veja no exemplo: ... // caso não exista na lista, será retornado -1 if ListBox1.Items.IndexOf(NomePrograma) >= 0 then begin ListBox2.Items.Add(NomePrograma); end else ListBox1.Items.Add(NomePrograma); ... Abraços