Версия для печати
VCL.TDateTimePicker.Checked.Свойство не устанавливается при инициализации
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1151Cepгей 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, и во многих других случаях.
Типовые решения
Варианты решения:
- Два раза устанавливать свойство Checked
- Изменить метод 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;