![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
HTML Редактор от Microsoft
Алексей Петухов © (2005-07-23 21:01:00)Здравствуйте, уважаеме мастера.
Вот пытаюсь работать сActiveXсомпонентомTDHTMLEdit.
на второй формеDHTMLEdit1:TDHTMLEdit
На первой форме кликаем кнопочку
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.Create(nil);
Form2.ShowModal;
Form2.Free;
end;
И если на второй форме срабатывает какое либо обращение кDHTMLEdit1.DOM, то получаем'Access Violation'приForm2.Free;
Помогите, чем можете :-)
А то я скоро кипятком писать начну :-)
Amido (2005-08-08 10:52:00) [1]Вот и ответик "в догонку" :)
Сам с етой проблемой столкнулся, а решается она довольно таки просто. Перед открытием документа необходимо просто поставить designMode := 'off'.
//--- File -> Open
...
var
HtDocument2: IHTMLDocument2; // global variable
...
procedure TfrmMain.Action1Execute(Sender: TObject);
begin
if HtDocument2 <> nil then
HtDocument2.designMode := 'off';
OpenDialog1.InitialDir := ExtractFileDir(ParamStr(0))+'\docs\';
if OpenDialog1.Execute then
EmbeddedWB1.Navigate('file://' + OpenDialog1.FileName);
end;
А вот как инициализируется HtDocument2:
procedure TfrmMain.EmbeddedWB1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
try
HtDocument2 := (EmbeddedWB1 as TEmbeddedWB).document as IHTMLDocument2;
except
// do nothing
end;
end;
Алексей Петухов (2005-08-06 19:32:00) [2]Помогите с последним вопросом, пожалуйста.
Алексей Петухов (2005-08-05 17:30:00) [3]Еще один вопросик " в догонку".
Никак не пойму - как побороть сообщение " Этот документ изменился. Сохнанить изменения?"
1)Вот так заполняетсяwbEditor:TWebBrowser(где s- путь к текстовому файлу "по умолчанию"):
var
Flags:OleVariant;
s:string;
begin
.....
wbEditor.Navigate(WideString(s),Flags,Flags,Flags,Flags);
.....
2) затем редактируем текст в компонентеwbEditor:TWebBrowser.
3) потом хотим опять загрузить в него текст "по умолчанию" (как в п.1).
Вот здесь и вылетает вопросец.
Как ибавиться от него?Я подозреваю должен быть метод или свойство (что-то типаDisplayAlerts:=false), но не могу найти ничего подобного. Прошу Посоветуйте по теме.
Алексей Петухов (2005-08-02 06:23:00) [4]Большое спасибо Admido.
Немного расслабился и то-же улыбнулся. :-)
Можно сказать впервые наткнулся на проблему, которую действительно надо решать (очень мало информации и опыт других собирается по крупицам).
Admido (2005-08-01 14:30:00) [5]Алексей Петухов (31.07.05 18:17) [38]
"1. Как получить атрибуты шрифта выделенного текста?"
"Копайте" в эту сторону:
var
selectionRange: IHtmlTxtRange;
iHTelement: IHTMLElement;
font: WideString;
begin
//...
selectionRange := IHtmlTxtRange(iHTDocument2.selection.createRange);
try
font := selectionRange.parentElement.style.fontFamily;
//... etc etc...
except
Exit;
end;
"2. Как сделать обработчик события OnMouseUp?"
"3. Как определить редактировалось ли содержание (onChange)?"
Мне вас уже жалко =] Идите на http://www.euromind.com/iedelphi/, смотрите как подключить EditDesigner. У него имеется к примеру "function TForm1.EditDesigner1PreHandleEvent(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HRESULT;" таким образом сможете отлавливать события.
И вообще bug'рово это все и документации никакой (только минимум). По всему интернету только вопросы... Тут 2 варианта: или все жадные (денег хотят), или никто не может найти "нормального" решения, т.к. сделано это добро в "стиле микрософт". Всё через ж..пу... буржуи...
К примеру попробуйте сделать визуальный редактор таблиц как в каком-нибудь FrontPage... ёб.. слов не хватает... Если получится - поделитесь впечатлениями и кодом желательно ;)
"4. как определить текущий (под курсором) таг (аналогично DHTMLEdit.DOM.parentWindow.event.srcElement;)"
Также как и в 1. пункте, только:
selectionRange.parentElement.tagName;
Admido (2005-08-01 13:55:00) [6]И еще тут сможете найти много полезной информации:
http://groups.yahoo.com/group/delphi-webbrowser/messages/
Алексей Петухов (26.07.05 18:48) [17]
...
"3) Вообще задача - элементарный редактор HTML с минимальным набором опций."
...
Amido (27.07.05 15:55) [33]
...
"...Если же захотите "копать глубже" - примите мои соболезнования =DDD"
...
По моему, вы начинаете "копать глубже" =D
Admido (2005-08-01 13:48:00) [7]Алексей Петухов (31.07.05 17:03) [37]
"А где можно почитать описание метода Doc.execCommand и его параметров?"
Вот тут:
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/document2/execcommand.asp
Алексей Петухов (2005-08-01 13:38:00) [8]Есть предложения
Алексей Петухов (2005-07-31 18:17:00) [9]И еще:
1. Как получить атрибуты шрифта выделенного текста?
2. Как сделать обработчик собылия OnMouseUp?
3. Как определить редактировалось ли содержание (onChange)?
4. как определить текущий (под курсором) таг (аналогично DHTMLEdit.DOM.parentWindow.event.srcElement;)
Заранее благодарю.
Алексей Петухов (2005-07-31 17:03:00) [10]Большое спасибо за помощь.
Буду пробовать.
> Amido (29.07.05 10:35) [36]
А где можно почитать описание методаDoc.execCommandи его параметров?
Amido (2005-07-29 10:35:00) [11]2Алексей Петухов
Если еще не разобрались, то вот несколько примеров Doc.execCommand(...) как продолжение к описанию
//Джо © (28.07.05 20:57) [35]
Doc.execCommand('Cut',false,0);
Doc.execCommand('Copy',false,0);
Doc.execCommand('Paste',false,0);
Doc.execCommand('Delete',false,0);
Doc.execCommand('Undo',false,0);
Doc.execCommand('Bold',false,0);
Doc.execCommand('Italic',false,0);
Doc.execCommand('Underline',false,0);
Doc.execCommand('StrikeThrough',false,0);
Doc.execCommand('InsertUnorderedList',false,0);
Doc.execCommand('JustifyLeft',false,0);
Doc.execCommand('JustifyRight',false,0);
Doc.execCommand('JustifyCenter',false,0);
Doc.execCommand('FontName',false,vFont.Name);
Doc.execCommand('FontSize',false,vFont.Size);
Doc.execCommand('ForeColor',false,vFont.Color);
Джо (2005-07-28 20:57:00) [12]
> [34] Алексей Петухов (28.07.05 20:26)
Да, конечно, они же реализуют один и тот же интерфейс, IHTMLDocument2.
Примерно так:
procedure TForm1.Button1Click(Sender: TObject);
begin
// открываем страницу
WebBrowser1.Navigate(' http://www.ya.ru');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Doc: IHTMLDocument2;
begin
// делаем ее редактируемой
Doc := WebBrowser1.Document as IHTMLDocument2;
Doc.designMode := 'On';
// вызываем различные другие методы интерфейса...
Doc.all.toString....
Doc.execCommand(...)
end;
Алексей Петухов (2005-07-28 20:26:00) [13]А есть ли у
TWebBrowserили уTEmbeddedWBметоды, аналогичные следующим уTDHTMLEdit?
DHTMLEdit.ExecCommand(DECMD_BOLD, OLECMDEXECOPT_DONTPROMPTUSER);
DHTMLEdit.ExecCommand(DECMD_ITALIC, OLECMDEXECOPT_DONTPROMPTUSER);
DHTMLEdit.ExecCommand(DECMD_UNDERLINE, OLECMDEXECOPT_DONTPROMPTUSER);
DHTMLEdit.ExecCommand(DECMD_ORDERLIST, OLECMDEXECOPT_DONTPROMPTUSER);
и главное:
DHTMLEdit.ExecCommand(DECMD_FONT, OLECMDEXECOPT_PROMPTUSER);
Очень надо :-)
Amido (2005-07-27 15:55:00) [14]А если уж совсем просто (и быстро) хотите слелать "элементарный редактор HTML с минимальным набором опций" то в Делфи7 есть уже почти готовое решение:
C:\Program Files\Borland\Delphi7\Demos\CoolStuf
Остается только подключить MSHTML_TLB (поищите в интернете).
Добавить его в Uses. Бросить на готовый Делфинцкий пример кнопочку с названием типа "Edit":
//--- Knopka "Edit"
procedure TMainForm.Button1Click(Sender: TObject);
begin
(WebBrowser1.document as IHTMLDocument2).designMode := 'On';
end;
И "наслаждаться" =] Если же захотите "копать глубже" - примите мои соболезнования =DDD
Amido (2005-07-27 15:18:00) [15]Посетите:
http://www.euromind.com/iedelphi/
Алексей Петухов (2005-07-27 14:17:00) [16]А что такое EmbeddedWb1?
Amido (2005-07-27 10:53:00) [17]"3) Вообще задача - элементарный редактор HTML с минимальным набором опций."
Вот вам и редактор:
//...
EmbeddedWb1.go(ExtractFileDir(ParamStr(0))+'\test.html');
while Embeddedwb1.Busy do
Application.ProcessMessages;
(EmbeddedWB1.document as IHTMLDocument2).designMode := 'On';
//...
Алексей Петухов (2005-07-27 09:18:00) [18]Что-же делать?
Может все-таки есть подобные компоненты?
Джо (2005-07-26 20:29:00) [19]
> [27] Алексей Петухов (26.07.05 20:26)
Пробовал и так, разумеется. Но больше не буду - снес к чертовой матери этот самый ActiveX из пакетов. Из-за него Делфи стала некорректно этот пакет грузить. Так что - извини, помочь не смогу :0)
Алексей Петухов (2005-07-26 20:26:00) [20]
> любое обращение к DHTMLEdit1.DOM вызывает 'Catastrophic
> failure'
Попробуй обращаться к DOM только после того, как DHTMLEdit уже нарисовался на экране.
Например на обработчики кнопок повесь.