Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];

Вниз

Пишем свой 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
4-1240991885
Zalum
2009-04-29 11:58
2010.11.07
Передать работающему приложению параметры


15-1280348982
Юрий
2010-07-29 00:29
2010.11.07
С днем рождения ! 29 июля 2010 четверг


2-1281622671
RuCosinus
2010-08-12 18:17
2010.11.07
Проверить, имеет ли пользователь права администратора домена


15-1280325567
sniknik
2010-07-28 17:59
2010.11.07
Проверьте пожалуйста, если у вас больше чем один домен...


15-1279704739
12
2010-07-21 13:32
2010.11.07
О танках мнение.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский