Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Не могу сделать фокус на дочерний элемент


Автор: Indeesa 13.2.2009, 13:28
Добрый день. Вопрос скорее по VCL, переписываю TStringGrid под свои нужды, делаю обработку нажатия кнопки мыши на ячейку, при нажатии должен появиться TComboBox и чтобы фокус перевёлся на него.
Код

procedure TStrGrid.CMMouseActivate(var Message: TCMMouseActivate);
var
    str : string;
    cx, cy : integer;
begin
    inherited;
    MouseToCell( Message.MouseActivateRec.MousePos.X,    
    Message.MouseActivateRec.MousePos.Y, cx, cy );
    if ( Objects[ cx, cy ] is TCellStore ) then
    case TypeCol( cx ) of
        GT_COMBOX : begin
                                   ComboBoxCellActivate( cx, cy );
                               end;
    end;

end;

procedure TStrGrid.ComboBoxCellActivate( const ACol, ARow : integer );
var
    CM : TComboBox;
    Sl : TStringList;
    R : TRect;
begin
    R := CellRect( ACol, ARow );
    FComboBox.Top := R.Top;
    FComboBox.Left := R.Left;
    FComboBox.Items := TComboBoxType( Objects[ ACol, 0 ] ).Strings;
    FComboBox.Visible := true;
    //SendCancelMode(Self);
    Windows.SetFocus( FComboBox.Handle );
//    FComboBox.SetFocus;

//    FComboBox.
//    SetActiveControl( FComboBox );
end;


FComboBox := TComboBox.Create( nil );
FComboBox.parent := TStrGrid( self );//так то просто self для наглядности тип привёл
копадлся в VCL 
при вызове сетфокуса он проверяет есть ли у него предок от TCustomForm, если есть то он передаёт ему контрол

Если в двух словах, то я хочу чтобы Combobox в режим редактирования сразу уходил

Автор: bems 13.2.2009, 15:56
Делай комбобоксу того же родителя что и гриду, и перещитывай координаты из грида, в родительские

Автор: Indeesa 14.2.2009, 17:27
Цитата(bems @ 13.2.2009,  15:56)
Делай комбобоксу того же родителя что и гриду, и перещитывай координаты из грида, в родительские

ну так то это решение, но можно создать чистую форму кинуть StringGrid кинуть ComboBox, при создании менять parent у combobox на StringGrid и кнопку со следующим кодом Windows.SetFocus( ComboBox.Handle ) и всё будет шикарно, по моему мнению просто после моего WMMOUSEACTIVATE идёт набор команд который выкидывает фокус с ComboBox, попоробую посылать отдельное сообщение для грида на отоброжение CombobBox

А с другой стороны может кто-нить копался с устройством TInplaceEditor в TStringGrid как они ему передают фокус ?

Автор: Indeesa 14.2.2009, 21:55
вот что при нажатии на ячейку TStringGrid происходит

33-21 WM_MOUSEACTIVATE                          -----------Заблокировав 
45131 CM_MOUSEACTIVATE
70-46 WM_WINDOWPOSCHANGING
70-46 WM_WINDOWPOSCHANGING
528-210 WM_PARENTNOTIFY
45108 CM_INVALIDATE
70-46 WM_WINDOWPOSCHANGING
45082 CM_ENTER
45063 CM_FOCUSCHANGED 
273-111 WM_COMMAND
32-20 WM_SETCURSOR
513-201 WM_LBUTTONDOWN                            -------- Заблокировав
273-111
273-111
7-7 WM_SETFOCUS
45063 CM_FOCUSCHANGED 
45097 CM_UIACTIVATE 
512-200
514-202 WM_LBUTTONUP                                  ------- Заблокировав 
533-215


Заблокировав эти три сообщения фокус перейдёт на combobox
Дествительно утро вечера мудреннее =) Всем спасибо

P.s но всё равно есть маза что я это не корректно делаю, если есть спецы сталкивавшиеся с переписанием компонентов, не могли бы Вы посоветовать литературку 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)