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, и во многих других случаях.
Варианты решения:
- Два раза устанавливать свойство 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;
[TDateTimePicker] [Интерфейс. Компоненты и формы]
Обсуждение материала нет сообщений |