Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  00:45[Войти] | [Зарегистрироваться]
Ответ на вопрос № 75827

23-02-2010 08:14
Коллеги, день добрый...
Решил в DBGrid вшить DateTimePicker в поля, которые являются датой.
В общем что делаю. Создаю компонент как родительский от грида. Далее, вешаю обработку изменений DateTimePicker для записи в БД. Следующим моим шагом была обработка очистки при нажатии на Del или Backspace. И заключительным итогом было добиться, чтобы компонент работал как стандартный компонент редактирования сетки (при нажатии на таб или шифт таб производилась навигация по ячейкам, при ctrl+del было удаление и т.д.) в общем не было бы проблем, если бы в событии keypressed отлавливался TAB. вот тут и начались проблемы. Нашел на одном из ресурсов рекомендацию по замене события приложения OnMessage. Все хорошо и замечательно начало получаться, однако возникла другая проблема: в случае, когда DateTimePicker  в фокусе, не получается мышью переключиться на другие элементы формы (становится просто невозможно изменить фокус). По клику мыши на кнопки, фокус без нажатия на кнопку тут же возвращается обратно к DateTimePicker. Доступно только переключение PageControl и переключение в сетке. Gри этом навигация кнопками по сетке работает, ctrl+del работает.
Собственно, как я только не извращался, но проблемы не решило и хоть убей не понимаю как отлаживать эту процедуру... В общем прошу помощи, у кого какой опыт решения проблемы был. Сразу скажу, что хочу принципиально понять как решить проблему, поэтому другие компоненты не предлагать.
Сам код:
Обработчик Application.OnMessage


procedure ThotelCrDBGrid.AppMessage(var Msg: TMsg; var Handled: Boolean);
var a : integer;
begin
  if (Msg.Message = WM_KEYDOWN) and (Msg.hwnd = DateTimePicker.Handle) then
    if (Msg.wParam = VK_BACK) or ((Msg.wParam = VK_DELETE) and
      not ((GetKeyState (VK_LCONTROL) <= 0) or (GetKeyState (VK_RCONTROL) <= 0))) then
    begin
      DateTimePicker.Format := '''''''' '''''''';
      fCurrentDateColumn.Field.DataSet.Edit;
      fCurrentDateColumn.Field.Value := Null;
    end
    else if (Msg.wParam = VK_UP) or (Msg.wParam = VK_DOWN)
          or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT) then
    begin
      DefWindowProc(Msg.hwnd, Msg.message, Msg.wParam, Msg.lParam);
    end
    else
    begin
      SendMessage (Handle, Msg.message, Msg.wParam, Msg.lParam);
      SetFocus;
      Msg.message := 0;
      Handled := True;

//      DefWindowProc(Msg.hwnd, Msg.message, Msg.wParam, Msg.lParam);
    end
  else
    Handled := False;
end;



Остальные обработчики для понимания


constructor ThotelCrDBGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  DateTimePicker := TDateTimePicker.Create (AOwner);
  DateTimePicker.Visible := False;
  DateTimePicker.OnChange := DTPOnChange;
  DateTimePicker.OnKeyDown := DTPKeyDown;
  DateTimePicker.Parent := Self;
  DateTimePicker.TabStop := False;
  DateTimePicker.TabOrder := -1;
  DateTimePicker.OnExit := DTPExit;
  OnDrawColumnCell := CRDBGDrawColumnCell;
  Application.OnMessage := AppMessage;
end;

procedure ThotelCrDBGrid.DTPOnChange (Sender: TObject);
var
  vCounter : integer;
begin
  DateTimePicker.Format := ''''''''dd.MM.yyyy'''''''';
  fCurrentDateColumn.Field.DataSet.Edit;
  fCurrentDateColumn.Field.Value := DateTimePicker.Date;
end;

procedure ThotelCrDBGrid.CRDBGDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdSelected in State) and ((Column.Field.DataType = ftDate) or (Column.Field.DataType = ftDateTime)) and
    (dgEditing in Options) then
  begin
    DateTimePicker.Top := Rect.Top - 1;
    DateTimePicker.Left := Rect.Left;
    DateTimePicker.Height := Rect.Bottom - Rect.Top + 2;
    DateTimePicker.Width := Rect.Right - Rect.Left;
    if VarIsNull (Column.Field.Value) then
      DateTimePicker.Format := '''''''' ''''''''
    else
    begin
      DateTimePicker.Format := ''''''''dd.MM.yyyy'''''''';
      DateTimePicker.Date := Column.Field.Value;
    end;
    DateTimePicker.Visible := True;
    DateTimePicker.SetFocus;
    fCurrentDateColumn := Column;
  end;
end;

procedure ThotelCrDBGrid.DTPExit(Sender: TObject);
begin
  DateTimePicker.Visible := False;
  fCurrentDateColumn := nil;
end;

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

23-02-2010 12:13
Антон, спасибо большое... изменив всего лишь одну строку DateTimePicker.Parent := Self уже получил ожидаемый результат...
Буду дальше тестировать... еще раз огромное спасибо... :)

23-02-2010 08:20
В VCL есть ошибка - у всех Gdid''ов некорректно написан метод, отвечающий за передачу сообщений дочерним элементам управления. Из-за этого любой элемент управления, Parent''ом которого является Grid, будет вести себя некорректно. Есть два способа борьбы с этим: либо сделать своего наследника от TDBGrid, переписав в нём обработчик WM_Command, либо делать Parent''ом не Grid, а, например, саму форму, высчитывая координаты внедряемого компонента таким образом, чтобы визуально он выглядел лежащим на Grid''е.

О том, как правильно обрабатывать WM_Command, и что неправильно сделано в TCustomGrid''е, я писал тут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=169#07

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования