Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.07;
Скачать: CL | DM;

Вниз

Пишем свой wysiwyg HTML-редактор   Найти похожие ветки 

 
Loginov Dmitry ©   (2010-07-25 11:09) [0]

Вышла статья на эту тему:
http://matrix.kladovka.net.ru/index.php?page=htmleditor

Описаны действия по созданию wysiwyg HTML-редактора на основе компонента TWebBrowser. В качестве примера к статье предлагается готовый  wysiwyg HTML-редактор, доступный по адресу:
ftp://www.automatikaplus.ru/_PTK%20AZS/PTK%20AZS%209/UTILS/HTMLEditor.zip

Возможно кого-то заинтересует этот материал. Если появятся вопросы / предложения, прошу высказывать их здесь, либо пишите на мой e-mail.


 
PZ ©   (2010-07-25 11:34) [1]

Я тоже года три назад написал HTML-редактор, использовав статью «Визуальный HTML редактор своими руками». Ваш редактор более мощный. Воспользуюсь.


 
Юрий Зотов ©   (2010-07-25 12:43) [2]

А смысл? В учебных целях, разве что...


 
Loginov Dmitry ©   (2010-07-25 17:17) [3]


> А смысл? В учебных целях, разве что...


Наверное. Хотя над смыслом статьи я не думал. Это просто набор полезной информации в одном месте. Если эта информация будет кому-либо полезной, я буду рад. Кто-то этим занимается, кого-то интересует данная тема. После индексации страницы поисковики будут выдавать ее как результат поиска материала по соответствующим запросам.
Естественно для меня эта статья никакого особого смысла не представляет. Хотя вдруг через N-цать лет потребуется воспользоваться этим материалом, тогда буду знать где его искать.


 
sniknik ©   (2010-07-25 17:25) [4]

> кого-то интересует данная тема.
очень интересует...
http://delphimaster.net/view/15-1276971762/
до сих пор. но в статье все только "по верхушкам".

p.s. давно сделал аналогичную, свою форму на событие браузера - Ctrl+O, и хранение до 10 ссылок из нее в реестре, но желание сделать именно так осталось. ;)


 
Loginov Dmitry ©   (2010-07-25 18:19) [5]


> очень интересует...
> http://delphimaster.net/view/15-1276971762/
> до сих пор. но в статье все только "по верхушкам".


Не сталкивался с такой необходимостью.


> p.s. давно сделал аналогичную, свою форму на событие браузера
> - Ctrl+O, и хранение до 10 ссылок из нее в реестре, но желание
> сделать именно так осталось. ;)


Вот память у человека!)
Сделай чтобы работало и забудь! Все равно ведь переделывать не будешь, даже если ответ отыщется :)

P.S. Я бы сделал также. Правда мне было бы лень перехватывать Ctrl+O, привык полагаться на TAction.


 
sniknik ©   (2010-07-25 18:34) [6]

> привык полагаться на TAction.
он не работает когда фокус у веббраузера (это же фактически другая программа), т.что пришлось использовать пользовательские события самого IE, хорошо, что у него это есть.


 
sniknik ©   (2010-07-25 18:53) [7]

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


 
Loginov Dmitry ©   (2010-07-25 22:34) [8]


> он не работает когда фокус у веббраузера (это же фактически
> другая программа), т.что пришлось использовать пользовательские
> события самого IE, хорошо, что у него это есть.


Это что-то вроде раздела "Обработка событий" в статье, или что-то другое? Как реализовывали?


 
sniknik ©   (2010-07-25 22:52) [9]

> в статье, или что-то другое?
в статье обрезано по "самое не могу", больше хак чем работа...

> Как реализовывали?
пример одного события (кроме этого у меня еще запрет родного меню на нем/показ своего)

 TDocHostUIHandler = class(TComObject, IDocHostUIHandler)
 protected
   function IDocHostUIHandler.TranslateAccelerator = IDocHostUIHandler_TranslateAccelerator;

   function IDocHostUIHandler_TranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID; const nCmdID: DWORD): HRESULT; stdcall;
 end;

function TDocHostUIHandler.IDocHostUIHandler_TranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID; const nCmdID: DWORD): HRESULT;
begin
 if (lpmsg.wParam = Ord("O")) or (lpmsg.wParam = Ord("L")) then
   if GetKeyState(VK_CONTROL) < 0 then
