Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. a dúvida é como salvar estas informações no arquivo ini?Se for isso, dê uma olhada neste post, porque o procedimento é o mesmo. Com relação ao seu código inicial ou a sugestão do Jhonas, para que não seja solicitado o destino, basta que você não use o SaveDialog e tudo o que se refere a ele nos códigos (Execute e FileName). Onde o componente de backup usa o nome de arquivo na propriedade FiliName, você passaria a usar o seu TEdit e todos os parâmetros do componente devem ser inicializados diretamente no components. Supondo que você queira ler as informações do arquivo .ini para inicializar os parâmetros do backup, seria mais apropriado que você o fizesse no OnShow. Dentro desta proposta, e usando o seu código, a idéia seria mais ou menos esta: procedure TForm1.Show(Sender: TObject); var FileName :string; begin <criação/abertura do arquivo ini> backupFile1.maxSize := 0; backupfile1.backuptitle := <ler do arquivo>; backupfile1.backupmode := <ler do arquivo>; backupfile1.compressionLevel := <ler do arquivo>; backupfile1.SaveFileID := <ler do arquivo>; FileName := <ler do arquivo>; <fechar arquivo ini> if backupfile1.backup(filelistbox.items, FileName) then Showmessage('Backup sucessful. Compression rate = '+inttostr(BackupFile1.CompressionRate)+' %') else Showmessage('Backup failed or aborted'); // ... outras coisas que já faça end; Em algun ponto de seu código, deverá haver uma opção para mostrar o form de configuração destes parâmetros no arquivo ini, e isto você faria no evento do botão que grava a informação. Teria mais ou menos esta seqüência: procedure TForm1.BtnGravaConfiguracao(Sender :TObject); begin <criação/abertura do arquivo ini> // gravar valores no ini <classe regini>.WriteString('BACKUP TITLE', EdBackupTitle.Text); <classe regini>.WriteString('FILE NAME', Edit1.Text); <classe regini>.WriteInteger('MODE', rgBackupmode.itemindex); <classe regini>.WriteInteger('COMPRESSION', rgCompressionLevel.itemindex); ... <fechar arquivo ini> end; onde aparece o "<>" são indicações do que deve ser usado - não tente compilar que dará erro. Veja aquele post e associe ao que está comentado. Abraços
  2. Jhonas, parece-me que o problema do robinhocne não é mais com a pintura do DBGrid, mas sim com a lógica - observe as ????? no código dele. robinhocne, veja nos destaques que fiz, que é só seguir o que você mesmo citou. Vou colocar só eles aqui: fields [2] se for menor que a data corrente me mostre em marrom mas não se a data de pagamento estivesse preenchida (Field [4]) traduzindo.. pintar de marrom se fields [2] <= data atual e fields [4] for nulo. Logo... if (dbglan.Fields[2].AsDateTime <= Date) and (dbglan.Fields[4].IsNull then Begin dbglan.Canvas.Font.Color:= clMaroon; End; Fiquei curioso de onde você tirou o tal Current_Date. Ele existe no banco, mas no Delphi, você deveria usar a função Date. Abraços
  3. Jhonas, apenas um comentário com relação a esta parte da sugestão... A julgar pelo fato de inicialmente o colega António44 ter feito um type-cast direto do valor em ItemIndex, pressupõe-se que na lista de opções da tela dele, deva aparecer a opção "Sem compressão" como 2º item desta lista e, assim sendo, a sua sugestão não está de acordo com isto, pois você a tratou como sendo a última (ItemIndex = 3), o que deve ser corrigido para não gerar "problemas". Ponderação sobre o tipo Enumeração: O tipo enumeração TCompressionLevel é declarado deste modo na unit backup.pas: TCompressionLevel = (clFastest, clNone, clDefault, clMax); em outros compactadores como ZLib.pas o mesmo tipo é declarado: TCompressionLevel = (clNone, clFastest, clDefault, clMax); todo o tipo enumeração, como o nome sugere, corresponde a uma lista implícita de números inteiros, onde o primeiro elemento equivale a 0 (zero), o segundo 1 e assim por diante. Do help "Enumerated types": "(...) Each value listed in parentheses in an enumerated type declaration has an underlying integer value determined by the position of the value in the list. (...)" Assim sendo, caso as opções na tela correspondam a seqüência existente na declaração do tipo TCompressionLevel em questão, o uso da opção feita pelo colega António44, otimizaria o código: backupfile1.compressionLevel := TCompressionLevel(rgCompressionLevel.itemindex); Já no caso de não corresponderem, a opção pelo CASE é, sem dúvida, a mais apropriada. Abraços
  4. vms, quando tratar de intervalos de datas em uma constula SQL, dê preferência a utilizar between. no lugar de: where Data_Inicio >= :Data1 and Data_Inicio <= :Data2 use: where Data_Inicio between :Data1 and :Data2 Abraços
  5. Dr. House, como seu post é específico sobre banco de dados, estou movendo este tópico para a sessão Banco de Dados->Demais Bancos. Mas, como mexo com o Firebird, vou lhe deixar uma sugestao. ;) Já pensou em migrar para a versão 2.0? Faça uso da função COALESCE - se não estou enganado, ela já estava disponível na versão 1.5 do Firebird. A Sintax é: coalesce(<campo/experessão>, <valor caso nulo>) No caso das sub-selects que retornam nulo, você poderia usá-la na sua consulta assim: Abraços
  6. Tatiane.InterArt, neste seu post inicial, vemos que na estrutura de sua tabela o campo Data é VARCHAR. Agora, neste último post, aparentemente você mudou o tipo do campo: Já está ficando meio confuso tudo isto. Vamos dar uma repassada... o uso do CAST como sugeri, não se aplicaria a esta situação. Seria apenas no caso de o campo Data ser um varchar e você passar os parâmetros como sendo datetime (AsDateTime). Tem que tentar não misturar as alternativas porque senão, nunca vai se chegar a lugar algum: 1) Se o campo Data é do tipo DATE/TIMESTAMP, então a codificação tem que ser: e não importa o formato "visual" da data, porque numericamente (TDate/TDatetime são double) corresponderá ao número que representa a data em questão; 2) Se o campo Data é do tipo VARCHAR, então, para passar o parâmetro você deveria utilizar o método AsString. Contudo, neste caso em que este campo varchar representa uma data e você quer retornar um período, não dá para tratá-lo como string, porque o resultado ficará muito errado. Assim, faz-se o uso do CAST para tratar seu campo Data como um tipo Date e passa-se os parâmetros com este formato: Ainda levando em conta que a data no formato texto esteja armazenada com M/D/YYYY, porque do contrário, uma data como 15/1/2008 resultará em erro (não existe um mês 15). Veja um exemplo do que quero dizer. Em uma tabela tenho o campo ORDER_DATE_STR VARCHAR(10), com os dados armazenados no formato M/D/YYYY. Fazendo a consulta com o CAST e AsDateTime o resultado é: ORDER_DATE ORDER_DATE_STR 01/08/1993 8/1/1993 09/08/1993 8/9/1993 09/08/1993 8/9/1993 16/08/1993 8/16/1993 Que é o resultado esperado. já se não usar o CAST e usar o AsString o resultado é: ORDER_DATE ORDER_DATE_STR 15/10/1992 10/15/1992 15/10/1992 10/15/1992 10/10/1993 10/10/1993 27/10/1993 10/27/1993 27/10/1993 10/27/1993 : : 04/01/1994 1/4/1994 06/01/1994 1/6/1994 17/01/1994 1/17/1994Muitissimo errado!!! Então, dê uma olhada com carinho em como está o campo em seu banco de dados e tente utilizar a opção mais apropriada, porque os códigos postados foram se misturando e não atendem corretamente a situação. Abraços
  7. Sérgio, não há opção nativa para isto, mas é possível implementar. Eu implementei em uma árvore com apenas um nível (uso como menu em conjunto com TNoteBooks). A idéia é manipular alguns eventos e fazer uso da propriedade Data (um pointer), que normalmente não é utilizada. Caso você a use, deve adaptar o tipo de dados que você armazena nela para conter mais esta informação. Vou deixar a função para habilitar/desabilitar toda a arvore, o que é bem simples, para você ter uma idéia: atribuindo False à Data para desabilitar e True para habilitar: procedure TForm1.EnableAllNodes(ShowNodes :Boolean); var Idx :Integer; begin for Idx := 1 to TreeView1.Items.Count -1 do TreeView1.Items.Item[Idx].Data := Pointer(ShowNodes); TreeView1.Refresh; end; entretanto, no caso de utilizar em sub-niveis, talvez seja necessário criar uma função recursiva para isto ou, talvez, você simplesmente não permita que o nó pai seja expandido - depende da sua aplicação. No evento CustomDrawItem tratamos a questão visual: procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Boolean(Node.Data) then // habilitado begin if cdsSelected in State then TreeView1.Canvas.Font.Color := clWhite else TreeView1.Canvas.Font.Color := clBlack; end else // desabilitado TreeView1.Canvas.Font.Color := clGray; end; No evento OnChanging, determinamos se o nó pode ou não ser selecionado, baseado no valor que armazenamos na propriedade Data: procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean); begin AllowChange := Boolean(Node.Data); end; Se você manipular a propriedade Selected do TreeView no evento OnShow, talvez seja necessário desabilitar o evento OnChanging (foi o meu caso), porque, eventualmente, você terá este nó desabilitado. Então, se for necessário para você, o código deve ter esta sequência: procedure TForm1.FormShow(Sender: TObject); begin TreeView1.OnChanging := nil; TreeView1.Selected := TreeView1.Items[0]; // seleciona o 1º nó TreeView1.OnChanging := TreeView1Changing; ... end; No meu caso, ao incluir um novo registro, o método EnableAllNodes é chamado com False e após a gravação dos dados principais, é chamado com True, habilitando todas as opções. Voce pode mudar o estado de um nó diretamente simplesmente alterando a sua propriedade Data: TreeView1.Items.Item[2].Data := Pointer(False); TreeView1.Refresh; A idéia é mais ou menos esta. Agora é questão de trabalhar nela. Abraços
  8. Greed, dê uma lida neste post novamente - o segundo parágrafo, trata desta sua colocação.
  9. Já desmembrei mais este tópico do rivelino <_< e lembrando que pelas regras do forum não é permitido qualquer tipo de post com o objetivo de um UP no tópico. Se ele não for respondido, paciência. ;) Abraços
  10. Nossa, andou tumultuado este tópico, heim?! <_< Eu desmembrei os posts com dúvidas diferentes em novos tópicos e para os "donos" dos post não se perderem vou por os links aqui: wilene (lene) -> Ajuda com dois algoritmos em portugol rivelino -> Ajuda em dois algoritmos portugol rivelino e antonio -> Ajuda na conversão do algoritmo para o protugol lene -> Ajuda para resolver algoritmo em portugol Por uma questão de ordem e até mesmo facilidade em obter ajuda, solicito aos colegas visitantes e membros que criem novos tópicos para adicionar suas dúvidas - não é pelo título sugerir sua dúvida, que os questionamentos distintos possam ser amontoados. Contamos com a colaboração de todos.;) _____________________ nego drama, com relação ao tal n:= x que você citou não enteder, baseado no comentário existente, foi apenas um modo que o colega usou para mostrar onde deveria ser informado o número do qual se obteria o fatorial. Pela sugestão dele, seria o caso de solicitar uma entrada pelo teclado. Algo como: var h, n, FatParc: real cont, cont1 : inteiro inicio escreva('Informe o número a obter o seu fatorial: ') leia(n) h := 0 para cont de 1 ate n faca FatParc := 1 para cont1 de 1 ate cont faca FatParc := FatParc * contl fimpara h := h + 1 / FatParc fimpara fimalgoritmo O objetivo é suprir o que foi solicitado baseada na fórmula: H = 1 + 1/2! + 1/3! + 1/4! + .... + 1/N! - observe que este 1, equivale a 1/1! Assim, pode ser implementado um laço onde é contado de 1 até N - o que viabiliza o somatório que resultará no valor de H; Para cada interação deve ser calculado o fatorial do contador, o qual o colega chamou de fatorial parcial (FatParc). O cálculo do fatorial é obtido através de mais um laço com as multiplicações consecutivas; Ao termino deste laço o valor do fatorial obtido (FatParc), será utilizado na divisão 1/N! e deverá ser acumulado - é o somatório que resulta no H; Espero ter lhe ajudado. Abraços
  11. diguxo, a atualização deverá ser feita utilizando a instrução UPDATE e a função SubString, associados a cláusula WHERE da forma como você pretende selecionar os registros a alterar: UPDATE tabela SET teste = SubString(teste FROM 1 FOR 10) WHERE teste like '___________%' Neste exemplo, o campo teste passará a ter uma cópia de apenas 10 caracteres, a partir de seu valor original que, segundo a cláusula WHERE possuía tamanho maior que 10. Abraços
  12. O caminho é mais ou menos por aqui: var i: Integer; begin for i := 0 to (ListBox1.Items.Count - 1) do begin if ListBox1.Selected[i] then begin ListBox2.Items.Add(ListBox1.Items[i]); end; end; end;
  13. Micheus

    Comando SQL

    Pirambu!, é uma dúvida específica do banco, então estou transferindo para a sessão Banco de Dados - Access - pode ter mais sorte lá. Abraços
  14. esta cor é a padrão do Windows para seleção.Se você quer mudá-la vai ter que utiliar o evento OnDrawDataCell do DBGrid, mas provavelmente você precisará mudar a cor do texto também que por padrão será branca nesta situação e poderá ficar pouco visível. Segue um exemplo: procedure TForm1.DBGrid1DrawDataCell(...); begin if gdSelected in State then begin DBGrid1.Canvas.Brush.Color:= clInfoBK; DBGrid1.Canvas.Font.Color:= clIntoText; end; DBGrid1.DefaultDrawDataCell(Rect,Column.Field,state); end; Ref. post há outros posts sobre a este recurso. Se você colocar na opção de Pesquisar: dbgrid and cor, vai encontrar outros posts Abraços
  15. Tatiane.InterArt, por conta disto acho melhor nivelarmos a situação atual: - que banco de dados você está utilizando? INTERBASE :blush: - o campo Data é mesmo VARCHAR no banco ou você está usando o tipo DATE/TIMESTAMP? - voce está gravando esta data de que modo: apenas a data ou data e hora? Isto não faz sentido, porque supondo que seu campo no banco seja DATE, ao passar o parâmetro como datetime/date você não teria qualquer problema com relação a formatação (não tem como - é um número referente a data). Entretanto, se seu campo for VARCHAR no banco, seus parâmetros sendo string e você atribuir um valor a eles via médoto AsDateTime, neste caso haverá uma conversão do tipo de dados da data do tipo numérico para o tipo string e, aí sim, será realizada uma formatação do string. Abraços
  16. Micheus

    Imprimir etiquetas

    o que seria o esperado, visto que ele imprime em modo gráfico, assim como o QuickReport. está aí algo que deve ficar no ar até que alguém que possua uma matricial em suas mãos, "fuce", "fuce" até encontrar a resposta - acho que deve demorar. :huh: O negócio seria partir para a abordagem incial, onde seria usado a impressão direta.
  17. João Paulo Taraciuk, o negócio é "esquecer" o componente e pensar no que ele representa (ou apresenta) - dados de um dataset (tabela ou consulta SQL). Com isto em mente, basta que você filtre o dataset, cujos os dados são apresentados no DBGrid2, baseado no campo que o relaciona com o dataset no DBGrid1. você não citou maiores detalhes das suas tabelas, mas vamos tomar como exemplo as tabelas envolvidas na figura 1, logo abaixo. Baseado na 3 forma normal, a tabela Pedido mantém um código de relacionamento (CodCliente) aos dados do cliente localizados na tabela Cliente e, de modo similar, a tabela Parcelas mantém um código de relacionamento (CodPedido) aos dados de um pedido localizados na tabela Pedido: Figura 1: Relacionamento entre as tabelas. Isto implica em que para da item relacionado na tabela Pedido, haverá um respectivo item na tabela Clientes, bem como itens na tabela Parcelas. Mantendo o foco da questão, ao selecionarmos um item na tabela Pedido, através do campo de relacionamento, temos condições de encontrar todas as referências feitas a ele na tabela de Parcelas. A figura 2 ilustra os resultados para cada pedido avalidado: Figura 2: Itens na tabela Parcelas para cada pedido na tabela Pedido. Existem alguns modos de filtrarmos os datasets baseados em algum campo, dependendo do dataset (componente) utilizado: - propriedades: Filter e Filtered; - métodos SetRangeStart/SetRangeEnd ou SetRange, ApplayRange e CancelRange; - cláusula WHERE de uma consulta SQL. Irei exemplificar utilizando uma consulta SQL. Então, baseado no exemplo da figura 1, a consulta na tabela Parcelas ficaria assim: SELECT NumParcela, VlrParcela, DatVencimento, DatPagamento FROM Parcelas WHERE CodPedido = :CodPedido ORDER BY NumParcela Tendo colocado esta instrução SQL em um componente tipo query (chamarei QryParcelas), precisamos fazer com que ela seja executada com o parâmetro correto (CodPedido) a cada linha do dataset dos pedidos que estiver sendo selecionada (utilizarei um componente query e nome QryPedidos). Para isto devemos inicializar o valor parâmetro com o valor do campo CodPedido do dataset QryPedidos. Obs: cabe salientar que a qualquer momento que lemos o conteúdo de um campo de um determinado dataset, estamos lendo seu valor no registro corrente (a linha atualmente selecionada - independente de estarmos utilizando um DBGrid). Há duas formas de inicializarmos o parâmetro no momento em que um registro no dataset QryPedidos for selecionado e ambos fazem uso do componente TDataSource (chamarei DSPedidos) o qual deverá referenciar este dataset:selecionando na propriedade DataSource do dataset QryParcelas, o datasource DSPedidos. Para o correto funcionamento é necessário que o nome do parâmetro corresponda ao nome do campo no dataset de onde iremos obter seu valor; (o método mais simples)utilizando o evento OnDataChange do datasource DSPedidos, que sinalizará a mudança de registro, e implementando o código que inicializará o parâmetro e atualizará a consulta QryParcelas. No nosso exemplo ficaria mais ou menos assim: procedure TForm1.DSPedidosDataChange(Sender: TObject; Field: TField); begin QryParcelas.Close; QryParcelas.ParamByName('CodPedido').AsInteger := QryPedidos.FieldByName('CodPedido').AsInteger; QryParcelas.Open; end; . Espero ter ajudado na compreensão da "mecânica da coisa", porque isto ajudaria a resolver muitos problemas similáres, principalmente em relatórios onde sua aplicação seria mais comum. Abraços
  18. Pr0f3t4, estão um pouco vagas as informações. - sua aplicação faz uso de algum banco de dados? Qual? Que componentes você utilizou? - você utilizou algum componente que requeriu a instalação de alguma DLL?
  19. toretto_PHP, com relação a forma de verificar o número da linha selecionada (na verdade o registro selecionado) o Jhonas já deu uma sugestão - RecNo e pode ser usado em qualquer ponto do programa, não apenas no evento citado. Mas observando que você parece querer utilizar isto para implementação da opção de Exclusão, então eu acrescentaria que (dependendo do componente utilizado) para excluir a linha correntemente selecionada, bastaria que você chamasse o método Delete do dataset ligado a este DBGrid. Abraços
  20. Sérgio H. Martins, agora que não há o parâmetro na instrução SQL, este erro relacionado à DtVcto não poderia ocorrer. Acredito que você deva ter mantido a definição deste parâmetro na propriedade Parameters - você deve removê-la.
  21. ai, ai, ai... ^_^ Tatiane.InterArt, apenas a título de comentário, caso você não precise armazenar a hora junto à data, seria mais conveniente utilizar o tipo DATE já que este é um campo de 32bits (ocupa 4 Bytes de espaço), enquanto que o TIMESTAMP é um campo de 64bits (ocupa 8 Bytes). No caso do uso de dialect 1, o tipo DATE equivale ao TIMESTAMP o que não faria qualquer diferença. Abraços
  22. Sim, mas antes de tentá-la, faça mais uma alteração que eu me esqueci de mencionar. Tendo definido o tipo do parâmetro como DateTime (conforme sugerido), altere a linha de atribuição do parâmetro de:Parameters.ParamByName('pDataAtual').Value:= FormatDateTime('dd/mm/yyyy', DtaVcto); para: Parameters.ParamByName('pDataAtual').Value:= DtaVcto; Se ainda não funcionar (eu acredito que vá), você pode utilizar esta outra opção - apesar de não ser algo que eu goste: concatenar a data ao string SQL. O MSAccess tem a particularidade de utilizar o # como delimitador de datas, então, troque as linhas: SQL.Add('and DTAVCTO < :pDataAtual'); Parameters.ParamByName('pDataAtual').Value:= FormatDateTime('dd/mm/yyyy', DtaVcto); por: SQL.Add('and DTAVCTO < #'+FormatDateTime('dd/mm/yyyy', DtaVcto)+'#'); Nesta opção, faça uns testes e verifique se não será necessário mudar a formatação de dd/mm/yyyy para yyyy/mm/dd para ter resultados corretos. Abraços
  23. Bom, agora você explicou melhor a situação, seu problema está mais associado ao insert... Inclusive, percebi que me concentrei no problema errado. :blush: Voce definiu seu campo Data como sendo varchar e não Date - e está utilizando uma instrução (between) que, ao meu entender, não vai funcionar corretamente mesmo. Há algum motivo especial pelo qual você não possa definir o campo como Date nas suas tabelas? Se houver, talvez seja o caso de você, então, fazer a conversão deste campo para um date de modo a usar a SQL corretamente. Algo como: Select * from PagtoContaPG where cast(Data as date) Between :d1 and :d2 e passando os parâmetros como exemplifiquei antes. Mas, a melhor opção seria realmente trabalhar com campos DATE no banco. Abraços
  24. Micheus

    QReport

    Caro visitante, não há uma versão free do QuickReport. Apenas há a opção de você baixar atualizações da versão Standard do quick (esta não lhe pedirá serial) que acompanha oficialmente o Delphi7. A última versão, neste caso, é a 3.5.1 - QuSoft E, antes que alguém sugira um meio de baixar a versão solicitada (o que seria pirataria...), estou preventivamente fechando este tópico. Abraços
  25. Tatiane.InterArt, não me canso em sugerir que não seja utilizada a concatenação em strings SQL, mas sim que se faça uso de parâmetros, justamente porque esta questão de datas é muito problemática. Siga a sugestão deste post - tem uma breve explicação lá. Abraços
×
×
  • Criar Novo...