Версия для печати


VCL.TDateTimePicker.Checked.Свойство не устанавливается при инициализации
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1151

Cepгей Poщин
дата публикации 12-09-2005 09:36

КАТЕГОРИЯБИБЛИОТЕКА.VCL.TDateTimePicker.Checked.Свойство не устанавливается при инициализации
ПРОДУКТDelphi
ПЛАТФОРМАWindows


Проверено в Delphi 2005 Update 2.

Например, желаемое состояние галки после создания в компоненте Picker1 - сброшено. Если в дизайнере форм это свойство установить в False, то программа при первом запуске будет работать правильно, а при возврате в дизайнер форм галка опять появится. Попробуем установить это свойство в конструкторе формы.

constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited;
  Picker1.Checked:=false;       //Picker1.Checked=true
  Picker1.Checked:=false;       //Picker1.Checked=false
  Picker1.ShowCheckbox:=false;
  ...
  Picker1.ShowCheckbox:=true;   //Picker1.Checked=true
end;
После первой попытки изменить свойство, оно остается прежним, а после второй попытки оно все-таки меняется. При этом вызывается метод SetChecked:
procedure TDateTimePicker.SetChecked(Value: Boolean);
var
  ST: TSystemTime;
begin
  FChecked := Value;
  if FShowCheckbox then
  begin
    if Value then SetDateTime(FDateTime)
    else DateTime_SetSystemTime(Handle, GDT_NONE, ST);
    Invalidate;
  end;
end;
Если Value=false, идет обращение к свойству Handle. При первом обращении (что в данном случае и происходит) создается окно с помощью метода CreateWND. При создании окна устанавливается время с помощью метода MsgSetDateTime в котором FChecked становится равным True. Обращение к методу CreateWND происходит также при изменении свойства ShowCheckbox, и во многих других случаях.


Типовые решения
Варианты решения:
  1. Два раза устанавливать свойство Checked
  2. Изменить метод CreateWND:
    procedure TDateTimePicker.CreateWnd; //Старый вариант
    begin
      inherited CreateWnd;        //fChecked стало равным True
      SetChecked(fChecked);
      if Length(FFormat) > 0 then
        SendMessage(Handle, DTM_SETFORMAT, 0 , Integer(PChar(FFormat)));
    end;
    
    procedure TDateTimePicker.CreateWnd; //Исправленный вариант
    var OldChecked:boolean;
    begin
      OldChecked:=FChecked;
      inherited CreateWnd;
      SetChecked(OldChecked);
      if Length(FFormat) > 0 then
        SendMessage(Handle, DTM_SETFORMAT, 0 , Integer(PChar(FFormat)));
    end;