Ir para conteúdo
Fórum Script Brasil

Leo_cj

Membros
  • Total de itens

    14
  • Registro em

  • Última visita

Sobre Leo_cj

  • Data de Nascimento 07/07/1993

Perfil

  • Gender
    Male
  • Location
    Bauru

Leo_cj's Achievements

0

Reputação

  1. Eu particularmente gosto de passar os valores por parâmetros, ex: if (ADOQuery1.Active) then ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT * FROM Tabela WHERE Campo = :ArteMarcial'); ADOQuery1.Parameters.ParamByName('ArteMarcial').Value := QuotedStr(ComboBox1.Text); ADOQuery1.Open; Acho que o código fica com maior legibilidade.
  2. Leo_cj

    Combobox

    Conforme o nosso amigo Jhonas disse, eu também acho que seria inviável a utilização desse código no evento OnClick() (Apenas um clique), pois para poder selecionar os itens que estarão no ComboBox será necessário clicar nele antes, e isso vai disparar o evento OnClick que vai 'Limpar' o texto do combobox, fazendo com que você não consiga escolher nenhum item se não o vazio. Por isso acredito que ou você utiliza o evento OnDbClick() (Click duplo) ou então utiliza um botão auxiliar para limpar, ou ainda deixa que caso o usuário queira limpar, ele selecione a opção em branco (pra isso você precisa inserir um item em branco). Agora vamos a explicação dos códigos: procedure TForm1.ComboBox1Click(Sender: TObject); begin ComboBox1.Items.Strings[ComboBox1.ItemIndex] := ''; end; Nesse primeiro código, temos a implementação do evento disparado por um clique único. Nesse evento, temos dois códigos assim por dizer, o ComboBox1.Items.Strings[ ], pelo qual podemos manipular o texto do item cujo index for passado entre os colchetes e o outro código é o ComboBox1.ItemIndex, que nos retorna justamente qual o Index do item selecionado no combobox. Então podemos dizer que a junção desse código nos permite manipular o texto do item que está atualmente selecionado no combobox, e nesse caso em específico, está sendo passado um novo valor (Vazio) para esse item. procedure TForm1.ComboBox1DblClick(Sender: TObject); begin ComboBox1.ItemIndex := 0; end; Nesse segundo código, temos a implementação do evento disparado por um clique duplo. Como vimos no código anterior, o ItemIndex nos retorna o Index do item selecionado, mas nesse caso estamos fazendo um pouco diferente, essa propriedade tem duas vias, a de leitura e a de gravação, no primeiro código, estamos utilizando a via de leitura, que nos retorna o Index do item selecionado, nesse código aqui, estamos utilizando a via de gravação, e ela nos permite informar o Index do item que queremos que esteja selecionado, nesse caso, o Index 0 (Primeiro item do combobox) é o item em branco, então estamos dizendo que quando o usuário der um clique duplo no combobox, o item selecionado deve ser o primeiro item.
  3. Explica melhor o que você que fazer, você precisa criar um instalador de uma aplicação feita em Delphi ou você quer utilizar o Delphi para instalar algo?
  4. Sim, o filtro por data deve estar presente, afinal, mas porquê fechar e abrir a tabela após cada inclusão e exclusão? aqui nos meus testes pelo menos, após o ApplyUpdates, as alterações foram transmitidas para o banco de dados normalmente, a única coisa que eu precisei fazer foi um ClientDataSet.Refresh após a inserção, pois utilizo autoincremento diretamente no banco, então sem o refresh ele não mostrava o ID. Fiz os testes utilizando o SQL Server e os componentes TADOConnection, TADOQuery, TDataSetProvider, TClientDataSet, TDataSource e um TDBGrid, para fins de testes, não alterei nenhuma configuração dos componentes, utilizei a padrão, apenas informei o sql no TADOQuery e adicionei os campos no TADOQuery, TClientDataSet e no TDBGrid. Nesse ClientDataSet que está ligado ao Provider, você não está utilizando o CreateDataSet não né?
  5. Se a tabela estiver devidamente indexada e se utilizar os filtros possíveis para trazer apenas os registros realmente necessários, acredito que não terá problema de lentidão
  6. Quanto a guilhotina não vou saber te ajudar, mas quanto a mandar a impressão direto pra uma impressora, você pode utilizar a classe Printer, ex: Função para buscar o Index da impressora pelo nome: function GetLabelPrinterIndex(PrinterName: String): Integer; var Cont: Integer; begin for Cont := 0 to Printer.Printers.Count - 1 do if AnsiContainsText(Printer.Printers[Cont], PrinterName) then Exit(Cont); Result := -1; end; Exemplo de uso: Printer.PrinterIndex := GetLabelPrinterIndex('HP LaserJet 1320'); Nesse caso, estou setando a impressora para a HP LaserJet 1320, independente se ela é a impressora padrão ou não
  7. Estranho, fiz o teste aqui e funcionou, esse problema ocorre apenas para a exclusão ou para a inserção também? uma coisa que eu reparei é que independente do que o usuário marcar na mensagem de confirmação de exclusão, será executado o ApplyUpdates, acredito que não seja isso, mas experimenta colocar o Delete e o ApplyUpdates entre begin e end. O meu ficou assim: if (Application.MessageBox(PChar('Deseja excluir o item selecionado?'), 'Teste', MB_YESNO + MB_ICONQUESTION) = mrYes) then begin ClientDataSet1.Delete; ClientDataSet1.ApplyUpdates(0); end; E logo após a confirmação, faço um select no banco e o registro foi apagado.
  8. Outra opção é passar o index diretamente para a propriedade Parameters for wi := 0 to ParamCount - 1 do Parameters[wi].value:=WPchave[wi]; Os dois jeitos fazem a mesma coisa, pois a propriedade Items é default, então ao passar o Index sem definir nenhuma propriedade, automaticamente será utilizado o items
  9. Olha, provavelmente até existem outras opções sim, mas só consegui pensar nessa. Para trabalhar com inclusões e exclusões, quando é utilizado esse conjunto de componentes, ao invés de utilizar o ibquery para fazer o insert/append/delete, você vai utilizar o ClientDataSet. Acredito também que poderia continuar usando o IBUpdateSQL vinculado ao IBQuery sem problemas, mas será necessário fazer o teste. Lembrando que após incluir/excluir algum registro com o ClientDataSet, é necessário utilizar a função ApplyUpdates do mesmo para que as alterações sejam realmente feitas no banco de dados.
  10. Por nada, que bom que resolveu. Boa sorte aí com o projeto.
  11. O que eu disse do IsEmpty é porque o mesmo é uma função que retorna se o ClientDataSet está vazio ou não, mas onde você está utilizando, você não pega o retorno dessa função, então ela está apenas gerando processamento, por menos que seja. Quanto ao CreateDataSet, quando eu utilizo o ClientDataSet como tabela virtual, eu costumo deixar o CreateDataSet no evento OnCreate/OnShow do formulário e caso eu precise limpar esse meu conjunto de dados para fazer uma nova inserção, eu utilizo o comando EmptyDataSet. Para não ficar consultando a tabela cada vez que o usuário clicar em um horário diferente, o que você pode fazer é carregar todos os agendamentos da data selecionada em um ClientDataSet e conforme o usuário for clicando nos horários, você filtra o CDS para exibir apenas os agendamentos desse horário, e o grid 2 estaria ligado a esse CDS.
  12. Por nada, para verificar os atributos de um arquivo pelo Delphi, você pode usar esse exemplo: procedure TForm1.Button5Click(Sender: TObject); var Attributes: Cardinal; begin ListBox1.Clear; Attributes := GetFileAttributes(FileName); if (Attributes and faArchive > 0) then ListBox1.Items.Add('Archived file'); if (Attributes and faReadOnly > 0) then ListBox1.Items.Add('ReadOnly file'); if (Attributes and faSysFile > 0) then ListBox1.Items.Add('System file'); if (Attributes and faHidden > 0) then ListBox1.Items.Add('Hiden file'); if (Attributes and faSymLink > 0) then ListBox1.Items.Add('Symbolic Link file'); if (Attributes and faNormal > 0) then ListBox1.Items.Add('Normal File'); end; Para alterar os atributos de um arquivo você pode utilizar a função SetFileAttributes Ex: if (SetFileAttributes(FileName, faArchive or faSysFile)) then // Aqui deixamos o arquivo com os atributos de arquivado e arquivo do sistema begin ListBox1.Items.Add('Atributos alterados'); end; if (SetFileAttributes(FileName, faNormal)) then // Aqui removemos todos os atributos. begin ListBox1.Items.Add('Atributos alterados'); end; Quanto à permissão, tenta rodar o programa como administrador. E quanto ao aviso de arquivo existente, qual a flag que você setou em fFlags? experimente utilizar a FOF_RENAMEONCOLLISION, a mesma renomeia o novo arquivo automaticamente caso já exista um arquivo de mesmo nome na pasta
  13. Acredito que o problema esteja ocorrendo pois na verdade você está sobrescrevendo a propriedade pFrom e não adicionando novos valores, o que você pode fazer é criar uma função que recebe por parâmetro a origem e o destino e a função copia os arquivos. ex: function TForm1.CopiarArquivos(Origem, Destino: String): Boolean; var Dados: _SHFILEOPSTRUCT; begin with Dados do begin Wnd := Application.Handle; wFunc := FO_COPY; pFrom := PChar(Origem); pTo := PChar(Destino); fFlags := FOF_RENAMEONCOLLISION; end; SHFileOperation(Dados); Result := Dados.fAnyOperationsAborted; end; Exemplo de uso: procedure TForm1.Button4Click(Sender: TObject); begin CopiarArquivos('C:\Mensagens\*.pdf', 'C:\Mensagens\teste'); CopiarArquivos('C:\Mensagens\*.sql', 'C:\Mensagens\teste'); CopiarArquivos('C:\Mensagens\*.doc', 'C:\Mensagens\teste'); end; -- Outra opção é usar o comando CopyFile, ex: CopyFile(PChar(Application.ExeName), PChar(FileName), False); Os parâmetros são: 1º - Caminho do arquivo já existente 2º - Caminho do novo arquivo 3º - Mensagem de falha caso já exista o novo arquivo
  14. O único trecho que me deixou um pouco em dúvida foi: cdsHorarios.IsEmpty; // <- porque um IsEmpty sem verificação? cdsHorarios.CreateDataSet; // <- Não sei quantas vezes você chama esse método, mas o CreateDataSet pode ser utilizado apenas uma vez, depois disso para limpar o conjunto de dados basta utilizar cdsHorarios.EmptyDataSet; Outra coisa, a query qrCont recebe o mesmo SQL 16 vezes, você pode já deixar o sql carregado nela antes do for (ou até mesmo em tempo de projeto) e no for ir alterando apenas os valores dos parâmetros, ex: HoraIni := StrToTime('07:15'); // For para ir das 08:00 as 11:45 e 13:30 as 20:15 qrCont.SQL.Close; qrCont.SQL.Clear; qrCont.SQL.Add('SELECT DATA, HORA FROM AGENDA'); qrCont.SQL.Add('WHERE HORA = :H AND DATA = :D'); for X := 1 to 16 do begin HoraIni := IncMinute(HoraIni, 45); //Contando os registros pra colorir o grid horarios with qrCont do begin Close; ParamByName('H').AsTime := HoraIni; ParamByName('D').AsDate := Calendario.Date; Open; FetchAll; end; cdsHorarios.Append; Do mais eu não enxerguei nada que possa estar comprometendo a performance.
×
×
  • Criar Novo...