Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Неправильно работают горячие клавиши


Автор: aktuba 15.5.2006, 19:20
Делаю программу WYSIWYG редактора для блога.
В следующем коде: 
Код

procedure TfrmMain.MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
var
  iOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
  Range: IHTMLTxtRange;
  CtrlRange: IHTMLControlRange;
  tag: IHTMLElement;
begin
  if Editor_Mode then
    begin
      if WebBrowser=nil then
       begin
         Handled:=False;
         Exit;
       end;
    Handled:=(IsDialogMessage(WebBrowser.Handle,Msg)=true);
    if (Handled) and (not WebBrowser.Busy) then
      begin
        if FOleInPlaceActiveObject=nil then
          begin
            Dispatch:=WebBrowser.Application;
            if Dispatch<>nil then
              begin
                Dispatch.QueryInterface(IOleInPlaceActiveObject,iOIPAO);
                if iOIPAO<>nil then FOleInPlaceActiveObject:=iOIPAO;
              end;
          end;
        if FOleInPlaceActiveObject<>nil then
          begin
            //FOleInPlaceActiveObject.TranslateAccelerator(Msg);
            if ((Msg.message=WM_LBUTTONDOWN) or (Msg.message=WM_LBUTTONUP) or
                (((Msg.message=WM_KEYDOWN) or (Msg.message=WM_KEYUP)))) then
            if (Editor.Selection.Type_='Text') or (Editor.selection.type_='None') then //Text
            begin
              Range:=(editor.selection.createRange as IHTMLTxtRange);
              tag:=Range.parentElement;
             // Обработка текстового выделения
            end else if Editor.Selection.Type_='Control' then
              begin
              // Object
                CtrlRange:=(editor.selection.createRange as IHTMLControlRange);
                tag:=CtrlRange.commonParentElement;
                // Обработка графического выделения
              end else FOleInPlaceActiveObject.TranslateAccelerator(Msg);
          end;
      end;
    end else
     begin
     // Code
     end;
end;


какаято ошибка. Если раскоментировать строку
Код

//FOleInPlaceActiveObject.TranslateAccelerator(Msg);

то работают горячие клавиши, но перемещение по тексту происходит через два символа, а если оставить закоментированной-перемещение нормально, но горячие клавиши не работают. В чем проблема? Помогите... smile  

Автор: December 17.5.2006, 15:05
была у меня схожая проблема
как точно решил - не помню smile кажется, ручками фильтровал сообщения, проходящие через эту функцию и блокировал управление курсором 

Автор: December 17.5.2006, 19:51
Ага, вот моя строчка smile
Код

if not (Msg.wParam in [VK_BACK, VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN]) then//first check, somewhy keystrokes are doubled
 

Автор: aktuba 17.5.2006, 21:23
Я решил примерно также:

Код

function TfrmMain.WebBrowserTranslateAccelerator(const lpMsg: PMsg;
  const pguidCmdGroup: PGUID; const nCmdID: Cardinal): HRESULT;
const DialogKeys: set of Byte=[VK_LEFT,VK_RIGHT,VK_BACK,VK_UP,VK_DOWN,
                              $30..$39,$41..42,$44..$55,$57,$59..$5A];
begin
  if ((lpMsg.message=WM_KeyDown) or (lpMsg.message=WM_KeyUp))
      and (lpMsg.wParam in DialogKeys) then Result:=S_OK else Result:=S_FALSE;
end;
 

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