Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. mcsmarmcs, pode ser uma pergunta boba, mas se é uma lista com colunas, por que é que você não utiliza um StringGrid? Isso facilitaria o lance da soma.
  2. deio, você pode utilizar um datamodule onde a tabela mostrada no DBGrid do form principal fique disponível também para o form secundário. Observe que este datamodule deverá está incluso na cláusula uses de ambos os form's, bem como deverá ser criado antes ou no create do form principal, ou seja, ele já deverá existir. Daí, ao iniciar a busca, você faz os filtros sobre esta tabela e ao fechar o form secundário, o resultado mostrado no DBGrid deve estar de acordo com o pesquisado. Abraços
  3. Thiago, como o Churc disse, é complicado ajudar em problemas como esse sem que se possa testar. Mas, seguem algumas observações: 1) acho que seria conveniente você utilizar Free ao invés de Destroy. Por que? Veja o que o help diz sobre Destry: Description Do not call Destroy directly. Call Free instead. Free verifies that the component is not nil, and only then calls Destroy. 2) sugiro que você dê nomes aos componente criados dinameicamente (não podem ser duplicados). Isso é conveniente para que você possa depurar adequadamente sua aplicação e tentar descobrir onde está o problema. Faça isso utilizando algum tipo de contador e utilize format para montar o nome. Ex.: ... Imagem := TImage.Create(Self); Imagem.Name := Format('SB1_Image%d', [Idx]); // Image do scrollbox 1 ... Label_Nome := TLabel.Create(Self); Label_Nome.Name := Format('SB1_lblNome%d', [Idx]); // Label Nome do scrollbox 1 ... Inc(Idx); Abraços
  4. deio, você pode remover o botão maximizar através da propriedade BorderIcons (veja biMaximize). Seria isto? Abraços
  5. Micheus

    Tela De Login

    Correto Churc. Pirambu!, seguindo o que o Churc colocou (a ordem de criação define quem é o form principal) você deveria fazer algo mais ou menos assim: {$R *.res} begin Application.Initialize; FormSplash := TFormSplash.Create(application); FormSplash.Show; FormSplash.Update; Application.CreateForm(TFLOGIN, FLOGIN); FormSplash.Free; if FLOGIN.ShowModal = mrOk then begin Application.CreateForm(TFMENU, FMENU); Application.CreateForm(TDADOS, DADOS); Application.Run; end else Application.Terminate; end.Talvez não esteja 100% correto (fiz aqui no editor mesmo). Observando que na validação do FLogin (talvez um botão de OK), quando o usuário for válido você deve retornar com ModalResult := mrOk; Já se não for válido e você permitir que o usuário continue tentando, você simplesmente não faz nada (apenas move o foco para o edit), mas se não for permitir as tentativas basta chamar Close - com isso modalResult estará retornando com mrNone que não será a condição esperada para a entrada na tela principal. Coloquei o Application.Initialize no início porque você cria o FormSplash passando Application, ok?! Voce poderia até passar Nil nesta situação. Abraços
  6. paulobergo, pelo que você menciona: "Por exemplo, se o campo precocusto estiver definido como tFloatField (para abrir as tabelas do VisualDBase), se tento abrir uma tabela do FoxPro, recebo a mensagem "Type mismatch for field "precocusto", expecting: Float actual BCD" "; parece-me que você adicionou os campos (fields) ao seu dataset. Seria isto? Se for, e eu sou favorável a esta modalidade, mas acho que para esta situação em específico faz-se necessário não acioná-los ao dataset. Isto fará com que ao ser aberto seu dataset, independente de qual banco você esteja acessando, a rotina responsável pela criação dos fields, automaticamente criará a instância correta dos mesmos e você poderá acessá-los no código pelo indexador ou pelo método FieldByName (prefiro este pela clareza no código). Para viabilizar isto, você deveria remover os fields de seu dataset. Já testou desta forma? Você não deu maiores detalhes de como utiliza este dataset, então para o caso de ele estar ligado a um DBGrid e queira ajustar o label dos mesmos, há meios para isso via código ou até mesmo em design-time. Abraços
  7. deio, será que o que você quer pode ser feito utilizando a propriedade Anchor dos componentes? Dê uma olhada neste tópico, o questionamento que fiz lá vale para cá. Abraços
  8. Micheus

    Dúvida

    deio, essa mensagem diz: "identificador não declarado". Isso normalmente ocorre porque: não declaramos ele mesmo ou, então, porque não incluímos na cláusula uses a unit onde ele está definido/declarado.No seu caso, até porque sabemos pela documentação que o nome utilizado está correto, só pode ser a segunda alternativa. Então, numa situação como esta, se você der uma procurada nos arquivos .pas que acompanham o componente, você deverá encontrará esta unit. E foi o que eu fiz (eu tenho o componente instalado há algum tempo mas não havia utilizado este recurso). Então você deve incluir na cláusula uses a unit dbf_common. Abraços
  9. Micheus

    Dúvida

    deio, você baixou a documentação do componente? E se a tem, deu uma olhada?Bom, se não baixou vai o link para download. vejamos a sintax: function SearchKey(Key: Variant; SearchType: TSearchKeyType): Boolean; SearchType is one of the following: - stEqual searches exactly Key. Returns false if no key matches. - stGreaterEqual searches exactly Key or, if not found, the record which key is greater. Returns false if end of file is found. - stGreater searches the first record which key is greater than specified Key. Returns false if end of file is found. assim, parece-me que sua utilização seria mais ou menos assim: if NOT TBDBFCli.SearchKey(Edit1.Text, stEqual) then ShowMessage('Não foi encontrado o nome de Cliente digitado') // ou if TBDBFCli.SearchKey(Edit1.Text, stEqual) then ShowMessage('Encontrado nome de Cliente igual ao digitado') // ou if TBDBFCli.SearchKey(Edit1.Text, stGreaterEqual) then ShowMessage('Encontrado nome de Cliente maior ou igual ao digitado') // ou if TBDBFCli.SearchKey(Edit1.Text, stGreater) then ShowMessage('Encontrado nome de Cliente maior que o digitado') Tem também uma outra função similar, mas com parâmetros de consulta to tipo PChar: function SearchKeyPChar(Key: PChar ; SearchType: TSearchKeyType):Boolean; dica: utilize um título mais esclarecedor, porque com um título desses há duas possibilidades, ou o cara abre para ver o que é ou simplesmente ignora. Então, se você não quer perder a oportunidade de ter uma resposta, deixe-o claro. ;) Abraços
  10. Micheus

    Editor De Texto Mdi

    a segunda aula é sobre Desvio Padrão (http://www.unicamp.br/fea/ortega/Delphi/Aulas/aula08/doc-aula0802.htm)Se você observar o nome da página está padronizado, então vá mexendo com eles que você vê tudo o que tem disponível. Para facilitar, a primeira disponível é a de nº 04: Cálculo do Volume do Cilindro: http://www.unicamp.br/fea/ortega/Delphi/Aulas/aula04/doc-aula0401.htm ... Media Geométrica: http://www.unicamp.br/fea/ortega/Delphi/Aulas/aula07/doc-aula0701.htm Vai mudando os números ;) Abraços
  11. Pirambu!, eu não programo profissionalmente, então fico um pouco à margem desta questão. Mas, lembrando do tempo em que comecei a ouvir falar que o Java era a linguagem que ia dominar e tal (isso lá na época da faculdade 1989-1994), e observando como as coisas tem andado, parece-me que ainda continua tendo espaço para todo tipo de tecnologia. Se você pensar bem, apesar de tudo, ainda existem programas Clipper rodando por ai e gente trabalhando com ele. Até o Cobol foi revitalizado. O Java ou .Net, já tem seu lugar ao sol hoje. Acho que a nova onda, será o PHP por conta do lançamento do Delphi for PHP, pois com IDE semelhante a do Delphi e a prefixação do nome do programa por Delphi, deve chamar a atenção de muitos programadores Delphi (apesar de uma coisa não ter nada a ver com a outra - exceto a aparência). Eu vou embarcar nesta, primeiro porque a pouca programação que fiz para web em PHP foi, basicamente, utilizando um editor de textos melhorado e quero ver se a coisas vão ficar boas mesmo. A segunda é porque gosto de ter pelo menos uma noção de como utilizar estas ferramentas que aparecem de vez em quando. Assim, ao ver um código em Java, .Net, C, ASP, ASM, PHP, JSP, ... eu não me "assusto". :D Acho que se você tem tempo disponível e vontade, deve tentar aprender/entender essas novas tecnologias para não ficar boiando. As aplicações desktop ainda vão dar muito fôlego ao Delphi, mas é visível a tendência do desenvolvimento de aplicativos para web, então é bom escolher pelo menos uma tecnologia com futuro nesta área. E neste caso acho que não dá para escapar do Java ou .Net (é o que acho); O grande lance do Java é a portabilidade para diversas plataformas (SO's). Mas se você desenvolve aplicativos apenas para plataforma Windows, porque não utilizar o .Net? Pelo que eu disse inicialmente, não tenho condições de avaliar corretamente estas questões. Mas para você ver como esse seu tipo de dúvida é "antigo", veja tópico que li em outro forum. Observe que o colega decreta o fim do Delphi na versão 8, e veja quantas versões se seguiram... Abraços
  12. Micheus

    Tela De Login

    Pirambu! , veja se você consegue dar uma partida como esta dica do colega Arlon.É apenas um dos métodos, e você deve observar que o form de login deve ser o primeiro a ser mostrado e que ele cria e chama o form principal. Tem outros formas de utilizar este recurso, mas agora estou meio sem tempo e local adequado para catar meus exemplos procurando por um. Se você não conseguir chegar a algum lugar com a dica acima, dá um retorno. Abraços
  13. Micheus

    Relatório

    Pirambu!, que bom que você está ligado.De novo (ou seria "de velho") eu errei :blink:. PrintPreview tem outra finalidade que não a de mostrar na tela (Preview) ou imprimir diretamente (Print).
  14. Que seja Free? Outro acho que não há - não lembro de ter visto algo a respeito nas buscas por componentes que já realizei. Se for pago, dando uma procurada aparecem alguns. (ex. PostgresDAC)
  15. Progr'amador, tenho certeza que os Delphianos aqui do forum ficarão meio orfãos. É realmente um pena. Mas, como você colocou em seu post: "Vou ter que me despedir da Moderação mas uma vez.", significa que futuramente pode retornar mais uma vez... ;) Estaremos esperando. Boa sorte e tudo de bom. Abraços
  16. Por que é que você tem que criá-lo no evento OnStateChange? Esse não é o lugar mais indicado para executar este procedimento. você não utiliza botões para mostrar o form CPedidos? Se sim, é antes do show que você terá que criá-lo.
  17. Carlos Rocha, não conheço outro meio que não seja escrevendo um componente para isso.
  18. Micheus

    Relatório

    Pirambu!, eu devo estar maluco :blink: O método não é mesmo ShowPreview, é PrintPreview. Me desculpe. :ph34r:
  19. Melhor seria você literalmente desenhar. :DDá para fazer uma prévia do que você quer e postar um link da imagem? Acho que ficaria mais fácil alguém dar sugestões. Mas para adiantar, a parte do logo é só você adicionar uma banda Title e colocar um componente TQRImage (se vier do disco) ou TQRDBImage (se vier do banco). No caso do borda do Detail, não resolve você definir a propriedade Frame.DrawBottom = True ? Abraços
  20. Pelo que entendi você faz a edição dos dados no DBGrid, é isto?Se for, você pode utilizar o evento OnChange dos campos Qtde e ValorUnit (eles devem ter sido adicionados ao seu dataset) para realizar o cálculo. Voce define um único evento para os dois campos, já que a operação será a mesma para a alteração de um ou outro. No código do evento você coloca algo assim: procedure TForm1.datasetQtdeChange(Sender: TField); begin datasetValorTotal.AsFloat := datasetQtde.AsFloat *datasetValorUnit.AsFloat; end; Abraços
  21. Micheus

    Consulta Sql

    Você poderia citar o banco que está utilizando?
  22. jpedro, sobre a propriedade DatabaseName o help diz que ocorrerá uma exceção no caso de você tentar alterar seu conteúdo e a query estiver aberta:Note Attempting to set DatabaseName when a database already associated with this component is open raises an exception. Poderia ser este seu caso? Observe que a propriedade DatabaseName dos componentes tipo dataset (TQuery ou TTable) é equivalente ao AliasName do componente TDataBase. Deste modo, para facilitar seu lado, talvez você possa adicionar os dois databases que você parece utilizar e ao invés de alterar a propriedade DatabaseName das suas TQuery, você liga elas a esses TDatabase e, neles, você altera no código a propriedade AliasName, além claro, de alterar as propriedades LoginPrompt. Voce não citou que banco de dados está utilizando. Se for um banco que exija o login, possivelmente você terá que adicionar à propriedade Params (do TDatabase) o nome de usuário (user name) e senha (password) com seus respectivos valores. Abraços
  23. Edvaldo Rodrigues, você começou seu texto com um "venho tentando..." o que sugere que ainda não conseguiu, certo?! Se é isto mesmo, e pelo código parece ser, observe que você primeiro deve utilizar um INSERT ou APPEND para que tenha um buffer novinho para preencher antes de gravar. Assim, note que você colocou o INSERT como último comando, enquanto deveria ser o primeiro. Bom, mas com isso você apenas criou um novo registro (em memória), mas ainda não estará gravado no banco. Para isso, você terá que após inicializados "todos" os campos da tabela, ou seja no final, executar a gravação dos mesmos utilizando o método POST (no seu caso dmClientes.tclientes.Post) - se não hover qualquer erro, você terá efetivamente gravado suas informações. Com certeza! Ao que parece você optou pelo modo mais "complicado" para começar a aprender a acessar banco de dados com Delphi. Existe na paleta Data Controls vários componentes que são facilmente ligados aos dataset's (queries e tables - você não citou o que está utilizando), utilizando um componente TDataSource (paleta Data Access). Funciona mais ou menos assim: no seu form você coloca os labes e componentes TDBEdit (similares aos TEdit's que você utilizou); então, para ligar estes componentes (chamadas dataware) ao seu dataset você deve adicionar um componente TDataSource no form ou no datamodule (recomendo este último) e em sua propriedade DataSet, selecionar o dataset desejado (no seu exemplo seria tclientes); agora, voltando ao componente dataware, em nosso caso os TDBEdit's, na propriedade DataSource você seleciona o respectivo componente ao qual ligamos tclientes e na propriedade DataField você seleciona o nome do campo que deve ser editado. Com isto, o que você precisará é executar comandos como Insert ou Edit ao entrar no form de edição e ao sair ter um meio de executar o Post - normalmente um botão Gravar ou algo parecido. Se você utilizar um TDBNavigator, daí então é que não vai ter que fazer nada disso - mas não é o usual, então vale aprender do modo um pouco mais "complicado", mas nem tanto quanto o que você colocou. Dê uma espiada neste meu post (apesar de ser com Paradox), talvez possa lhe servir. Tem também um outro exemplo com um método diferente do anterior que você pode acessar o link neste post Baixe os exemplos e dê uma olhada na "cara" deles. Convém você dar uma lida em algum livro ou apostila sobre o assunto. Outra coisa, já que você está começando, acho conveniente que se habitue a utilizar os termos como são. Quando você colocou "onde dmClientes é meu data modulo;", o termo é Datamodule; Também é possível minimizar digitação em casos como o que você repetiu o "dmClientes." para cada campo manipulado. Em casos com este, você faz uso do With <class ou record> Do (algo como "Com <class ou record> Faça"): with dmClientes do begin ... tclientesTIPO_CLI.Value := CBOTIPOCLI.TEXT; tclientesNOME_RAZAO.Value := TXTNOMERAZAO.TEXT; ... end; Abraços
  24. Micheus

    Relatório

    Pirambu!, desculpe, expliquei meio na corrida. É o seguinte, você tem que declarar este procedimento na definição da classe de seu form, na sessão Public. type FormRelatorio = class(TForm) ... public procedure ShowPreview(CodFuncionario :LongInt); ... end;e o nome ShowPreview é só uma sugestão, pode ser qualquer coisa - não tem nada a ver com o ShowPreview do QuickReport. Também é apenas uma idéia, não quer dizer que a forma como você fez inicialmente não devesse funcionar ok?! É que eu acho que desta forma as coisas ficam mais explícitas e com menos chance de erros. Abraços
  25. Micheus

    Relatório

    Eu não entendir direito este comentário, você poderia dá mais detalhes ? No form do relatório teria algo deste forma: procedure FormRelatorio.ShowPreview(CodFuncionario :LongInt); begin QryConsulta.Close; QryConsulta.ParamByName('CodFuncionario').AsInteger := CodFuncionario; QryConsulta.Open; try QuickRep1.PrintPreview; finally QryConsulta.Close; end; end; e não teria o lance do caFree no OnClose; no seu botão que aciona o relatorio: FormRelatorio := TFormRelatorio.Create(Self); try FormRelatorio.ShowPreview(TBFuncionarioCodFuncionalrio.Value)); finally FormRelatorio.Free; end;
×
×
  • Criar Novo...