
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
(Resolvido)Selecionar Linhas no DBGrid
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
valdmir, este erro significa que não há no dataset tableinsumo o campo cod_insumo adicionado - veja em fields editor se o campo está lá (e não deverá estar). Veja se você usou o mesmo nome de campo. você tem que usar em cada dataset os campos que estão nas respectivas tabelas e usa no relacionamento os campos correlatos, mesmo que tenham nomes diferentes. a questão do tipo, está correta. Mas, se você usou em insumos cod-insumo com o "-" e não com "_", então o erro está correto, porque você não teria o campo que ele está indicando. Abraços -
(Resolvido)Selecionar Linhas no DBGrid
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
valdmir, não entendi. Seria melhor postar o código e citar o problema. Uma coisa básica, é que você não pode ter campos chaves duplicados na tabela. Este é o motivo da mensagem "Key violation" (violação da chave). Supondo que você tenha adicionado um item do insumo ao pedido e depois tente adicioná-lo novamente, isto com certeza deverá gerar este erro. É aí que vai entrar aquele comentário que fiz, sobre verificar se um item já existe no pedido antes de incluí-lo, usando FindKey, Locate ... (você encontra alguma coisa aqui no forum, pesquisando por estas palavras) Abraços -
Basicamente: Firebird 2.0.4 (show de bola) Acesso: - MDO (freeware, específico para FireBird) - IB (paleta Interbase) - observando a instalação da biblioteca de compatibilidade GDS32.DLL) - ZeosLib (apenas para teste - acho mais burocrático, já que preciso de um componente a mais para operações que não sejam consultas). Mas recomendado, se pensar em portabilidade da aplicação, já que suporta a maioria dos bancos free. MySQL: para algumas aplicações (vide post Churc) Acesso: praticamente uma unanimidade - ZeosLib Paradox: para testes e exemplos simples. Recomendo para quem está iniciando. Acesso: BDE ou dbExpress Dar preferência aos acessos nativos - nada de ODBC (é um intermediário). Qualquer que seja o banco, não recomendo querer estar no top das versões - normalmente ainda não estão estáveis o suficiente.
-
(Resolvido)Selecionar Linhas no DBGrid
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
foi mal. :blush: valdmir, eu entendi sim. Mas acho que você e que não me entendeu. A linha selecionada no seu DBGrid2 é a linha correntemente selecionada no dataset que ele está mostrando. A coluna 0 do seu DBGrid2, está mostrando a informação de uma coluna neste seu dataset. Eu sugiro que você entenda deste modo. Não pense no DBGrid como uma planilha do excel, porque ele não é, e desenvolver seu raciocínio deste modo vai lhe prejudicar. Observe que seu DBGrid2 está mostrando apenas alguns registros da sua tabela insumos (são os referentes ao servico selecionado no outro DBGrid). Digamos que você tenha umas 5 linhas (5 linhas da tabela insumos) sendo mostrada no DBGrid2 e que hajam 3 colunas (codigo, descricao e preço). Então, você deve entender da seguinte forma: - A linha 1 representa a primeira linha na tabela insumo, para aquele servico selecionado no DBGrid1. A coluna 1 (columns[0]) apresenta o valor do campo (field) Codigo desta linha; a coluna 2, representa o valor do campo descricao e a coluna 3, o valor do campo preço. - A linha 2 representa a segunda linha na tabela insumo, para aquele servico selecionado no DBGrid1. A coluna 1 (columns[0]) apresenta o valor do campo (field) Codigo desta linha; a coluna 2, representa o valor do campo descricao e a coluna 3, o valor do campo preço. - e assim sucessivamente... não tem não. Quando você lê a propriedade columns[0] (ou outra coluna qualquer), você poderá buscar qualquer referencia ao campo da linha atualmente selecionada. Neste caso você usaria DBGrid2.columns[0].Field.Value Isto exposto, no caso de você precisar copiar todas as linhas sendo visualizadas no DBGrid2 (e não são todas existentes na tabela - lembre-se que você filtrou o campo servico), você deverá fazer um laço nestes moldes: tableinsumo.First; while not tableinsumo.EOF do begin tablepedido.append; tablepedidocodigo.value := tableinsumocodigo.value; // ou // tablepedido.FieldByName('codigo').value := tableinsumo.FieldByName('codigo').value; // ou // tablepedido.Fields[0].value := tableinsumo.Fields[0].value; tablepedidodescricao.value := tableinsumodescricao.value; tablepedidopreco.value := tableinsumopreco.value; ... tablepedido.post; tableinsumo.Next; end; ... se for para copiar a linha selecionada, já comentei no post anterior. E se for para pegar uma linha específica, tipo a 3ª linha, sem que seja a linha selecionada (tipo de procedimento pouco comum), então você deverá fazer o loop como se fosse para copiar todos os itens, porém, você usa um contador e executa o procedimento de cópia dentro do laço (o append, atribuições e posts) apenas quando o contador atingir o número da linha desejada. Será que agora ficou mais claro? -
Bom, já que você se manifestou sobre o manifest, esta tipo de efeito colateral pode ser facilmente contornado. Adicione ao evento OnCreate do seu form, o código abaixo (com os nomes dos componentes devidamente ajustados): procedure TForm1.FormCreate(Sender :TObject); begin Label1.ControlStyle := Label1.ControlStyle + [csOpaque]; Panel1.ControlStyle := Panel1.ControlStyle - [csParentBackground] + [csOpaque]; end; estes atributos da propriedade ControlStyle, que estamos reajustando, são modificados na criação do componente quando disponível o uso de temas (if ThemeServices.ThemesEnabled then ...) Abraços
-
(Resolvido)Selecionar Linhas no DBGrid
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
valdmir, como você está iniciando e está trabalhando com tables, não há porque falarmos em instruções SQL. Voce pode fazer este processo de forma mais direta: cada insumo selecionado, você "envia" para a tabela de itens dos pedidos. Isso deve ser algo simples de você fazer. Supondo que você tenha um botão para enviar tal item para a tabela de pedidos, o processo seria mais ou menos assim: procedure TForm1.BtnSelecionaItem(Sender :TObject); begin tableItens_pedidos.Append; // você "abre" um registro em branco // na sequencia você inicializa os campos com as informações provenientes // da tabela de insumos. // Tenha em mente que é do item selecionado que estas informações // estarão vindo. É simples assim. tableItens_pedidosCodigoInsumo.value = tableInsumoCodigoInsumo.Value; // ... move e inicializa outros campos aqui tableItens_pedidos.Post; // você grava o item "enviado" end; Isto é bem simplista, mas seria o básico no seu caso. Voce provavelmente deveria verificar se tal item a ser "enviado" já não estaria no pedido e isto pode ser feito de vários modos: Findkey se há índice para o campo referente ao insumo na tabela de pedidos ou Locate. Eu sugeriria que você começasse com algo como acima e observando como isto funcionará, você vai verificando o que precisa melhorar no código. Vá construindo seu conhecimento em etapas e você vai entender como cada uma delas influencia no todo. Abraços -
Não tem não. Por padrão, para desenhar ele serão utilizadas como cor de fundo clBtnFace (propriedade Color, muda isso) e para as linhas de contorno clBtnShadow e clBtnHighLight (quando ativa a propriedade Ctl3D). se é mesmo necessário, caso você não encontre algum componente que lhe permita isto, você poderia simulá-lo utilizando 1 Panel, 1 Label e 2 Shape.Supondo que isto lhe ajudasse, seguem as dicas: - Coloque o Panel no form; ajuste o tamanho e remova o texto na propriedade Caption; defina a propriedade BevelOuter=bvNone e Color com a cor desejada (vamos supor $00E0E0E0); - Com o panel selecionado, adicione 1 Shape; ajuste o tamanho da seguinte forma: Top=6; Left=1; Height=<Height do Panel - 6>; Width=<Width do Panel -1>; defina a propriedade Brush->Style=bsClear e Pen->Color com a cor mais clara (vamos supor $00C9C9C9); - Selecione o Shape anterior e utilize o famoso copiar/colar; Ajuste a posição dele para Top=5 e Left=0; defina a propriedade Pen->Color com a cor mais escura (vamos supor $00737373); - Adicione o Label; Ajuste sua posição com Left=8 e Top=0; Defina em Caption o texto do seu "GroupBox". Com isto você tem um GroupBox simulado e customizado. Ele é 100 compatível com o original operando na versão Windows Classic - se você utilizar temas (como no caso do WindowsXP e Vista) ele vai ficar meio fora da casinha... Abraços
-
(Resolvido)Selecionar Linhas no DBGrid
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
valdmir, até esta parte você fez tudo certinho, mas ... ... como eu imaginava, aqui está o "erro". Entre as duas tabelas, quem é a tabela master (mestre) no relacionamento? Não é a servico?! Esta propriedade MasterSource (fonte mestre), funciona da mesma forma. Ela indicará quem é a tabela master, que será utilizada para filtrar o campo que você indica em MasterFields. Logo, você deve usar esta propriedade na tabela filha (detalhe), quando você estará indicando a tabela pai (mestre) - ou seja, no seu dataset tableinsumo. No mais, você está no caminho certo. A título de sugestão, abrevie o table no nome dos seus datasets. Você verá em vários post o pessoal prefixando o nome de datasets usando algo como tab ou tb (para Tables), qry (Query), cds (ClientDataSet), spr (StoredProcedure), .... Isto vai lhe poupar escrita. ;) Abraços -
(Resolvido)Selecionar Linhas no DBGrid
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
valdmirv, parece-me que você pode não estar com os vínculos configurados adequadamente. Explique melhor, citando os datasets em questão, de que tipo são (table ou query), como você faz o filtro dos insumos ligados aos serviços (via: Datasource, Filter ou parametrização); Quanto mais detalhes neste sentido, mais fácil de compreender a causa de seu problema e de exemplificar. Abraços -
(Resolvido) Imagem piscando por causa do timer
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
Ok. Dei uma verificada no exemplo, fazendo aquela última alteração que lhe havia sugerido e realmente observei o problema citado. Não vou me alongar explicando o motivo, mas está relacionado a forma como aquela "janela de fundo" (ClientHandle) avalia a área a ser pintada, ajustando o posicionamento/alinhamento dos componentes nela colocados (nosso panel) ou sobre ela colocados (PnTop - panel do menu). Assim, não poderemos usar a propriedade Align=alClient para o Panel1. Para contornarmos este novo problema, observe o seguinte: - PnTop (panel do menu) -> Align=alTop - StbBarra (barra de status) -> Align=alBottom - Panel1 (panel onde colocaremos as imagens - no miolo da tela) -> Align=alNone; não se preocupe com a largura e altura dele, bem como com o posicionamento; No Panel1, coloque os componentes: - ImgLetreiro (imagem lateral esquerda) Align=alLeft; Stretch=True; AutoSize=True; Center=False; Proportional=False; - ImgPrinc (imagem que ocupa a área central) Align=alClient; Stretch=True; AutoSize=False; Center=True; Proportional=False; No evento OnCreate do FrmPrincipal, coloque o seguinte código: procedure TFrmPrincipal.FormCreate(Sender :TObject); begin // Fazemos o Panel1 ficar "grudado" na área client do form MDI Windows.SetParent(Panel1.Handle, ClientHandle); // garantimos o posicionamento inicial do Panel1 Panel1.Top := 0; Panel1.Left := 0; // forçamos a atualização das dimensões do Panel1 FormResize(Sender); end; No evento OnResize do FrmPrincipal, coloque o seguinte código: procedure TFrmPrincipal.FormResize(Sender: TObject); begin // Recalculamos as dimensões do Panel, baseado no novo tamanho da janela Panel1.Height := ClientRect.Bottom -PnTopo.Height -StbBarra.Height -4; Panel1.Width := ClientRect.Right -4; end; Com estas alterações, acho que você consegue fechar este tópico. Abraços -
(Resolvido) Imagem piscando por causa do timer
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
bom, estes problemas deveriam estar relacionados com as propriedades da figura (align, stretch, center, autosize e proportional) e acredito que você tenha que verificar isto. A princípio, seu form principal deveria estar com um panel align=alTop (o dos botões) e outro align=alClient (o das figuras). Neste último estaria sua figura da esquerda (com align=alLeft) e a da imagem central com align=alClient e stretch=true. (se não me engano) abraços -
(Resolvido) Imagem piscando por causa do timer
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
Agora você pode fazer uso daquele post que passei como referência e deverá funcionar. No evento OnCreate do seu form, use o comando abaixo, passando o Panel em questão como parâmetro: Windows.SetParent(Panel1.Handle, ClientHandle); Abraços -
Segue parte de um código de atualização que usa o recurso citado pelo colega Churc. Eu retirei detalhes que eu usava especificamente no meu projeto, mas deve estar funcional e pode servir de referência a você: // botão para verificação de atualizações procedure TFrmUpdate.btnVerificaClick(Sender: TObject); function FindHostFileInfo(var IdFTPListItem :TIdFTPListItem; FileName :string): Boolean; var Idx :Integer; begin IdFTPListItem := nil; for Idx := 0 to IdFTP1.DirectoryListing.Count -1 do if AnsiUpperCase(IdFTP1.DirectoryListing.Items[Idx].FileName) = AnsiUpperCase(FileName) then begin IdFTPListItem := IdFTP1.DirectoryListing.Items[Idx]; Break; end; Result := Assigned(IdFTPListItem); end; var DtExeLocal, DtExeHost :String; IdFTPListItem :TIdFTPListItem; begin // conecta ao site IdFTP1.Connect; // se necessário, posiona no diretório aonde está o programa // IdFTP1.ChangeDir('bangalo.org.br/download'); // obtém a lista de aquivos/diretórios no diretório atual IdFTP1.List(Nil); // se encontramos o programa no diretório, então prosseguimos com as verificações if FindHostFileInfo(IdFTPListItem, 'programa.exe') then begin DtExeHost := FormatDateTime('yyyy/mm/dd hh:mm', IdFTPListItem.ModifiedDate); DtExeLocal := FormatDateTime('yyyy/mm/dd hh:mm', FileDateToDateTime(FileAge('programa.exe'))); // se a data do executável no host é mais recente... if DtExeHost > DtExeLocal then begin lbStatus.Caption := 'Há uma atualização disponível'; // pode ser questionado o usuário se deseja, ou não, atualizar // ... // inicializa barra de progresso com tamanho do arquivo ProgressBar1.Max := IdFTPListItem.Size; lbStatus.Caption := 'Iniciando download da atualização'; // busca arquivo, sobrescrevendo o mesmo - talvez seja conveniente um esquema de backup IdFTP1.Get(ProgName, 'programa.exe', True); // muda a data para a data do arquivo buscado no site - porque o arquivo baixado recebe a data atual FileSetDate('programa.exe', DateTimeToFileDate(IdFTPListItem.ModifiedDate)); end else // assinala processo como sem atualização a realizar lbStatus.Caption := 'Seu programa está atualizado'; end else lbStatus.Caption := 'Não há uma versão do programa para download'; // disconecta do site IdFTP1.Disconnect; end; // atualização da barra de progresso procedure TFrmUpdate.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin // Atualiza barra de progresso ProgressBar1.Position := AWorkCount; ProgressBar1.Repaint; Application.ProcessMessages; end; Abraços
-
Eder, eu acho que você não vai encontrar outro modo não, mas pode ser que alguém tenha alguma sugestão. Talvez seja uma questão de você mexer na estrutura da sua aplicação. Não a conhecemos, mas algumas coisas eventualmente podem ser feitas: - não deixe os forms no auto-create. Crie eles a medida que precisa; - use datamodules para modularizar a os componentes de acesso aos dados, usando eles de acordo com as informações necessárias no momento. Evite usar um datamodule único, entupido de datasets e datasources; - mantenha abertos apenas os datasets necessários; são alguns itens que podem ajudar a evitar que haja muita tarefa na hora de criar ou destruir sua aplicação. Abraços
-
(Resolvido) alguém pode me dar uma força nessa logica?
pergunta respondeu ao Greed de Micheus em Delphi, Kylix
Greed, por que utilizar esta data de baixa neste formato - string? fica mais fácil lidar com datas quando este campo é DATE no banco. você pode pesquisar por períodos com mais facilidades, bem como fazer operações - do tipo subtração, como você precisa. Pense a respeito. Usar datas neste formato, ainda tem outra implicação quando se faz uma listagem ordenada: 20081 200811 200812 20082 20083 ... percebeu que o mês 11 e 12 seriam listados antes de 2, 3, ... ? Abraços -
Erick, observe que teria sido mais apropriado que você tivesse criado um novo tópico para este seu problema, já que o título deste pouca referência faz ao seu assunto e pode dificultar a obter respostas. ;) Bom, o seu código não está exatamente como você postou. Estaria?! Voce teria colocado todo o código no procedimento QRCRAddReports? Eu espero que não. pela forma como você está referenciando seus relatórios, vou assumir que você criou eles via opção File->New->Other... New->Report (não é meu modo preferido, mas vamos adiante...) Voce deve observar que os seus relatórios devem existir antes de adicioná-los ao QRComposite, bem como devem ser destruídos antes que os utilize novamente. Vamos ver se arrumamos as coisas... Vou assumir que este seu TFrmEmissao é o form onde você tem um botão para emissão do relatório, assim, no evento OnClick deste botão escreveremos o código que irá alocar dinamicamente os relatórios, preparar a impressão e liberar os forms da memória: procedure Tfrmemissao.ButtonImprime(Sender: TObject); begin try // cria os 2 relatorios para união QRguia := tQRguia.Create(Self); QRrecibo := tQRrecibo.Create(Self); //sql relatorio1 // a ordem deve ser garantir o dataset fechado // para depois passar o parâmetro e abrí-lo QRguia.DSmovi.Close; QRguia.DSmovi.SetVariable( ':QGUIA', DBguia.text ); QRguia.DSmovi.Open; //sql relatorio2 QRrecibo.DSmovi.Close; QRrecibo.DSmovi.SetVariable( ':QGUIA', DBguia.text ); QRrecibo.DSmovi.Open; //preview QRcomposite QRCR.Prepare; QRCR.Preview; finally // liberamos o componente TQuickReport da memória // e inicializamos a respectiva variável com Nil FreeAndNil(QRrecibo); FreeAndNil(QRguia); end; end; // evento OnAddReports do QRComposite procedure Tfrmemissao.QRCRAddReports(Sender: TObject); begin QRCR.Reports.Add( QRguia ); QRCR.Reports.Add( QRrecibo ); end; Experimente deste modo e veja se resolve seu problema. Abraços
-
(Resolvido) Imagem piscando por causa do timer
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
Bom, agora sabemos qual o "detalhe" que impedia a repetição do problema no exemplo que eu tinha: você não mencionou que este form era um fsMDIForm. O problema passa por uma observação que já foi feita em outro post - a existência de uma janela na área de fundo do form MDI principal. Entretanto, no caso do componente TImage, não daria para aplicar o lance do SetParent porque este componente não tem um handle de janela (como usado no post citado). A solução chega a ser boba, mas resolve: - remova este seus TImage; - adicione um TPanel, ajuste align com alClient, BevelInner e BevelOut com bvNone - coloque seus TImage neste panel, normalmente. Só isto!! Seguem algumas recomendações com relação a fração do projeto enviado: 1) Evite imagens com tamanhos exagerados. A "Plano d Fundo 01.jpg" tem dimensões 3236x2427 e 300ppp (1MB). Note que isto é resolução para impressão. Em geral, monitores não chegam a esta resolução, bem como não excedem 96ppp. Redimensionar a imagem para um tamanho mais razoável (350KB), poupará memória e processamento ao redesenhar a mesma; 2) num procedimento deste tipo, tente usar a lógica: procedure TFrmPrincipal.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin If Application.MessageBox('Têm certeza que deseja finalizar o sistema?','Aviso !',MB_ICONQuestion +MB_YESNO) = MrYes Then CanClose := True Else CanClose := False; end; o resultado da expressão no if .. then, já não resultará em True ou False? Então, simplesmente atribua ele à variável: procedure TFrmPrincipal.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := Application.MessageBox('Têm certeza que deseja finalizar o sistema?', 'Aviso !',MB_ICONQuestion +MB_YESNO) = MrYes; end; 3) no evento OnActivate, não há porque você utilizar o OpenPictureDialog como intermediário - use o campo diretamente: ... try // ** ISSO... // OpenPictureDialog.FileName := DmDados.Senhas.FieldByName('Tela').AsString; // ImgPrinc.Picture.LoadFromFile(OpenPictureDialog.FileName); // ** FICA APENAS ASSIM... ImgPrinc.Picture.LoadFromFile(DmDados.Senhas.FieldByName('Tela').AsString); except ... end; Abraços -
(Resolvido) Imagem piscando por causa do timer
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
Acesse sua caixa mensagens no forum. t+ -
(Resolvido) Imagem piscando por causa do timer
pergunta respondeu ao Vivendo&Aprendendo de Micheus em Delphi, Kylix
Vivendo&Aprendendo, foi claro como já havia sido antes. Mas, eu também vou tentar ser mais claro na minha respota: também tenho um exemplo com um form que tem um TImage (align = alClient), um TPanel (align = alTop) e um TLabel dentro deste panel, sendo movido via propriedade Left (da direita para a esquerda) através do evento OnTimer de um TTimer com temporiação de 100ms e nada de DoubleBuffered setado. (mesmo fazendo o label rolar na vertical e adicionando botões, não houve qualquer mudança) E... Nada de piscar! Como vê, a menos que você consiga fazer uma pequena aplicação que gere o efeito que você descreve e compartilhe com quem se habilitar a ajudar, você não vai ter resposta a este tópico. Muito provavelmente, há algum suposto "detalhe" que está gerando este probleminha e, nestas condições, só você conseguirá achá-lo. Abraços e boa sorte. -
Já postei uma dica para você neste tópico no forum ActiveDelphi. Se alguém, puder dar mais detalhes ao colega, o caminho será pelo conteúdo do link lá mencionado. Abraços
-
quanto a gravar hora e data: WriteLn(arquivo, FormatDateTime('hh:nn - dd/mm/yyyy', Now)); // gravando hora e data já quanto a gravar o estado, ou seja se a porta do cofre foi aberta ou fechada, esta informação não deveria ser gravada quando este estado mudasse? Seja quando você dá o comando ou quando dê esta informação? Voce poderia enviar o comando de abertura e simplesmente a porta não abrir. Não seria conveniente registrar o comando, e depois registrar a leitura da situação da porta? Você recebe de algum modo a informação de que a porta abriu ou fechou? Você citou um função SetBit usada para setar um determinado bit na porta paralela. No momento em que você enviar estar informação para a porta, seria o momento de gravar a mensagem de que foi solicitado o fechamento ou abertura. O evento OnCreate, não parece ser o local mais apropriado para isto. Já se você receber algum evento, ou fizer alguma leitura da porta paralela, este seria o momento de registrar a situação em que a porta se encontra. Abraços
-
Ramon, supostamente, a outra única opção é buscar esta informação através de uma rede/internet. Para saber mais: NTP (Network Time Protocol; ref. Wikipédia-pt). Dê uma olhada nestes componetes: SNTP Time Server and Client Components (descompactar e instalar - não tem exemplo, mas não deve ser problema utilizá-los) Abraços
-
(Resolvido) CheckListBox + focus em seus itens
pergunta respondeu ao Luis Ricardo de Micheus em Delphi, Kylix
Corrigindo tudo isto: procedure TForm1.BtnUpClick(Sender: TObject); var Index :Integer; begin if CheckListBox1.ItemIndex > 0 then begin Index := CheckListBox1.ItemIndex -1; CheckListBox1.Items.Move(CheckListBox1.ItemIndex, Index); CheckListBox1.ItemIndex := Index; end; CheckListBox1.SetFocus; end; procedure TForm1.BtnDownClick(Sender: TObject); var Index :Integer; begin if CheckListBox1.ItemIndex in [0..CheckListBox1.Items.Count -2] then begin Index := CheckListBox1.ItemIndex +1; CheckListBox1.Items.Move(CheckListBox1.ItemIndex, Index); CheckListBox1.ItemIndex := Index; end; CheckListBox1.SetFocus; end; Se precisar de explicação, avise. Abraços -
habilite na propriedade FilterOptionsa opção foCaseInsensitive. Abraços
-
sempre que o campo definido no banco de dados for entendido pelo componente de acesso como sendo do tipo TDateTime, será instanciado ao dataset um field TDateTimeField. O que ocorre é que não havendo a indicação da formatação de apresentação, será usado o padrão que é mostrar a data e hora. Caso o campo no seu banco de dados contenha apenas a hora, provavelmente a data que você visualiza no DBGrid é '30/12/1899'. Para formatar qualquer informação destetipo, você deve utilizar a propriedade DisplayFormat do campo (field). Se você adicionou os fields ao dataset em design-time, selecione o campo desejado, localize a referida propriedade na janela object Inspector e defina o formato para hh:nn ou hh:nn:ss - só isto! Qualquer dúvida quanto a formatação de data e hora, dê uma olhada no help procurando a função FormatDateTime. Abraços