...


 
Loginov Dmitry ©   (2010-07-25 23:36) [10]


> в статье обрезано по "самое не могу", больше хак чем работа.


В принципе для ловли событий от мыши и клавиатуры оказалось достаточно. На Королевстве есть еще один пример, но в нем коду больше :)


> пример одного события


Интересно. Нужно будет попробовать.


> кроме этого у меня еще запрет родного меню на нем/показ
> своего


Вот с этим я практически справился.
Использую такой код:

procedure TEditorForm.WMMouseActivate(var Msg: TMessage);
var
 ARect: TRect;
 Cur: TPoint;
begin

   inherited;

   if Msg.LParamHi = 516 then
   begin
     ARect := WebBrowser1.BoundsRect;
     ARect.TopLeft := WebBrowser1.ClientToScreen(ARect.TopLeft);
     ARect.BottomRight := WebBrowser1.ClientToScreen(ARect.BottomRight);
     ARect.Right := ARect.Right - 20;
     ARect.Bottom := ARect.Bottom - 20;

     Cur := Mouse.CursorPos;
     if (Cur.X >= ARect.Left) and (Cur.X <= ARect.Right) and
        (Cur.Y >= ARect.Top) and (Cur.Y <= ARect.Bottom) then
     begin
         Msg.Result:= MA_NOACTIVATEANDEAT;
         PopupMenu1.Popup(Cur.x, Cur.y);
     end;
   end;
end;


Но если тыкать близко к правой (в Win XP) или нижней (в WinXP, Win 7) границе экрана, то этот код не работает. Мое меню появляется (иногда можно успеть это заметить), но тут же прячется. Че-то IE там колдует! :)

Есть ли способ избавиться от этого глюка?


 
sniknik ©   (2010-07-26 00:28) [11]

> Вот с этим я практически справился.
это что событие с формы? мог бы и поточнее посчитать координаты, типа

procedure TLogoForm.WMMouseActivate(var Msg: TWMMouseActivate);

 function InPos(c: TControl; p: TPoint): boolean;
 begin
   result:= (p.X > c.Left) and (p.X < (c.Left + c.Width)) and
            (p.Y > c.Top) and (p.Y < (c.Top + c.Height));
 end;

begin
 inherited;
 try
   if (Msg.MouseMsg = 516) and InPos(WebBrowser, ScreenToClient(Mouse.CursorPos)) then begin
     PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
     Msg.Result:= MA_NOACTIVATEANDEAT;
   end;
 except
 end;
end;


> Есть ли способ избавиться от этого глюка?
расширить вышеприведенное IDocHostUIHandler на еще одно событие, и property  
function ShowContextMenu( const dwID: DWORD; const ppt: PPOINT; const pcmdtReserved: IUnknown; const pdispReserved: IDispatch ): HRESULT; stdcall;
public
 property WebBrowser: TWebBrowser read FWebBrowser write FWebBrowser;
end;

function ShowContextMenu(const dwID: DWORD; const ppt: PPOINT; const pcmdtReserved: IUnknown; const pdispReserved: IDispatch): HRESULT;
begin
 if Assigned(FWebBrowser) and Assigned(FWebBrowser.PopupMenu) then
   FWebBrowser.PopupMenu.Popup(ppt^.x, ppt^.y);

 Result:= S_OK;
end;


 
Loginov Dmitry ©   (2010-07-26 11:20) [12]

sniknik, ОГРОМНОЕ спасибо за подсказку, все получилось!!! Обязательно исправлю статью должным образом :)

В итоге взял готовые модули отсюда:
http://www.delphidabbler.com/articles?article=18&part=6



Страницы: 1 вся ветка

Текущий архив: 2010.11.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
15-1279704739
12
2010-07-21 13:32
2010.11.07
О танках мнение.


15-1280003372
Юрий
2010-07-25 00:29
2010.11.07
С днем рождения ! 25 июля 2010 воскресенье


2-1281722016
Дмитрий Стариков
2010-08-13 21:53
2010.11.07
Снова за помощью


15-1280041741
Loginov Dmitry
2010-07-25 11:09
2010.11.07
Пишем свой wysiwyg HTML-редактор


15-1280344780
Kolan
2010-07-28 23:19
2010.11.07
Как проверить алгоритм