Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Gafanhoto, você tem mais eventos sendo tratado neste seu form? Experimente comentar o código dentro dos eventos (usando as chaves {/}), e deixando habilitado inicialmente apenas o do botão citado. Testa o programa. Caso o form fechar, tem que ser pensado em outra alternativa, do contrário, vai retirando o comentário um-a-um após cada código comentado (cada evento) e vai testando até descobrir qual está gerando este efeito estranho. Só para confirmar, você não está mostrando o form com ShowModal, certo?!
  2. nesta tela que você pôs, na propriedade Parameters tem um botãozinho [...]. É clicando nele que aparece o que eu queria que você respondesse. Deveria estar algo assim: http://img391.imageshack.us/img391/5581/delphiik5.jpg Confira e veja como fica o resultado. Preferencialmente, quando definida a SQL em design-time, declare o tipo dos parâmetros. Abraços
  3. Tatiane.InterArt, há ainda a possibilidade de você utilizar os componentes TRichEdit associado ao TQRRichEdit. você precisará, em design-mode : - adicionar um componente TRichEdit ao form do seu relatório (não preocupe-se com qualquer configuração dele, simplesmente coloque ele em um cantinho do form); - adicionar um TQRRichEdit e configurar a propriedade ParentRichEdit para apontar para o componente TRichEdit acionado no item anterior; Também, deverá setar a propriedade AutoStretch = True; e no código: - atribuir a sua string para o TRichEdit do form do relatório, via propriedade Lines.Text (como já lhe exemplificou o Jhonas) - RichEdit1.Lines.Text := s; - utilizar a função para identação de RichEdit que coloquei neste post, para que o texto possa ser justificado após atribuido ao TRichEdit - JustifyRichEdit(RichEdit1, True); Se você utilizar uma procedure no form do relatório para mostrar o texto (como meu exemplo anexo), o procedimento ficaria assim: procedure TForm2.ImprimeDoc(S :string); begin RichEdit1.Lines.Text := S; JustifyRichEdit(RichEdit1, True); QuickRep1.PreviewModal; end;a função, evidentemente deve estar na unit do relatório ou em uma unit de utilidades que seja referenciada nele. Abraços TstRichJustificado.zip
  4. etspaz, você não postou todo o código, mas imagino que você não tenha acrescentado esta linha ao final dele: XLApp.Quit; Abraços
  5. Sérgio H. Martins, a consulta como está não retorna o que você procura?Aparentemente, não há qualquer necessidade de executar um sub-select. Vejo que você está utilizando componentes da paleta ADO. Por acaso você está acessando banco de dados Access? você adicionou esta consulta ao seu componente ADOQueryjurossei em design-time? Se sim, você acessou a propriedade Parameters e definiu a propriedade DataType para o parâmetro pDataAtual? De que tipo? Abraços
  6. robinhocne, aparentemente, não consegui visualizar qual o problema através de um teste de mesa "virtual". O negócio é você tentar verificar a SQL que está sendo executada. Como você parece ter dificuldades ainda no processo de depuração, faça o seguinte, nesta sua unit, na procedure efetuaconsulta, utilize a procedure ShowMessage para mostra a consulta montada antes de sua execução: ... with dtmiza.qryiza do begin close; sql.Clear; sql.add (instrucaosql); ShowMessage(instrucaosql); // <===== AQUI open; end; e tome nota da instrução SQL apresentada e, então, analise ela. Abraços
  7. Estava olhando melhor o que você colocou em seu post e acho que viajei na minha sugestão anterior. Acredito que algo como o que está abaixo resulta no que você precisa: processar n items mantendo o esquema do if: program MediaPesoAltura; uses crt; var IdxPessoa, QtdPessoas :integer; Altura, Peso : Real; somaPeso, somaAltura : Real; qtdePeso, QtdeAltura : Integer; mediaPeso, mediaAltura : Real; begin qtdePeso := 0; qtdeAltura := 0; mediaPeso := 0; mediaAltura := 0; clrscr; Write ('Quantidade de pessoas a processar: '); readln (QtdPessoas); for IdxPessoa := 1 to QtdPessoas do begin Write (IdxPessoa, ' Altura : '); readln (Altura); Write (IdxPessoa, ' Peso : '); readln (Peso); If (Altura > 1.80) then begin somaPeso := somaPeso + Peso; QtdePeso := QtdePeso + 1; end; If (Peso > 100) then begin somaAltura := somaAltura + Altura; qtdeAltura := qtdeAltura + 1; end; end; MediaAltura := somaAltura / qtdeAltura; MediaPeso := somaPeso / qtdePeso; Writeln ('A media de peso : ', mediaPeso:0:2); Writeln ('A media de Altura : ', MediaAltura:0:2); ReadKey; end.
  8. Micheus

    Usando arquivo e lista em C

    Clara, comece procurando pela função fopen, no help ou aqui no forum (tem bastante coisa). Depois, cada linha lida do arquivo deverá ser "triada" de modo a obter palavra por palavra - você vai precisar fazer um loop enquanto sua string não for completamente processada. Para cada palavra que você extrair da linha, você deverá colocá-la em uma lista de palavras. Como esta lista pode ter tamanho variável, imagino que você deva utilizar alocação dinâmica. Eu sugeria que cada elemento desta lista fosse uma estrutura (struct), onde um campo seria a palavra e o outro a quantidade. A cada palavra encontrada na lista, você incrementa esta quantidade. Ao final do processamento de todo o arquivo, você terá a lista com todas a palavras e respectivas quantidade de ocorrências, bastando apenas percorrê-la e listar na tela. Abraços
  9. ROGERIO_DS, veja se esta parte de um artigo lhe auxilia: First In / First Out Control Register (FCR), onde ele fala sobre o uso do registrador FCR onde há dois bits que permitiriam você manipular o buffer FIFO caso você o utilize:Bit 2 = Clear Transmit FIFO Bit 1 = Clear Receive FIFO Abraços
  10. Micheus

    expressão numérica

    darkchrono, se é só dica, há muito tempo implementei isto fazendo uso de árvore binária e recursividade para o caminhamento, sendo que este deve buscar os valores nas folhas e o operador no nó pai (isto, já na resolução do problema). O processo de parse (análise da expressão) irá gerar a árvore. Se estiver estudando a respeito, talvez seja o caso de dar uma olhada em Analisador sintático LR. Mas, desenhar de ante-mão uma expressão no formato de árvore pode lhe ajudar no processo de desenvolvimento do algorítmo e teste de mesa. ;) Abraços
  11. fernandoafcs, acho que sem avaliar o código que você colocou, pelo menos, no contructor da classe (TCamada(int,int);) e no método GetNeuro vai ficar difícil sugerir algo.
  12. NöU@, acho que ele está quase certo. Tem a penas um restrição quanto ao uso de Strings como parâmetro (talvez alguém possa explicar-lhe melhor).Mas, quanto a esta questão e ao uso, dê uma olhada neste post do Churc e neste outro post do Jhonas. Abraços
  13. E aparece nessa linha de codigo em azul depois que aperto ok: if ENumero( Copy( nPro, i, 1 ) ) then roginhocne, acho que o erro já diz tudo: a sua função ENumero deve estar fazendo a tentativa de conversão do texto passado (via Copy(nPro, i, 1)) e este texto tem um caracter "-". Aparentemente esta sua função ENumero não está tratando as exceções e por isso gerando erro, mas precisaríamos dela para saber o que sugerir. Entretanto, você não precisa fazer uso desta função para tentar converte para numérico um caracter de cada vez. Use algo mais direto e eficiente - simplesmente teste se o caracter em questão é ou não um caracter numérico: '0', '1',... Assim, sugiro que você troque: for i := 1 to Length( nPro ) do begin if ENumero( Copy( nPro, i, 1 ) ) then nCPr := nCPr + Copy( nPro, i, 1 ); end; por: for i := 1 to Length(nPro) do if nPro[i] in ['0'..'9'] then nCPr := nCPr +nPro[i]; e substitua: for i := 1 to Length( pSHD ) do begin if ENumero( Copy( pSHD, i, 1 ) ) then nHDS := nHDS + Copy( pSHD, i, 1 ); end; por: for i := 1 to Length(pSHD) do if pSHD[i] in ['0'..'9'] then nHDS := nHDS +pSHD[i]; Mas, a título de você ter uma função ENumero que funcione, segue uma sugestão para esta função: function ENumero(StrNumber :string) :Boolean; begin try StrToFloat(StrNumber); Result := True; except Result := False; end; end; Abraços
  14. Para não ficar incompleta a questão... Sérgio, a razão para a falta do "auto-completamento" deve-se ao fato de que você está fazendo um cast do componente (TComponent) para a class TControl.Se você verificar no help, notará que a propriedade em questão não está disponível para esta classe. Assim, considerando o fato de que você está procurando por uma classe específica (inclusive, você testa ela), você deveria ter feito o cast do componente para esta classe, ou seja TDBEdit, onde o código ficaria: (Components[idx] as TDBEdit).ReadOnly:= false; A título de maior generalização de uma função, tenta-se utilizar a classe mais abrangente possível (aquela com maior número de sub-classe, com suporte a determinada propriedade ou método) - é o caso do acesso á propriedade Enabled e Visible. O importante é conhecer que propriedades e métodos cada Classe possui para poder estruturar da melhor maneira um procedimento como este. Exatamente, neste seu caso pode não fazer diferença, entretanto, se um dataset tiver campos que possam ser manipulados em um panel e outros campos em outro panel e neste último não possam ser alterados, então teria mesmo que usar a solução de atuação sobre os TDBEdits. Abraços
  15. Sérgio, vou supor que sua necessidade seja a mesma que já tive - desabilitar componentes dentro de um GroupBox. Quando se desabilita um Panel ou GroupBox, os seus componentes ficam impossibilitados de serem acessados, entretanto, visualmente nada muda dando a impressão que estão ativos. Então, desabilitando os componentes dentro destes componentes, conseguimos que eles fiquem grayed (acinzentados) - dando o retorno visual. Outra possibilidade é manipular a propriedade ReadOnly dos componentes. Segue uma versão enxuta de procedure que tenho em minha unit de utilidades. A idéia básica é que procuramos em nosso form todos os componentes que estão dentro de Panel ou GroupBox. No seu caso, teremos que verificar se a classe é TDBEdit: // GroupControl = componente que agrupa componentes - TPanel, TGroupBox, TTabSheet, TTabbedNotebook ... // Enable = ação. Pode ser habilitar (true) ou desabilitar (false) procedure EnableGroupedControls(GroupControl :TControl; Enable :Boolean); var Idx :Integer; Form :TForm; Control :TComponent; begin // Vamos a "caça" do Form onde o componente está Control := GroupControl.Parent; while not (Control is TForm) and (Control.GetParentComponent <> nil) do Control := Control.GetParentComponent; Form := Control as TForm; // Com o Form em "mãos", varremos seus componentes // procurando por componentes com a característica desejada, // ou seja, que esteja no GroupControl for Idx := 0 to Form.ComponentCount -1 do begin Control := Form.Components[Idx].GetParentComponent; if Assigned(Control) and ((Control.Owner = GroupControl) or (Control = GroupControl)) then (Form.Components[Idx] as TControl).Enabled := Enable; // ou se for atualizar a propriedade ReadOnly // (Form.Components[Idx] as TControl).ReadOnly := Enable; end; end; O uso no código: procedure TForm1.BitBtn1Click(Sender: TObject); begin EnableGroupedControls(Panel1, False); // ou // EnableGroupedControls(TabSheet1, False); // e assim por diante end; Se você se atentar para o fato de que todos os componentes adicionados ao form, em design-time, o tem como Owner, você entenderá que basicamente há uma única lista de componentes - aquela acessada pela propriedade Components do Form em questão! Logo, se for utilizar o método FindComponent, este deverá ser o do Form e não o do Panel. A Borland deve ter tido um motivo para fazer as coisas deste modo (eu até teria um palpite, mas isso não é relevante). A questão: "o componente que está dentro do Panel" é apenas uma condição visual, e sendo assim, quem determina onde o componente aparece é a propriedade Parent deste. Eu já usei deste artifício para criar um cadastro simples com 10 TabSheets e apenas 1 DBGrid e 3 Botões (Incluir, Alterar/Gravar, Excluir/Cancelar) - trocando o dataset conforme a guia era selecionada e setando o Parent destes componentes para a guia selecionada. Contudo, nada impede que, criando componentes em run-time, você defina um Owner que não seja o Form (motivo pelo qual apareceu na minha função o teste: Control.Owner = GroupControl). Abraços
  16. Robson, além de não tratar-se de Delphi, acho que seu problema está mais para Lógica de Programação ou mesmo Outras Linguagens de Programação - temos sessões específicas para isso. Isto está meios estranho não?!Aqui foi feito com 2 variáveis! Mas eu daria como dica, o uso de um vetor (array) com a quantidade de itens a serem lidos, sendo que cada item deste vetor seria composto por um registro (record) com os atributos Peso e Altura. Bastaria então, um loop para a leitura dos dados e outro para o tratamento do if, cálculo e display dos dados. Estou movendo para a sessão Lógica de Programação, onde acredito você tenha um suporte melhor sobre a questão. Abraços
  17. Francis Wagner, seus dois tópicos foram mesclados. Tente manter apenas um sobre um mesmo assunto. ;) Quanto aos componentes IBO (Interbase Objects, veja mais...) provavelmente você não vai achar muita coisa aqui no forum, porque não é um componente free e não acompanha o Delphi. O mais comum será encontra algo sobre componetes IBX (Interbase Express), ou seja, o componentes da paleta Interbase. Entretanto algumas coisas são semelhantes e o conhecimento pode ser aproveitado entre um e outro por analogia. ;) Dê uma olhada neste simples tutorial: DELPHI+FIREBIRD+IBO Conectando Delphi ao Firebird através da palheta IBO (ref. ClubeDelphi) Boa sorte.
  18. É parece que não :angry: Eder, baixe este exemplo anexo e coloque em uma pasta qualquer (de preferência no mesmo disco em que a sua base está - mas não ma mesma pasta, porque tem um arquivo com o mesmo nome que o seu) compile ele e execute para ver no que dá. Por aqui funciona perfeitamente. Abraços TstGeraTable.zip
  19. Pirambu!, você está visualizando este texto em que lugar? Em um programa Delphi? No MSAcess? Se for no MSAcess, você verificou se a visualização fica correta, caso você associar este campo a um RichTextBox no form (em um form do acess)?
  20. Este tipo "F" é de Formated Memo e o conteúdo que você mostra, trata-se de conteúdo RTF (Rich Text Format). Acredito que você tenha definido o campo a receber este conteúdo, no MSAccess, como sendo do tipo Memorando. Então, experimente a atribuição de outro modo: TabelaAcessCampo.Assign(tabelaParadoxCampo); Veja como fica. Abraços
  21. Já que você não colocou a solução aqui, acho que deveria lhe perguntar se você estaria vendendo a solução. Se for o caso, informe, pois neste caso seria mais apropriado colocar este tópico na seção Classificados. ;) Abraços
  22. Eder, desculpe-me a demora em postar a resposta. Seguinte, criei uma tabela com a estrutura da sua para os testes e descobri que o problema está com a criação do índice. Por algum motivo (que nem vou tentar decifrar), o componente/drive não estão operando corretamente com um campo tipo float. Para contornar o problema, criaremos a tabela e populamos ela. Após isto, faremos uso de instrução SQL para a criação do índice. Definiremos uma variável local para criar a query dinamicamente: var ... QryTmp :TQuery; 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 TabTmp.Exists then TabTmp.DeleteTable; TabTmp.IndexDefs.Clear; TabTmp.FieldDefs.Clear; TabTmp.FieldDefs.Assign(QueryTodas.FieldDefs); TabTmp.CreateTable; TabTmp.Open; try CopiaResultados(QueryTodas); // criação do componente query dinamicamente QryTmp := TQuery.Create(Self); try QryTmp.DatabaseName := TabTmp.DatabaseName; // instrução SQL para criação do índice QryTmp.SQL.Add('create DESC index idxValor on TmpTab (VALOR_FRETE_TOTAL)'); QryTmp.ExecSQL; finally QryTmp.Free; end; // definimos o índice para a tabela TabTmp.IndexName := 'idxValor'; 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; Bom, em meus testes isto resolveu o problema. Confira como ficará com você. Abraços
  23. Micheus

    Imprimir etiquetas

    Denis Courcy, aparentemente ele já está trabalhando com esta situação, pelo menos é o que ele informou no 1º post: "Eu estou tentando imprimir etiquetas para formulário contínuo, tentei no QReport, mas ..." baseado nisto estavam as sugestões que dei até agora. A impressão de etiquetas em matriciais é mesmo muito chata de configurar, quando se usa geradores de relatórios que trabalham em modo gráfico. O melhor uso destas impressoras, sem dúvida (até em termos de velocidade) está na aplicação de escrita direta (modo caracter), como se fazia em programação DOS (os Writeln para a LPT1) quando você trata apenas de linhas. Se você configura ela para 6lpp (linhas por polegadas), em um formulário contínuo padrão a altura da página é de 11" (11 polegadas), logo você saberá que terá 66 linhas para imprimir. As configurações também são mais fáceis, já que são feitas através de caracteres de controle da própria impressora. Abraços
  24. Micheus

    Pesquisa

    meio estranho esse negócio de 1 pergunta ter duas respostas, sendo que cada uma destas respostas pode ter outras respostas. :unsure: Quantos "níveis" de resposta podem haver? Talvez fosse conveniente você postar um exemplo prático, para ver se alguém pode dar alguma idéia sobre como resolver isto. Abraços
×
×
  • Criar Novo...