Форум: "Прочее";
Текущий архив: 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 на еще одно событие, и propertyfunction 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