Fórum Calendário #373606
14/08/2009
0
como faço para que ao clicar numa determinada data do TMonthCalendar o formulário que o contém se feche, mas não se feche quando eu percorrer os meses? Segue abaixo o procedimento colocado no evento OnClick do TMonthCalendar:
procedure TFrmCalendario.MthCalendarioClick(Sender: TObject);
begin
FrmIncluir.DbEdtDatNas.Text := (formatdatetime(´dd/mm/yyyy´, MthCalendario.Date));
FrmCalendario.Close;
end;
Grata.
Sgrandini
Curtir tópico
+ 0Posts
25/08/2009
Sgrandini
Coloquei um MonthCalendar num formulário e gostaria que esse formulário se fechasse após o usuário selecionar o dia. Consegui fazer isso colocando no evento OnClick do MonthCalendar o código: FrmCalendario.Close. Porém, o formulário também se fecha quando o usuário clica apenas uma vez nas setas p/ esquerda ou p/ direita dos meses, obviamente por causa da linha de código acima. Além disso, logo após a seleção do dia, a data já é exibida num DBEdit. Por isso pergunto: alguém saberia dizer como faço para que o usuário possa percorrer os meses do calendário, selecionando o de sua preferência e somente após o click no dia o formulário se feche? E também só seja exibida a data no DBEdit depois que o formulário se fechar, ou seja, após o click no dia?
Grata.
Gostei + 0
25/08/2009
Djfabioninja
De fato, colocando esta ação no evento click do MonthCalendar, voce sempre terá esse problema. Uma forma fácil de resolver, seria colocar a ação no evento OnDblClick, ou seja, no click duplo. Dessa forma, o usuário pode navegar tranquilamente pelo componente e a ação só será realizada ao click duplo!. Acredito que seus clientes não irão reclamar muito por um clickzinho a mais. =)
Espero ter ajudado.
Qualquer coisa, msn: djfabioninja@hotmail.com
Gostei + 0
28/08/2009
Sgrandini
Gostei + 0
29/09/2009
Sgrandini
preciso de ajuda com o TMonthCalendar. Alguém conhece bem esse componente?
Grata.
Gostei + 0
29/09/2009
Osocram
Gostei + 0
29/09/2009
Osocram
Estive pensando em como resolver esse problema.
Tive varias ideias
1) fazer um componente Herdado do TMonthCalendar e criar os Eventos OnSelecionouDia e OnSelecionouMes
2) verificar a posição do mouse no onClick e ver se ele esta na parte dos dias ou meses la no componente. (essa ideia é maluca, so server p aprender a mexer com eventos que não usamos normalmente).
3) Ao abrir o MonthCalendar vc pega a data atual dele, e grava em uma variavel DataInicial, dae no OnClick vc verifica se a dataAtual mudou, se mudou então vc fecha o calendario e pega a data. Mas dae aqui vc tem que validar que qdo ele muda de mes a data muda. Então talvez compense vc separar a data em Dia, Mes, Ano, dae em vez de validar se a data inteira mudou verifica apenas se o Dia mudou.
4) Se não me engano no RxLib e Jedi tem componentes que ja fazem isso.
Tive outras ideias.. mas eram mais absurdas, acho que a terceira opção é a melhor
Gostei + 0
30/09/2009
Adilsond
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
SpeedButton1: TSpeedButton;
procedure Button1Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with TForm2.Create(Self) do
try
ShowModal;
finally
Free;
end;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls;
type
TForm2 = class(TForm)
MonthCalendar1: TMonthCalendar;
procedure MonthCalendar1Click(Sender: TObject);
procedure MonthCalendar1GetMonthInfo(Sender: TObject; Month: Cardinal;
var MonthBoldInfo: Cardinal);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
vMesClicado: Boolean;
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.FormShow(Sender: TObject);
begin
vMesClicado := False;
end;
procedure TForm2.MonthCalendar1Click(Sender: TObject);
begin
if vMesClicado then
vMesClicado := False
else
begin
Form1.Edit1.Text := formatdatetime(´dd/mm/yyyy´, MonthCalendar1.Date);
ModalResult := mrOK;
end;
end;
procedure TForm2.MonthCalendar1GetMonthInfo(Sender: TObject;
Month: Cardinal; var MonthBoldInfo: Cardinal);
begin
vMesClicado := True;
end;
end.
Gostei + 0
01/10/2009
Sgrandini
depois de muita luta com o MonthCalendar, consegui o resultado esperado. Não foi da maneira como eu queria, pq tive que acrescentar um botão no form para fechá-lo após a escolha da data. Mas o código que montei faz a ´captura´ correta da data e lança num dbedt como eu queria. E foi +/- da forma como vc descreveu na 3a alternativa, só que no evento OnClose do form que contém o calendário. Fiz isso antes de ver seu post. Se o tivesse visto antes, teria me poupado os neurônios! Quem deu essa ideia foi o djfabioninja, que me ajudou bastaste. Descobri que o MonthCalendar só recebe o foco no momento do clique do mouse sobre o dia. Então, se vc clicar sobre o mês ou ano, por exemplo, alterando-os, até aí nada acontece. A data só muda mesmo qdo se clica sobre o dia. E outra coisa, se se quiser alterar uma data modificando apenas o ano e o dia, o foco sobre o MonthCalendar não recai ao primeiro clique no dia que se quer selecionar, e sim no segundo clique. Isso estava me dando um trabalhão, pq o código que eu havia montado anteriormente no evento OnClick do form, fazia com q o mesmo se fechasse logo no primeiro clique. E a variável que deveria receber o dia ficava fazia. Mas no fim, deu tudo certo. Tentei instalar o JEDI, mas deu erro com alguns componentes. Não sei se por causa da minha versão do Delphi (2005), ou se eu não soube instalar mesmo.
Segue abaixo o código:
procedure TFrmCalendario.FormClose(Sender: TObject; var Action: TCloseAction);
var
Dia, DiaAtual, Mes, MesAtual, Ano, AnoAtual: String;
begin
Dia := FormatDateTime(´dd´, MthCalendario.Date);
Mes := FormatDateTime(´mm´, MthCalendario.Date);
Ano := FormatDateTime(´yyyy´, MthCalendario.Date);
DiaAtual := FormatDateTime(´dd´, Dados.TbClientesnascimento.Value);
MesAtual := FormatDateTime(´mm´, Dados.TbClientesnascimento.Value);
AnoAtual := FormatDateTime(´yyyy´, Dados.TbClientesnascimento.Value);
if (Dia <> DiaAtual) or (Mes <> MesAtual) or (Ano <> AnoAtual) then
begin
Dados.TbClientes.Edit;
Dados.TbClientesnascimento.Value := strtodate(FormatDateTime(´dd/mm/yyyy´, MthCalendario.Date));
Action := caFree;
end;
end;
Obrigada pela ajuda de todos!
Gostei + 0
01/10/2009
Osocram
Que bom que deu certo.
E que pena que não conseguiu instalar o JEDI, pois ele tem um componente que faz exatamente o que vc quer.
Depois se quiser me add no msn q eu te passo um exemplo com este componente p vc dar uma olhada.
E parabens por postar aqui a sua solução, mtas pessoas depois de conseguir resolver esquece de compartilhar a solução.
Boa sorte com seu projeto.
Gostei + 0
01/10/2009
Sgrandini
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)