DHTML edit control for IE 5.5
От: Снорк  
Дата: 27.06.02 15:13
Оценка:
Чушь какая-то!

Под NT работает прекрасно. Под Windows98 проект в неюникодной сборке позволяет набивать текст по русски, но при сохранении в файл и загрузке его обратно в контрол текст превращается в какие-то квадраты.

Что делать? Перекомпилировал под Юникод, но так он под 98 вообще не запускается!
Помогите, плиз!
Re: DHTML edit control for IE 5.5
От: Снорк  
Дата: 29.06.02 12:37
Оценка:
Кстати, попробовал брать DHTMLED.OCX из 2000, но тогда вообще ничего не работает.

Неужели никто с таким не сталкивался???
Re[2]: DHTML edit control for IE 5.5
От: kig Россия  
Дата: 29.06.02 15:53
Оценка:
Здравствуйте Снорк, Вы писали:

С>Кстати, попробовал брать DHTMLED.OCX из 2000, но тогда вообще ничего не работает.


С>Неужели никто с таким не сталкивался???


Сталкивался... Не далее как две недели назад... И из SDK (более ранняя версия) тоже затрахала — валится он :(

Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).
Re[3]: DHTML edit control for IE 5.5
От: Снорк  
Дата: 01.07.02 09:00
Оценка:
Здравствуйте kig, Вы писали:

kig>Здравствуйте Снорк, Вы писали:


С>>Кстати, попробовал брать DHTMLED.OCX из 2000, но тогда вообще ничего не работает.


С>>Неужели никто с таким не сталкивался???


kig>Сталкивался... Не далее как две недели назад... И из SDK (более ранняя версия) тоже затрахала — валится он


kig>Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).


Я retalik'а спросил, а что такое MSHTML Editing и как его юзать — не отвечает он. Может вы ответите?
А DHTMLED.OCX — суксь и маздай, я из-за него сегодня на презентации опозорился. Проект подвис на переводе контрола
из визуализации в едитинг, под миллениумом, причём жёстко завесил всю виндузу, хотя до того под 98 позволял себя дебагить на все лады.

И под XP — работало-работало, а потом бац — и перестало. Хотя бы знать, к чему это.
Re[4]: DHTML edit control for IE 5.5
От: kig Россия  
Дата: 01.07.02 14:42
Оценка:
Здравствуйте Снорк, Вы писали:

С>Здравствуйте kig, Вы писали:


kig>>Здравствуйте Снорк, Вы писали:


С>>>Кстати, попробовал брать DHTMLED.OCX из 2000, но тогда вообще ничего не работает.


С>>>Неужели никто с таким не сталкивался???


kig>>Сталкивался... Не далее как две недели назад... И из SDK (более ранняя версия) тоже затрахала — валится он :(


kig>>Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).


С>Я retalik'а спросил, а что такое MSHTML Editing и как его юзать — не отвечает он. Может вы ответите?

С>А DHTMLED.OCX — суксь и маздай, я из-за него сегодня на презентации опозорился. Проект подвис на переводе контрола
С>из визуализации в едитинг, под миллениумом, причём жёстко завесил всю виндузу, хотя до того под 98 позволял себя дебагить на все лады.

С>И под XP — работало-работало, а потом бац — и перестало. Хотя бы знать, к чему это.


А ничего, если в Дельфи 6? Весь код дать не смогу.. т.к. все же не гоже обманывать работодателей, а вот помочь примерами кода и общим направлением, куда двигать — помогу.
Re[5]: DHTML edit control for IE 5.5
От: Снорк  
Дата: 02.07.02 04:16
Оценка:
Буду премного благодарен за любой пример.
Я концептуально в фишку въехать не могу.
Вот DHTMLED.OCX — обычный OLE Control, я написал тулбар у нему ЖКЧ, и управляю через DECMD_*, спасибо retalik'у за дефайны.
Через Get/SetDocHTML управляю, проблему с кириллицей решил так: вместо SetHTML я вызываю LoadDoc, так он ее всасывает без проблем.
Если б он ещё не подвисал, зараза...

А MSHTML — идея в чём? Тоже OLE Control, но другой? Мне в проекте надо визуализировать/редактировать HTML, а не размещать его на страничках в Вебе.
Re[6]: DHTML edit control for IE 5.5
От: kig Россия  
Дата: 02.07.02 08:19
Оценка: 17 (2)
Здравствуйте Снорк, Вы писали:

С>Буду премного благодарен за любой пример.

С>Я концептуально в фишку въехать не могу.
С>Вот DHTMLED.OCX — обычный OLE Control, я написал тулбар у нему ЖКЧ, и управляю через DECMD_*, спасибо retalik'у за дефайны.
С>Через Get/SetDocHTML управляю, проблему с кириллицей решил так: вместо SetHTML я вызываю LoadDoc, так он ее всасывает без проблем.
С>Если б он ещё не подвисал, зараза...

С>А MSHTML — идея в чём? Тоже OLE Control, но другой? Мне в проекте надо визуализировать/редактировать HTML, а не размещать его на страничках в Вебе.


Да это те же самые яйца, только с боку :) Вот только не "падают". Пока :))

На самом деле, кажется с ишака 5.0 (хотя в MSDN указан ie4.0)


HRESULT IHTMLDocument2::get_designMode(BSTR *p);
HRESULT IHTMLDocument2::put_designMode(BSTR v);


где

On — Document can be edited.
Off | Inherit — Default. Document cannot be edited.

Посредством этого WebBrowser-control (тоже OCX) переводится в режим редактирования. А далее все очень похоже на DHTMLEd. (Может тебе в процессе еще и это пригодится
Подключение к событиям объектной модели DHTML при использовании WebBrowser-control
Автор(ы): Тимофей Чадов
). Для подключения к любым событиям в WebBrowser-control тебе так же может понадобится имплементация IHTMLEditDesigner. Там всего четыре метода. Вот пример (правда на Д), мне надо было изменить поведение при tab и shift-tab, что бы фокус перемещался на другие контролы в Дельфи, а не скакал внутри WebBrowser-control:


function TCSMMSHTMLEdit.TranslateAccelerator(inEvtDispId: Integer; const pIEventObj: IHTMLEventObj): HResult;
begin
  Result := S_FALSE;
  if (inEvtDispId = csmIDEvent_onkeydown) and (pIEventObj.keyCode = 9) and (not pIEventObj.altKey) and (not pIEventObj.ctrlKey) then
  begin
    pIEventObj.cancelBubble := True;
    TCSMCustomWinControl(GetParentForm(Self)).NextFocused(Self, not pIEventObj.shiftKey);
    Result := S_OK;
  end
  else if Assigned(FOnTranslateAccelerator) then
    Result := FOnTranslateAccelerator(inEvtDispId, pIEventObj);
end;


Методом тыка подключать имплементацию этого интерфейса мне пришлось два раза (версия ie6.0.2600.0000). Почему так, не знаю. Отключать симметрично, тоже два раза. Сделано было так:


procedure TCSMMSHTMLEdit.SetDesignMode(Value: Boolean);
var
  ihd: IHTMLDocument2;
  ihes: IHTMLEditServices;
begin
  if (Value or Completed) and (not (csDestroying in ComponentState))then
  begin
    if not Assigned(Document) then AssignDocument;
    ihd := Document as IHTMLDocument2;
    if (Value <> (ihd.designMode = 'On')) then
    begin
      Succeeded((ihd as IServiceProvider).QueryService(SID_SHTMLEDITSERVICES, IID_IHTMLEditServices, ihes));
      if Value then
      begin
        ihd.designMode := 'On';
        Succeeded(ihes.AddDesigner(FEditDesigner));
        ihd := Document as IHTMLDocument2;
        Succeeded((ihd as IServiceProvider).QueryService(SID_SHTMLEDITSERVICES, IID_IHTMLEditServices, ihes));
        ihd.designMode := 'On';
        Succeeded(ihes.AddDesigner(FEditDesigner));
        if (FCSMMSHTMLEditorContainer <> nil) then
          FCSMMSHTMLEditorContainer.Turn(True);
      end
      else
      begin
        ihd.designMode := 'Off';
        Succeeded(ihes.RemoveDesigner(FEditDesigner));
        ihd.designMode := 'Off';
        Succeeded(ihes.RemoveDesigner(FEditDesigner));
        if (FCSMMSHTMLEditorContainer <> nil) then
          FCSMMSHTMLEditorContainer.Turn(False);
      end;
    end;
  end;
end;



Для исполнения команд можно пользовать


HRESULT execCommand(
    BSTR cmdID,
    VARIANT_BOOL showUI,
    VARIANT value,
    VARIANT_BOOL *pfRet
);


примерно таким образом (смена фонта):


procedure TCSMMSHTMLEditorContainer.cmbxFontNamesChange(Sender: TObject);
var
  ihd: IHTMLDocument2;
begin
  ihd := TCSMMSHTMLEdit(Self.Owner).Document as IHTMLDocument2;
  if ihd <> nil then
    ihd.execCommand('FontName', False, TComboBox(Sender).Text);
  Windows.SetFocus(TCSMMSHTMLEdit(Self.Owner).Handle);
end;


Где найти в MSDN cписок всех команд я давал в предыдущей ветке (где retalik говорил). Там же описание MSHTML Editing.

И последнее. Для изменения состояния тулбара (там кнопки вдавить, задисейблить или заенейблить) — надо имплементить IDocHostUIHandler и ловить


HRESULT UpdateUI(VOID);


Вот приметно как было реализовано:


function TCSMMSHTMLEdit.UpdateUI: HRESULT;
var
  i: Integer;
  a: TAction;
  ihd: IHTMLDocument2;
  command: WideString;
begin
  if Assigned(Document) and DesignMode and (FCSMMSHTMLEditorContainer <> nil) then begin
    ihd := Document as IHTMLDocument2;
    if (Modified) then
      FCSMMSHTMLEditorContainer.StatusBar.Panels[0].Text := 'Modified'
    else FCSMMSHTMLEditorContainer.StatusBar.Panels[0].Text := '';
    if (ihd.queryCommandValue('OverWrite')) then
      FCSMMSHTMLEditorContainer.StatusBar.Panels[1].Text := 'Overwrite'
    else FCSMMSHTMLEditorContainer.StatusBar.Panels[1].Text := 'Insert';
    for i := 0 to FCSMMSHTMLEditorContainer.actlsMenu.ActionCount - 1 do begin
      a := TAction(FCSMMSHTMLEditorContainer.actlsMenu.Actions[i]);
      if a.Tag > 0 then begin
        command := TCSMMSHTMLEdit.GetCommandName(a);
        a.Enabled := ihd.queryCommandEnabled(command);
        if (a.Tag = 2) then begin
          if (not ihd.queryCommandIndeterm(command)) then
            a.Checked := ihd.queryCommandState(command);
        end;
      end;
    end;
    if (ihd.queryCommandValue('FontName') <> null) then begin
      FCSMMSHTMLEditorContainer.cmbxFontNames.ItemIndex := FCSMMSHTMLEditorContainer.cmbxFontNames.Items.IndexOf(ihd.queryCommandValue('FontName'));
      FCSMMSHTMLEditorContainer.cmbxFontNames.Enabled := ihd.queryCommandEnabled('FontName');
    end
    else FCSMMSHTMLEditorContainer.cmbxFontNames.ItemIndex := -1;
    if (ihd.queryCommandValue('FontSize') <> null) then begin
      FCSMMSHTMLEditorContainer.cmbxFontSizes.ItemIndex := StrToInt(ihd.queryCommandValue('FontSize')) - 1;
      FCSMMSHTMLEditorContainer.cmbxFontSizes.Enabled := ihd.queryCommandEnabled('FontSize');
    end
    else FCSMMSHTMLEditorContainer.cmbxFontSizes.ItemIndex := -1;
    Result := S_OK;
  end
  else Result := inherited UpdateUI;
