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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.042 c
1-1123106623
pOLyMOrpH
2005-08-04 02:03
2005.08.28
Компоненты в run-time


1-1123650757
gma
2005-08-10 09:12
2005.08.28
Проблема с FastReport


14-1122917306
Starcom
2005-08-01 21:28
2005.08.28
Своя прога для обновления прошивки CD/DVD-R/RW?


3-1121339475
ks
2005-07-14 15:11
2005.08.28
Изменение даных в TQuery


3-1121353211
Juice
2005-07-14 19:00
2005.08.28
События Interbase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский