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

Вниз

HTML Редактор от Microsoft   Найти похожие ветки 

 
Алексей Петухов   (2005-07-23 21:01) [0]

Здравствуйте, уважаеме мастера.
Вот пытаюсь работать с 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;

Помогите, чем можете :-)
А то я скоро кипятком писать начну :-)


 
Алексей Петухов   (2005-07-23 21:04) [1]

Извините, добавлю:

...Хотя если используется одна форма в проекте, на которую кладем пресловутый TDHTML, то отрабатывает без ошибок....


 
Алексей Петухов   (2005-07-24 12:34) [2]

Есть предположения?


 
lookin ©   (2005-07-24 12:55) [3]

>>На первой форме кликаем кнопочку
>>procedure TForm1.Button1Click(Sender: TObject);
>>begin
>> Form2:=TForm2.Create(nil);
>> Form2.ShowModal;
>> Form2.Free;
>>end;

>>на второй форме DHTMLEdit1:TDHTMLEdit

Не понял, а где на второй форме этот Едит?


 
Алексей Петухов   (2005-07-25 08:35) [4]


> Не понял, а где на второй форме этот Едит?

Прям на форме Form2.


 
Алексей Петухов   (2005-07-26 17:35) [5]

Кто - нибудь? Помогите, пожалуйста.


 
Term ©   (2005-07-26 17:46) [6]


> Form2.Free;

всё правильно, я бы тоже кричал

> получаем "Access Violation"


 
Term ©   (2005-07-26 17:46) [7]


> Form2.Free;

почитай про то что происходит с объектом в этом случае


 
Джо ©   (2005-07-26 17:57) [8]


> И если на второй форме срабатывает какое либо обращение
> к DHTMLEdit1.DOM

Приведи код этого обращения.


 
Term ©   (2005-07-26 18:05) [9]

хотя да чтото он темнит приведи как код, а то чтото невразумительное складывается


 
Плохиш ©   (2005-07-26 18:27) [10]

Form2.Release; ?


 
Алексей Петухов   (2005-07-26 18:30) [11]

Ну например:

DHTMLEdit1.DOM.charset:="windows-1251";
или (в событии onmouseup)
html:=DHTMLEdit1.DOM.parentWindow.event.srcElement.outerHTML;

П.С. Да не темню я. Просто не хотел заморачивать Вас "лишней" информацией.
П.С.№2. Может - ну его - этот TDHTMLEdit? Посоветуйте пожалйста другую компоненту с такой-же функциональностью.


 
Алексей Петухов   (2005-07-26 18:33) [12]


> Form2.Release; ?

Не помогает


 
Джо ©   (2005-07-26 18:37) [13]


>  [12] Алексей Петухов   (26.07.05 18:33)
> Не помогает

[8] Джо ©   (26.07.05 17:57)


 
Алексей Петухов   (2005-07-26 18:42) [14]

Не понял Вас Джо.


 
Term ©   (2005-07-26 18:43) [15]


> Не помогает

от того что ты приводиш кусками, тебе тоже советы будут давать кусками.

> procedure TForm1.Button1Click(Sender: TObject);
> begin
>  Form2:=TForm2.Create(nil);
>  Form2.ShowModal;
>  Form2.Free;
> end;

как я понял ты хочеш чтобы форма уничтожилась после закрытия
так для этого можно использовать Action:=caFree в событии OnClose, или я чтото не понял. Скажи какой рез-т хочеш получить


 
Джо ©   (2005-07-26 18:45) [16]


>  [14] Алексей Петухов   (26.07.05 18:42)
> Не понял Вас Джо.

Вы пишете
> И если на второй форме срабатывает какое либо обращение
> к DHTMLEdit1.DOM
Я ответил, в [8] посте:
> Приведи код этого обращения.
Что непонятного?


 
Алексей Петухов   (2005-07-26 18:48) [17]

1) Я хочу чтобы форма закрылаь без Exeption-ов.
2) Весь код, необходимый для осмысления проблемы, приведен в [1]
3) Вообще задача - элементарный редактор HTML с минимальным набором опций.


 
Алексей Петухов   (2005-07-26 18:49) [18]

To
> Джо ©   (26.07.05 18:45) [16]

смотри пункт [11]


 
Джо ©   (2005-07-26 18:50) [19]


>  [17] Алексей Петухов   (26.07.05 18:48)
> 2) Весь код, необходимый для осмысления проблемы, приведен
> в [1]

Если так уверен, осмысливай... Причем здесь тогда форум? Здесь же не гадалки собираются, а программисты.


 
Джо ©   (2005-07-26 18:51) [20]


>  [18] Алексей Петухов   (26.07.05 18:49)

Сорри, у меня что-то клиент глюкнул, не показал [11]. Сейчас гляну.


 
Алексей Петухов   (2005-07-26 18:53) [21]


> Джо ©   (26.07.05 18:50) [19]

Не расстраивайтесь. Я не хотел Вас обидеть.


 
Алексей Петухов   (2005-07-26 18:56) [22]