end;



Все описано В MSDN (старый, не нетовский):
Platform SDK/Web development/Internet development SDK/MSHTML Editing

Удачи ;)
Re[7]: DHTML edit control for IE 5.5
От: Снорк  
Дата: 02.07.02 09:10
Оценка:
Впереди — ночь , надеюсь, разберусь .

Я сразу спрошу, хотя может в новом контексте это и не вопрос.
Я когда DHTMLED.OCX юзал, так и не нашёл, как выравнивать "кубиком" текст.
То есть, в HTML'е такого нет, DECMD_ALIGNWIDTH нет тоже.
А очень бы надо. Как такое сотворить?

Огромное спасибище за помошь!!!
Re[8]: DHTML edit control for IE 5.5
От: kig Россия  
Дата: 02.07.02 11:10
Оценка:
Здравствуйте Снорк, Вы писали:

С>Впереди — ночь :crash: , надеюсь, разберусь :shuffle:.


С>Я сразу спрошу, хотя может в новом контексте это и не вопрос.

С>Я когда DHTMLED.OCX юзал, так и не нашёл, как выравнивать "кубиком" :) текст.
С>То есть, в HTML'е такого нет, DECMD_ALIGNWIDTH нет тоже.
С>А очень бы надо. Как такое сотворить?

С>Огромное спасибище за помошь!!!


А попробуй команду JustifyFull. Хотя и написано, что Not currently supported, но чем черт не шутит? Вон, про Redo и Undo тоже самое написано, а выполняет. Правда у меня ie6.
Re[9]: DHTML edit control for IE 5.5
От: Снорк  
Дата: 04.07.02 13:58
Оценка: 15 (2)
Здравствуйте kig, Вы писали:

kig>Здравствуйте Снорк, Вы писали:


С>>Впереди — ночь , надеюсь, разберусь .


С>>Я сразу спрошу, хотя может в новом контексте это и не вопрос.

С>>Я когда DHTMLED.OCX юзал, так и не нашёл, как выравнивать "кубиком" текст.
С>>То есть, в HTML'е такого нет, DECMD_ALIGNWIDTH нет тоже.
С>>А очень бы надо. Как такое сотворить?

С>>Огромное спасибище за помошь!!!


kig>А попробуй команду JustifyFull. Хотя и написано, что Not currently supported, но чем черт не шутит? Вон, про Redo и Undo тоже самое написано, а выполняет. Правда у меня ie6.


Еще раз спасибо! Проект запахал.
Появились некоторые замечания.
1) JustifyFull работает, и делает это вставляя тэг <P ALIGN = JUSTIFY></P>
2) Если верить MSDN'у, то и put_(get_)designMode — тоже not supported.
3) Есть более лёгкий способ отслеживать апдейт для тулбара:

BEGIN_EVENTSINK_MAP(CPage3, CPropertyPage)
    //{{AFX_EVENTSINK_MAP(CPage3)
    ON_EVENT(CPage3, IDC_EXPLORER1, 259 /* DocumentComplete */, OnDocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)
    ON_EVENT(CPage3, IDC_EXPLORER1, 105 /* CommandStateChange */, OnCommandStateChangeExplorer1, VTS_I4 VTS_BOOL)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CMyDlg::OnCommandStateChangeExplorer1(long Command, BOOL Enable) 
{
  // Вызов Update'а для тулбара, который инициирует вызов OnUpdate для каждого батона
  m_wndToolBar.OnUpdateCmdUI((CFrameWnd*) this, TRUE);    
}


Но! В контекстном меню присутствует очень гадкая вещь — перевод окна в режим "чиста браузера". Как её отследить? Я не нашёл.
Без этого мой проект потерял бы смысл, т.к. основан на частом переводе в визуализационный/редактируемый режимы,
а потому, пришлось писать свою реализацию интерфейса IDocHostUIHandler, хотя я и переопределил лишь метод, отвечающий за контекстное меню.

То есть, дело вкуса, где ловить тулбарный апдейт.
Re[10]: DHTML edit control for IE 5.5
От: kig Россия  
Дата: 04.07.02 18:07
Оценка:
Здравствуйте Снорк, Вы писали:

С>Здравствуйте kig, Вы писали:


kig>>Здравствуйте Снорк, Вы писали:


С>>>Впереди — ночь :crash: , надеюсь, разберусь :shuffle:.


С>>>Я сразу спрошу, хотя может в новом контексте это и не вопрос.

С>>>Я когда DHTMLED.OCX юзал, так и не нашёл, как выравнивать "кубиком" :) текст.
С>>>То есть, в HTML'е такого нет, DECMD_ALIGNWIDTH нет тоже.
С>>>А очень бы надо. Как такое сотворить?

С>>>Огромное спасибище за помошь!!!


kig>>А попробуй команду JustifyFull. Хотя и написано, что Not currently supported, но чем черт не шутит? Вон, про Redo и Undo тоже самое написано, а выполняет. Правда у меня ie6.


С>Еще раз спасибо! Проект запахал.

С>Появились некоторые замечания.
С>1) JustifyFull работает, и делает это вставляя тэг <P ALIGN = JUSTIFY></P>
С>2) Если верить MSDN'у, то и put_(get_)designMode — тоже not supported.
С>3) Есть более лёгкий способ отслеживать апдейт для тулбара:

С>
С>BEGIN_EVENTSINK_MAP(CPage3, CPropertyPage)
С>    //{{AFX_EVENTSINK_MAP(CPage3)
С>    ON_EVENT(CPage3, IDC_EXPLORER1, 259 /* DocumentComplete */, OnDocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)
С>    ON_EVENT(CPage3, IDC_EXPLORER1, 105 /* CommandStateChange */, OnCommandStateChangeExplorer1, VTS_I4 VTS_BOOL)
С>    //}}AFX_EVENTSINK_MAP
С>END_EVENTSINK_MAP()

С>void CMyDlg::OnCommandStateChangeExplorer1(long Command, BOOL Enable) 
С>{
С>  // Вызов Update'а для тулбара, который инициирует вызов OnUpdate для каждого батона
С>  m_wndToolBar.OnUpdateCmdUI((CFrameWnd*) this, TRUE);    
С>}
С>


С>Но! В контекстном меню присутствует очень гадкая вещь — перевод окна в режим "чиста браузера". Как её отследить? Я не нашёл.

С>Без этого мой проект потерял бы смысл, т.к. основан на частом переводе в визуализационный/редактируемый режимы,
С>а потому, пришлось писать свою реализацию интерфейса IDocHostUIHandler, хотя я и переопределил лишь метод, отвечающий за контекстное меню.

С>То есть, дело вкуса, где ловить тулбарный апдейт.


А я даже по причине необходимости реализации IDocHostUIHandler — меню надо было, повторяющее тулбар — на это и не обращал внимания. Век живи, век учись. :)
Re[11]: DHTML edit control for IE 5.5
От: Снорк  
Дата: 05.07.02 08:47
Оценка:


Re[3]: DHTML edit control for IE 5.5
От: Serge Baltic Россия  
Дата: 03.08.02 17:52
Оценка:
Здравствуйте kig, Вы писали:

kig>Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).


Sorry, назрел вопрос: каким событием лучше ловить пользовательский ввод текста в этом самом DHTML?
(H) Serge
Re[4]: DHTML edit control for IE 5.5
От: kig Россия  
Дата: 27.08.02 18:21
Оценка:
Здравствуйте Serge Baltic, Вы писали:

SB>Здравствуйте kig, Вы писали:


kig>>Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).


SB>Sorry, назрел вопрос: каким событием лучше ловить пользовательский ввод текста в этом самом DHTML?


Случайно сюда зашел и увидел вопрос. Ничего, что так поздно?

Мне кажется, вот это подойдет

интерфес IHTMLEditDesigner метод TranslateAccelerator

Выше по ветке разрисованно, как ловится таб. Точно не помню, но кажется IE туда вообще все события DHTML отправляет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.