Fórum Calendário #373606

14/08/2009

0

Olá,

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

Sgrandini

Responder

Posts

25/08/2009

Sgrandini

Ninguém conseguiu responder o tópico, por isso, vou tentar ser mais clara.
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.


Responder

Gostei + 0

25/08/2009

Djfabioninja

Olá SGrandini! Boa noite!

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


Responder

Gostei + 0

28/08/2009

Sgrandini

djfabioninja, infelizmente, não deu certo. Mas obrigada pela ajuda.


Responder

Gostei + 0

29/09/2009

Sgrandini

Olá,

preciso de ajuda com o TMonthCalendar. Alguém conhece bem esse componente?

Grata.


Responder

Gostei + 0

29/09/2009

Osocram

Sgrandini, me add no msn, vou tentar te ajudar.

Olá, preciso de ajuda com o TMonthCalendar. Alguém conhece bem esse componente? Grata.



Responder

Gostei + 0

29/09/2009

Osocram

Ola..
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


Responder

Gostei + 0

30/09/2009

Adilsond

Pequeno exemplo de como voce poderia contornar o problema.

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.



Responder

Gostei + 0

01/10/2009

Sgrandini

Oi, osocram

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!


Responder

Gostei + 0

01/10/2009

Osocram

Ola sgrandini

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.


Responder

Gostei + 0

01/10/2009

Sgrandini

Eu não havia testado antes, mas o exemplo do AdilsonD também funciona. Só q, no meu caso, usei apenas o exemplo 2.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar