
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Eder, esqueci de duas coisas: 1) Este novo dataset (o TTable) deve ser o utilizado no relatório, não o QueryTodos; 2) Se há a possibilidade de mais que um usuário retirar este relatório, talvez tenhamos que obter um nome temporário para o arquivo, ao invés de usar fixo. Abraços
-
Resultado de um Select em uma variável. Tem como fazer isso?
pergunta respondeu ao Fabiano Furquim de Micheus em Delphi, Kylix
Bom, a questão da busca dos dados pode ser melhor avaliada quando se souber sobre as tabelas envolvidas na questão (acredito que você não esteja utilizando apenas uma). Como eu disse, possivelmente daria para, com uma única consulta, trazer todas as informações necessárias caso o aluno seja encontrado. E, justamente este encontrado estará relacionado ao código obtido pelo leitor biométrico e que deve ser um dos campos de referência nos dados do aluno. Quanto a mover o resultado da consulta para as variáveis, utilizando seu exemplo, a forma correta seria esta: QryCursoAluno.SQL.Clear; QryCursoAluno.SQL.Add('select curso from ALUNO where Ra_aluno = :Ra_aluno'); QryCursoAluno.ParamByName('Ra_aluno').AsString := edit1.text; QryCursoAluno.Open; var_curso := QryCursoAluno.FieldByName('curso').AsString; QryCursoAluno.Close;observe, que é apenas um exemplo - eu não conheço os tipos de dados que você está usando, logo pode haver algo errado. Algumas observações: - o ":" no SQL indica que aquele Ra_aluno que o segue é um parâmetro; - preferencialmente utilize a parametrização nas consultas; - quando passar o parâmetro, utilize o método adequado ao tipo de dados que será utilizado no SQL. No exemplo, eu supus que Ra_aluno, na sua tabela, seja um varchar, assim, ao passar o parâmetro eu utilizei o método AsString. Se fosse numérico, seria preferível fazê-lo deste modo: QryCursoAluno.ParamByName('Ra_aluno').AsInteger := StrToInt(edit1.text); - Se você utilizar um datamodule para colocar seus datasets (tipo table ou query, como o TIBQuery) e utilizar um especificamente para cada verificação que fizer, então, as duas linhas iniciais não são necessárias no código. Isso porque você adiciona neste dataset a instrução SQL direto na propriedade SQL do componente em design-time e não há a menor necessidade de ficar fazendo isto no código (vamos poupar linhas de código). Mas, se você utilizar um componente "genérico" onde você o utiliza para diversas consultas (diferentes), então sim, continue mantendo este tipo de código. Se for para apresentar em tela, há algumas possibilidades: - uso de componentes data-aware (TDBEdit, TDBMemo,...), que vinculados à consulta (dataset), automaticamente mostrarão o resultado obtido; - uso de componentes não data-aware (TEdit, TMemo, ...), onde você deverá mover os valores de cada coluna do resultado de seu dataset não "mão". Um ex.: Edit1.Text := QryAlunos.FieldByName('Nome').AsString; Edit2.Text := QryAlunos.FieldByName('Matricula').AsString; Voce verá em alguns post, aqui no forum, outros exemplos não estou certo de este seria o melhor exemplo de aplicação de uma stored procedure - veja que é uma consulta simples. O uso dela, ao meu ver, é mais interessante quando são necessárias algumas ações sobre o banco quando uma determinada condição é satisfeita. Como o nome diz é uma procedure (procedimento), algo que requeira processamento, não uma simples consulta. Estes links que o Jhonas lhe passou devem servir de partida. Sugiro dar uma olhada nestes sites sobre Firebird, voce pode encontrar informações relevantes sobre ele, já que você está meio enferrujado :D Documentação FireBird - Firebird.Org (site oficial - Inglês) FireBird.Br (Português) Abraços -
(Resolvido) Enviar direto para impressora
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
João Paulo Taraciuk, desculpe-me, esqueci de por o último parâmetro da função RightStr - Size: Result := RightStr(StringOfChar(Ch, Size) +Source, Size); E também não havia mencionado (apesar que você já colocou): é necessário adicionar a unit StrUtils na cláusula uses. Observei que você adicionou a função como um método do form. Isto não é necessário - é uma função independente do form, logo se você tiver uma unit onde colocas funções deste tipo (funções úteis de aplicação em vários projetos), coloque-a lá e adicione este sua unit na cláusula uses. ;) Abraços -
Eder, testa aí para ver no que dá: procedure TForm1.Button1Click(Sender :TObject); // acrescentamos este procedimento dentro da procedure do botão procedure CopiaResultados(DataSet :TDateSet); var Idx :Integer; begin DataSet.First; while not DataSet.EOF do begin TabTmp.Append; for Idx := 0 to DataSet.FieldDefs.Count -1 do TabTmp.Fields[Idx].Assign(DataSet.Fields[Idx]); TabTmp.Post; DataSet.Next; end; end; begin ... // aqui fica o código que você já tinha If Combobox1.Text = 'TODAS' then begin ... QueryTodas.ParamByName('dataI').AsDate := DateTimePicker1.Date; QueryTodas.ParamByName('dataF').AsDate := DateTimePicker2.Date; QueryTodas.Open; try TabTmp.DatabaseName := QueryTodas.DatabaseName; TabTmp.TableName := 'TmpTable.db'; TabTmp.TableType := ttParadox; if FileExists(TabTmp.DatabaseName +'\' +TabTmp.TableName) then TabTmp.DeleteTable; TabTmp.FieldDefs.Clear; TabTmp.FieldDefs.Assign(QueryTodas.FieldDefs); TabTmp.IndexDefs.Clear; TabTmp.IndexDefs.Add('', 'UNIDADE', [ixPrimary]); TabTmp.IndexDefs.Add('FRETE_TOTAL_IDX', 'VALOR_FRETE_TOTAL', [ixDescending]); TabTmp.CreateTable; TabTmp.IndexName := 'FRETE_TOTAL_IDX'; TabTmp.Open; try CopiaResultados(QueryTodas); FrReport3.ShowReport; finally TabTmp.Close; TabTmp.DeleteTable; end; finally QueryTodas.Close; end; Application.ProcessMessages; Aguarde.visible:=FALSE; end; ... // aqui continua a parte do seu código end;
-
Resultado de um Select em uma variável. Tem como fazer isso?
pergunta respondeu ao Fabiano Furquim de Micheus em Delphi, Kylix
Na verdade, se suas tabelas estiverem bem estruturadas, você busca todas estas informações em um select, o que deverá resultar em uma linha no seu dataset. Ou seja, a consulta é a própria verificação, retornando algumas informações. Não entendi essa de trazer para variáveis para depois fazer as verificações. :huh: Abraços -
- Crie uma variável que seja o índice da música em execução (IdxPlay :integer); - Inicialize ele sempre que carregar sua lista com o nome das músicas (IdxPlay := -1); - Quando a música acabar (deve ter um evento que você possa saber disto), enquanto não tiver alcançado o fim da lista, incremente ela, e obtenha o nome da próxima música e ponha para tocar; if IdxPlay < ListBox1.Items.Count then begin Inc(IdxPlay); MediaPlayer1.FileName := ListBox1.Items[IdxPlay]; MediaPlayer1.Play; end; Algo assim, veja se consegue avançar. Abraços
-
Eder, preciso de mais informações. Se selecionado todas, você monta a QueryTodas, beleza. Mas, se não for todas, como fica? - É uma de cada vez? - você tem um relatório para cada situação? Abraços
-
Experimente adicionar esta linha no OnShow da sua aplicação: RichEdit.Perform(EM_SETUNDOLIMIT, 10, 0); Isto irá permitir 10 níveis de undo/redo. "Não é feitiçaria, é tecnologia" (lembram da Feiticeira dizendo isso em um comercial?! :D) Eu já postei recentemente 2 vezes esta referência, mas vou por aqui também: About Rich Edit Controls - Tudo que precisar saber sobre RichEdit, é aí que você encontra. Especificamente sobre EM_SETUNDOLIMIT, e se for necesspario EM_SETTEXTMODE. Abraços
-
Exportar quick report para PDF ou DOC
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
Se a dica do colega João Paulo Taraciuk, não lhe ajuda, então o que você lerá neste post pode lhe deixar triste. ;) Abraços -
(Resolvido) Enviar direto para impressora
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
O código está assim Writeln(Texto,''+ZQuery3.FieldByName('Quantidade').AsString + ' '+ 'x'+' '+formatFloat('#0.00',ZQuery3.FieldByName('Unitario').AsFloat)+ ' = '+formatFloat('#0.00',ZQuery3.FieldByName('Total').AsFloat)); e sai assim, fora de ordem, você teria que formatar os números e texto, completando com espaços à esquerda para que cada coluna tenha o tamanho correto. Daí sua linha sendo enviada para a impressora teria sempre a mesma largura e as colunas estaria na mesma posição. Fazendo uso desta função: // Source = a string passada para ser formatada // Ch = caracter a ser utilizado para preencher à esquerda // Size = tamanho da string que deve ser retornada (largura da coluna) function FormatStrSize(Source :string; Ch :char; Size :byte) :string; begin Result := RightStr(StringOfChar(Ch, Size) +Source); end; voce poderia organizar melhor sua concatenação, tornando-a clara alterações. var Buffer :String; begin ... Buffer := FormatStrSize(ZQuery3.FieldByName('Quantidade').AsString, ' ', 4); // formata o número para 4 caracteres Buffer := Buffer +StringOfChar(' ', 5); // gera uma string de 5 espaços Buffer := Buffer +'x'; Buffer := Buffer +StringOfChar(' ', 3); // gera uma string de 3 espaços Buffer := Buffer +FormatStrSize(formatFloat('#0.00', ZQuery3.FieldByName('Unitario').AsFloat), ' ', 5); Buffer := Buffer +' = '; Buffer := Buffer +FormatStrSize(formatFloat('#0.00',ZQuery3.FieldByName('Total').AsFloat), ' ', 5); Writeln(Texto, Buffer); ... end; Veja se você entendeu a idéia. Já que usa esta impressora, porque você não utiliza os recursos oferecidos no site deles. Dá uma olhada na sessão download da Bematech - tem exemplos em Delphi. Acho que valeria a pena. Voce pode facilmente utilizar negritos/itálicos... Abraços -
Observe que este procedimento apenas "disse" ao Image para desenhar-se na área (canvas) pertencente ao Memo. O componente Memo em si, não tem qualquer compromisso com a impressão da imagem. É diferente de quando você adicionar uma imagem em um documento RTF (uso do RichEdit) porque ele é incorporado ao documento (não é uso de Parent) e, em teoria, a impressão deve ocorrer sem problemas. Se houver restrição do componente, mas ao abrir o documento pelo Word, você verá que a imagem está lá e daí, com certeza, imprimirá. (já citei algumas ref. sobre o RichEdit em um tópico recente) Como você está imprimindo "na mão", falta apenas acrescentar a impressão do componente Image. Voce deve usar o canvas da impressora para imprimir a imagem na posição desejada.Voce pode usar duas opções: 1) desenhar a imagem dentro de uma área retangular definida - tamanho ajustado ao retângulo: Printer.Canvas.StretchDraw(Rect, Image1); 2) desenhar a imagem na posição especificada - tamanho original: Printer.Canvas.Draw(x, y, Image); Abraços
-
Rafael, você está ciente de que utilizando um TMemo, este tipo de alteração ocorrerá para todo o conteúdo do memo? Se esta não for sua idéia, utilize um TRichEdit em seu lugar. Vá até a paleta Dialogs e adicione um componente TFontDialog. Para mostrar a caixa de diálogo, você usa o método Execute. Ele retorna True se foi pressionado Ok ao fechá-la. Então, para o caso do TMemo, o uso ficaria mais ou menos assim: procedure TForm1.Button1Click(Sender :TObject); begin if FontDialog1.Execute then Memo.Fonts.Assign(FontDialog1.Font); end; Já, para o caso do TRichEdit, o uso ficaria mais ou menos assim: procedure TForm1.Button1Click(Sender :TObject); begin if FontDialog1.Execute then begin RichEdit1.SelAttributes.Charset := FontDialog1.Font.Charset; RichEdit1.SelAttributes.Color := FontDialog1.Font.Color; RichEdit1.SelAttributes.Name := FontDialog1.Font.Name; RichEdit1.SelAttributes.Pitch := FontDialog1.Font.Pitch; RichEdit1.SelAttributes.Size := FontDialog1.Font.Size; RichEdit1.SelAttributes.Style := FontDialog1.Font.Style; end; end;no caso do uso do RichEdit, eu sugiro que você desabilite a propriedade HideSelection (False), para que ao abrir a caixa de texto, o texto selecionado não seja "oculto". Teste e veja os resultados. Abraços
-
Voce já tentou da página de download do site oficial: http://www.fabforce.net/downloads.php
-
Se o esquema de recursos não lhe serve, neste caso, você estaria falando de um gerador de aplicações - como o próprio Delphi. Bom, você poderia gerar um código fonte e utilizar um compilador de linha de comando, a ser executado pelo seu programa com os parâmetros necessários e daí gerar um executável - um exemplo: X-Maker. Mas, ainda não seria seu programa gerando ele. Não seria apenas um SaveToFile que resolveria seu problema. Como você mesmo disse, precisaria compilar/linkar, para obter o executável. Dê uma olhada nestes artigos. Talvez você entenda a complexidade do que pretende (ou pelo menos, é o que parece): - Criando um Programa - Vamos Construir um Compilador!, ou a versão original Let's Build a Compiler Abraços
-
Durubi, também achei estranho. Mas será que não poderia ser fazendo uso de lista circular? Se ele já aprendeu sobre ponteiros e tal, daria para fazer com este recurso. Um while, para "varrer" a lista, ele terá que usar de qualquer modo.
-
Parabéns Jhonas. Seja bem vindo, em definitivo, ao time SB-Delphi/Kylix. :D
-
klink, este erro é comum quando você tenta converter um texto em branco ('') utilizando uma função como a que você está utilizando. Eventualmente, se não for crítico, você poderia utilizar a função StrToFloatDef(<texto>, <valor default>), onde o valor default será o valor que você quer que seja assumido, caso o valor em <texto> não seja válido. Abraços
-
o motivo é que quando definido um bitmap para a propriedade Brush, ele o usa para o preenchimento do fundo ao invés de usar a cor sólida.O estranho é que este recurso deveria utilizar apenas um bitmap de 8x8 pixel. E pelo que pesquisei, a documentação diz que seria copiado apenas um retângulo deste tamanho a partir do canto superior esquerdo. :huh: acho que a melhor opção seria utilizar o componente TRichEdit. vous parlez français? :D Dê uma olhada neste tópico "INSÉRER UNE IMAGE (BITMAP) DANS UN RICHEDIT (RXRICHEDIT)" (não estou gritando, o título está assim mesmo ;)) Não se preocupe, o código está em Inglês. ;) Abraços
-
Greed, este TRichView é realmente muito bom em termos de recursos. Se você leu lá, ele implementa o padrão RTF sem fazer uso do RichEdit da microsoft - a dll utilizada pelo componente TRichEdit que acompanha o Delphi. O componente RichEdit não suporta corretamente tabelas dos arquivos RTF. Basta que você crie um documento no Word, adicione uma tabela e grave ele com o formato RTF. Depois, no delphi, use o método LoadFromFile do componente TRichEdit para ver como fica. Conforme artigo no msdn ("About Rich Edit Controls"), na versão 3.0 do RichEdit (Riched20.dll) o suporte a tabelas é bem simples (Simple tables), onde onde as colunas são simuladas por tabulações. O suporte melhorado a tabelas (Improved table support) foi introduzido na versão 4.1 (Msftedit.dll) que está disponível apenas nas versões do Windows XP SP1 e superior. Em teoria você poderia pegar esta última dll e copiar para outras versões do Windows, onde instalar seu programa, no entanto legalmente isto não deve ser permitido. Ainda assim, para fazer uso dela em um componente como TRichEdit do Delphi, seria necessário fazer algumas modificações no source (código fonte) pois ele não está preparado para carregar esta versão (as versões Delphi antes do WindosXP, pelo menos). Achei este tópico (Using tables in TRichEdit or TWebBrowser) no forum Expert-Exchange (talvez seja necessário se registrar para lê-la - é que eu já sou :blush:), procure pelo post com o título Accepted Solution (o cara explica como fazer isto). Uma opção poderia ser o uso de OLE, onde você introduziria uma planilha, com a Excel, dentro do documento (é como você faz no Word, quando acessa o menu Inserir->Objeto e escolhe Planilha do Microsoft Excel). Mas isso, a princípio não daria para fazer direto no TRichEdit. Se não estou enganado, pelo que li por aí na net, tem que fazer alguma coisa a mais. Entretanto, o componente da TJvRichEdit da paleta JvEdit da biblioteca do Projeto Jedi oferece este recurso. Caso você não possua estes componentes (são freeware), sugiro que baixe o demo JVCL300MegaDemo.zip, descompact ele e acesse a Paleta Jv Edit, clique no último componente desta paleta - JvRichEdit . Na caixa de texto à esquerda (tipo um memo) click no link http: 113, e você verá um editor de texto prontinho. Se ele lhe interessar, então é só acessar este link e baixar o JVCL 3 e o JVCL Help Files. (se não me engano este demo acompanha a instalação do componente) Se for o caso, espero que algum outro colega possa lhe ajudar com estes componentes - eu não faço uso deles (até já os instalei no passado, mas...). Abraços
-
Diferença Entre Datas (anos, Meses E Dias)
pergunta respondeu ao Paulo Nobre de Micheus em Delphi, Kylix
so_free, você disse "sou novo no visual basic". Este é o forum de Delphi/Kylix, se a dúvida for mesmo em VB informe-nos que moveremos para a sessão correta. Abraços -
labanca, você não postou sua instrução SQL, o ideal seria tê-la colocado. Mas, pelo seu exemplo, e resultado apresentado, parece que você faz algo como: SELECT Cod, COUNT(Resposta) FROM <nome_tabela> WHERE Resposta = 'sim' Se for isto mesmo, não tem como mostrar na resposta os códigos que, por acaso, não tenham a resposta "sim" com o valor zero. Para conseguir algo assim, você poderia partir da idéia de que você busca apenas um item de cada código da sua tabela. Seria algo assim: select distinct cod FROM <nome_tabela> isto, faz com que você tenha uma lista distinta (distinct - apenas uma ocorrência) de todos os códigos existentes na sua tabela. Com isto em mente, você pode, agora, imaginar que para cada código deste resultado, você busca a quantidade de uma determinada resposta para ele. Neste caso, a resposta poderá ser 0 (zero) ou uma determinada quantidade. A consulta ficaria mais ou menos assim: select distinct cod, (SELECT count(Resposta) FROM <nome_tabela> T2 where T1.cod = T2.cod and Resposta = 'sim') qtd FROM <nome_tabela> T1Observe que "criamos" uma segunda coluna (qtd) em que seu valor é obtido do resultado de uma outra consulta (sub-consulta). Esta consulta traz especificamente a quantidade (count) de respostas 'sim' para o código na consulta principal sendo "processado" - isto é viabilizado pelo relacionamento estabelecido entre os campos Cod nas duas tabelas (a tabela é fisicamente uma só, apenas utilizamos ela duas vezes e usamos um alias - necessário - para diferenciá-la: T1 e T2). Resumindo: para cada cod na consulta principal, contamos a quantidade de sim na consulta secundária. Veja se isto lhe ajuda. Abraços
-
comando no bloco de notas para abrir pasta do cd inserido
pergunta respondeu ao mairadesign de Micheus em Outras Linguagens de Programação
Em meus favoritos tenho este link Entenda e construa arquivos AUTORUN, não estou certo de que irá lhe ajudar muito, mas talvez você possa entrar em contato com o autor, para tirar esta dúvida. Boa sorte. -
A sugestão é que você use uma consulta SQL para obter os dados na ordem que precisa. E se ainda assim, precisar gerar a tabela temporária com estes dados, você já os terá na ordem desejada. acho que aqui você quiz dizer "decrescente" ao invés de "ascendente". ;)Bom, nunca gerei um índice composto em que apenas um dos campos fosse em ordem inversa, mas acho que não seria possível, porque a informação sobre a ordenação vai na propriedade Options que não faz distinção de campo. Então, se quiser testar, faça: Options := [ixPrimary, ixDescending], apesar de que não sei se a chave primária aceita este flag na sua criação. Voce pode dar uma olhada neste post que também se refere a uma proposta de solução para um problema similar. Abraços
-
Greed, olhando seu primeiro post, você fala que precisa de "um editor de texto". A pergunta do colega Duduh_Capixaba é pertinente, porque se realmente for o que você queira, em princípio, pode não ser possível usar o StringGrid. Abraços
-
Pirambu!, isso ocorre porque por padrão do windows a linha selecionada tem o fundo azul escuro (clHighlight) com o texto branco (clHighlightText), enquanto que as não selecionadas o fundo é cinza (por ex.) (clWindow) com as letras preta (clWindowText). Como você muda apenas a cor do fundo e passa a pintura para o procedimento padrão (DefaultDrawDataCell), ele usa as configurações atuais para esta célula que será a cor de fundo que você mudou + a cor de texto que ele deveria utilizar para uma linha selecinada. obs.: as constantes entre parênteses são aquelas definidas no componente e que os valores RGB (cor efetiva) são obtidos do sistema. O negócio é quando você mudar a cor do fundo, também mudar a cor da letra. Então sugiro que seu procedimento fique assim: if not odd(dados.QMateriais.RecNo) then begin DBGrid1.Canvas.Brush.Color:= clInfoBK; DBGrid1.Canvas.Font.Color:= clIntoText; end DBGrid1.DefaultDrawDataCell(Rect,Column.Field,state); Não há porque você utilizar o método FillRect se você chama o procedimento padrão de pintura. Voce só precisa se preocupar com este detalhe, caso você faça toda a pintura da célula - que não é o caso. Assim, basta apenas mudar as propriedades do canvas que ele irá usá-las ao desenha a célula. Alerto para o fato de que você não tratar se a linha está selecionada, terá como resultado o fato de a mesma não ficar em destaque. O ideal é que isso fosse verificado através da verificação do parâmetro State que a procedure lhe passa: if not (gdSelected in State) then if not odd(dados.QMateriais.RecNo) then begin DBGrid1.Canvas.Brush.Color:= clInfoBK; DBGrid1.Canvas.Font.Color:= clIntoText; end DBGrid1.DefaultDrawDataCell(Rect,Column.Field,state); Abraços