Вот еще обращение (к вопросу [8][9]):
OleVariant(heEditor.DOM.selection.createRange).pasteHTML("<a href="""+s+""">Перейти на "+s+"</a>");


 
pasha_golub ©   (2005-07-26 19:11) [23]

А ежели так?

Application.CreateForm();


 
Джо ©   (2005-07-26 19:12) [24]

Черт его знает, у меня уже любое обращение к DHTMLEdit1.DOM вызывает "Catastrophic failure" внезависимости от места вызова.


 
pasha_golub ©   (2005-07-26 19:16) [25]

А может этот самый DOM (Document Object Model) создавать и заполянть надобно?


 
Джо ©   (2005-07-26 19:18) [26]


>  [25] pasha_golub ©   (26.07.05 19:16)

Так отож. Хто его знает. В отладчике пока гоняю, там черт ногу сломит, когда он должен создаваться. DefaultInterface вроде создан - а дальше - темный лес. Никак не вникну :(


 
Алексей Петухов   (2005-07-26 20:26) [27]


> любое обращение к DHTMLEdit1.DOM вызывает "Catastrophic
> failure"

Попробуй обращаться к DOM только после того, как DHTMLEdit уже нарисовался на экране.
Например на обработчики кнопок повесь.


 
Джо ©   (2005-07-26 20:29) [28]


>  [27] Алексей Петухов   (26.07.05 20:26)

Пробовал и так, разумеется. Но больше не буду - снес к чертовой матери этот самый ActiveX из пакетов. Из-за него Делфи стала некорректно этот пакет грузить. Так что - извини, помочь не смогу :0)


 
Алексей Петухов   (2005-07-27 09:18) [29]

Что-же делать?
Может все-таки есть подобные компоненты?


 
Amido   (2005-07-27 10:53) [30]

"3) Вообще задача - элементарный редактор HTML с минимальным набором опций."
Вот вам и редактор:
//...
EmbeddedWb1.go(ExtractFileDir(ParamStr(0))+"\test.html");
while Embeddedwb1.Busy do
 Application.ProcessMessages;
(EmbeddedWB1.document as IHTMLDocument2).designMode := "On";
//...


 
Алексей Петухов   (2005-07-27 14:17) [31]

А что такое EmbeddedWb1?


 
Amido   (2005-07-27 15:18) [32]

Посетите:
http://www.euromind.com/iedelphi/


 
Amido   (2005-07-27 15:55) [33]

А если уж совсем просто (и быстро) хотите слелать "элементарный редактор 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


 
Алексей Петухов   (2005-07-28 20:26) [34]

А есть ли у 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);

Очень надо :-)


 
Джо ©   (2005-07-28 20:57) [35]


> [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;


 
Amido   (2005-07-29 10:35) [36]

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-31 17:03) [37]

Большое спасибо за помощь.
Буду пробовать.


> Amido   (29.07.05 10:35) [36]


А где можно почитать описание метода Doc.execCommand и его параметров?


 
Алексей Петухов   (2005-07-31 18:17) [38]

И еще:
1. Как получить атрибуты шрифта выделенного текста?
2. Как сделать обработчик собылия OnMouseUp?
3. Как определить редактировалось ли содержание (onChange)?
4. как определить текущий (под курсором) таг (аналогично DHTMLEdit.DOM.parentWindow.event.srcElement;)

Заранее благодарю.


 
Алексей Петухов   (2005-08-01 13:38) [39]

Есть предложения


 
Admido   (2005-08-01 13:48) [40]

Алексей Петухов   (31.07.05 17:03) [37]
"А где можно почитать описание метода Doc.execCommand и его параметров?"
Вот тут:

http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/document2/execcommand.asp


 
Admido   (2005-08-01 13:55) [41]

И еще тут сможете найти много полезной информации:
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 14:30) [42]

Алексей Петухов   (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;


 
Алексей Петухов   (2005-08-02 06:23) [43]

Большое спасибо Admido.

Немного расслабился и то-же улыбнулся. :-)
Можно сказать впервые наткнулся на проблему, которую действительно надо решать (очень мало информации и опыт других собирается по крупицам).


 
Алексей Петухов   (2005-08-05 17:30) [44]

Еще один вопросик "в догонку".

Никак не пойму - как побороть сообщение "Этот документ изменился. Сохнанить изменения?"

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-06 19:32) [45]

Помогите с последним вопросом, пожалуйста.


 
Amido ©   (2005-08-08 10:52) [46]

Вот и ответик "в догонку" :)

Сам с етой проблемой столкнулся, а решается она довольно таки просто. Перед открытием документа необходимо просто поставить 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;



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

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

Наверх




Память: 0.59 MB
Время: 0.134 c
14-1123239992
12DFBDDh
2005-08-05 15:06
2005.08.28
С днем железнодорожника!


3-1121249815
Stanislav
2005-07-13 14:16
2005.08.28
ADOCommand Асинхронное выполнение


1-1123520853
Galiaf
2005-08-08 21:07
2005.08.28
Управление питанием.


1-1123429873
BackGround
2005-08-07 19:51
2005.08.28
Socket.Data


3-1121768946
Sour
2005-07-19 14:29
2005.08.28
Подключение к MySQL