Выпадающий TMonthCalendar
От: чапч Россия  
Дата: 22.11.04 08:19
Оценка:
Для ввода даты в ГРИД пробую использовать стандартный компонент по вводу даты. Порядок действий таков.

  1. Описываем новый класс:


    TPopupDateTimePicker = class(TMonthCalendar)
     private
     protected
       procedure CreateParams(var Params: TCreateParams); override;
       procedure CreateWnd; override;
       procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
     end;
    procedure TPopupDateTimePicker.CreateParams(var Params: TCreateParams);
    begin
     inherited CreateParams(Params);
     with Params do
     begin
       Style := Style or WS_BORDER;
       ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
       AddBiDiModeExStyle(ExStyle);
       WindowClass.Style := CS_SAVEBITS;
     end;
    end;
    
    procedure TPopupDateTimePicker.CreateWnd;
    begin
     inherited CreateWnd;
     Windows.SetParent(Handle, 0);
     CallWindowProc(DefWndProc, Handle, wm_SetFocus, 0, 0);
    end;
    
    procedure TPopupDateTimePicker.MouseUp(Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    begin
     inherited MouseUp(Button, Shift, X, Y);
     if y>35 then
       TInplaceEditList(Owner).CloseUp((X >= 0) and (Y >= 0) and (X < Width) and (Y < Height));
    end;


  2. При активизации определенной ячейки рисуем в ней кнопку и при нажатии на ней выкидываем(показываем) данный компонент следующей функцией:
    SetWindowPos(Handle, HWND_TOP, P.X, Y, 0, 0,
    SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
Вопросов собственно два:

  1. Как узнать что пользователь окончательно выбрал дату, а не перелистнул месяц или год, а то проверка на MOUSEUP условия if y>35 then выглядит уж больно некрасиво
  2. В выпадающем компоненте не может активизироваться редактор года, т.е. UPDOWN для изменения года.В чем может быть проблема.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.