Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TMonthCalendar OnClick nur wenn man ein Datum ausgewählt hat. (https://www.delphipraxis.net/174956-tmonthcalendar-onclick-nur-wenn-man-ein-datum-ausgewaehlt-hat.html)

Piro 21. Mai 2013 15:07

TMonthCalendar OnClick nur wenn man ein Datum ausgewählt hat.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin zusammen,

ich erzeuge ein TMonthCalendar, wenn der Benutzer auf eins der 4 Kalender Icon drückt, um ein Datum auswählen zu lassen und es dann in ein TMaskEdit Feld zu schreiben. Damit möchte ich Falscheingaben vermeiden sowie einen Kalender zur Verfügung stellen. DateTimePicker kommt nicht in Frage, da es auch kein Datum geben kann und mir nicht gefällt.

Delphi-Quellcode:
procedure Tfrm_request.SetMonthCalendarDateToField(Sender: TObject);
var
 sender_name : string;
begin
 sender_name := (Sender as TComponent).Name;
 if sender_name = 'mc_customer_request_start' then
 begin
   medt_customer_requested_start.Text := FormatDateTime('dd.mm.yyyy', TMonthCalendar(Sender).Date);
   Sender.Free;
 end;
 if sender_name = 'mc_customer_request_end' then
 begin
   medt_customer_requested_end.Text := FormatDateTime('dd.mm.yyyy', TMonthCalendar(Sender).Date);
   Sender.Free;
 end;
 if sender_name = 'mc_project_start' then
 begin
   medt_project_start.Text := FormatDateTime('dd.mm.yyyy', TMonthCalendar(Sender).Date);
   Sender.Free;
 end;
 if sender_name = 'mc_project_end' then
 begin
   medt_project_end.Text := FormatDateTime('dd.mm.yyyy', TMonthCalendar(Sender).Date);
   Sender.Free;
 end;
end;

...

procedure Tfrm_request.img_customer_requested_start_calenderClick(
  Sender: TObject);
var
 monCal : TMonthCalendar;
begin
 monCal := TMonthCalendar.Create(Self);
 with monCal do
 begin
   Parent := p_dates;
   Name := 'mc_customer_request_start';
   Left := 120; //95
   Top := img_customer_requested_start.Top + img_customer_requested_start.Height+4;
   OnClick := SetMonthCalendarDateToField;
 end;
end;

...

procedure Tfrm_request.img_customer_requested_end_calenderClick(
  Sender: TObject);
var
 monCal : TMonthCalendar;
begin
 monCal := TMonthCalendar.Create(Self);
 with monCal do
 begin
   Parent := p_dates;
   Name := 'mc_customer_request_end';
   Left := 120; //95
   Top := img_customer_requested_end.Top + img_customer_requested_end.Height+4;
   OnClick := SetMonthCalendarDateToField;
 end;
end;
Mein Problem ist jetzt nur, dass jeder Klick auf das erzeugte TMonthCalender die OnClick Prozedur auslöst, d.h. auch wenn der Monat gewechselt wird. Das ist unglücklich.
Ich möchte gerne nur das Datum übertragen, wenn im TMonthCalendar wirklich ein Datum gesetzt wird.

Danke im Voraus.
Sven

Volker Z. 21. Mai 2013 21:27

AW: TMonthCalendar OnClick nur wenn man ein Datum ausgewählt hat.
 
Hallo,

du könntest mal folgenden Ansatz versuchen:
Delphi-Quellcode:
type
  TMonthCalendar = class(Vcl.ComCtrls.TMonthCalendar)
  strict private
    FSelection : Boolean;
  private
    procedure  CNNotify(var Msg : TWMNotify); message CN_NOTIFY;
  public
    constructor Create (AOwner: TComponent); override;
    property   Selection : Boolean read FSelection;
  end;

  Tfrm_request = class(TForm)
    // Alles wie gehabt
  end;

implementation

uses
  WinApi.CommCtrl;

procedure TMonthCalendar.CNNotify (var Msg : TWMNotify);
begin
  FSelection := Msg.NMHdr^.code = MCN_SELECT;

  inherited
end;

constructor TMonthCalendar.Create (AOwner : TComponent);
begin
  inherited Create (AOwner);

  FSelection := False;
end;

procedure Tfrm_request.SetMonthCalendarDateToField(Sender: TObject);
var
  sender_name : string;
begin
  if not ((Sender is TMonthCalendar) and TMonthCalendar (Sender).Selection) then
    Exit;

  // Rest wie gehabt
end;
Gruß

Piro 26. Mai 2013 21:25

AW: TMonthCalendar OnClick nur wenn man ein Datum ausgewählt hat.
 
Danke für den Ansatz. Aufgrund der Zeit habe ich mir einfach ein neues Form genommen und es so abgeändert, dass es wie ein PopUp aussieht.

Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz