Под NT работает прекрасно. Под Windows98 проект в неюникодной сборке позволяет набивать текст по русски, но при сохранении в файл и загрузке его обратно в контрол текст превращается в какие-то квадраты.
Что делать? Перекомпилировал под Юникод, но так он под 98 вообще не запускается!
Помогите, плиз!
Здравствуйте Снорк, Вы писали:
С>Кстати, попробовал брать DHTMLED.OCX из 2000, но тогда вообще ничего не работает.
С>Неужели никто с таким не сталкивался???
Сталкивался... Не далее как две недели назад... И из SDK (более ранняя версия) тоже затрахала — валится он :(
Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).
Здравствуйте kig, Вы писали:
kig>Здравствуйте Снорк, Вы писали:
С>>Кстати, попробовал брать DHTMLED.OCX из 2000, но тогда вообще ничего не работает.
С>>Неужели никто с таким не сталкивался???
kig>Сталкивался... Не далее как две недели назад... И из SDK (более ранняя версия) тоже затрахала — валится он
kig>Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).
Я retalik'а спросил, а что такое MSHTML Editing и как его юзать — не отвечает он. Может вы ответите?
А DHTMLED.OCX — суксь и маздай, я из-за него сегодня на презентации опозорился. Проект подвис на переводе контрола
из визуализации в едитинг, под миллениумом, причём жёстко завесил всю виндузу, хотя до того под 98 позволял себя дебагить на все лады.
И под XP — работало-работало, а потом бац — и перестало. Хотя бы знать, к чему это.
Здравствуйте Снорк, Вы писали:
С>Здравствуйте kig, Вы писали:
kig>>Здравствуйте Снорк, Вы писали:
С>>>Кстати, попробовал брать DHTMLED.OCX из 2000, но тогда вообще ничего не работает.
С>>>Неужели никто с таким не сталкивался???
kig>>Сталкивался... Не далее как две недели назад... И из SDK (более ранняя версия) тоже затрахала — валится он :(
kig>>Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).
С>Я retalik'а спросил, а что такое MSHTML Editing и как его юзать — не отвечает он. Может вы ответите? С>А DHTMLED.OCX — суксь и маздай, я из-за него сегодня на презентации опозорился. Проект подвис на переводе контрола С>из визуализации в едитинг, под миллениумом, причём жёстко завесил всю виндузу, хотя до того под 98 позволял себя дебагить на все лады.
С>И под XP — работало-работало, а потом бац — и перестало. Хотя бы знать, к чему это.
А ничего, если в Дельфи 6? Весь код дать не смогу.. т.к. все же не гоже обманывать работодателей, а вот помочь примерами кода и общим направлением, куда двигать — помогу.
Буду премного благодарен за любой пример.
Я концептуально в фишку въехать не могу.
Вот DHTMLED.OCX — обычный OLE Control, я написал тулбар у нему ЖКЧ, и управляю через DECMD_*, спасибо retalik'у за дефайны.
Через Get/SetDocHTML управляю, проблему с кириллицей решил так: вместо SetHTML я вызываю LoadDoc, так он ее всасывает без проблем.
Если б он ещё не подвисал, зараза...
А MSHTML — идея в чём? Тоже OLE Control, но другой? Мне в проекте надо визуализировать/редактировать HTML, а не размещать его на страничках в Вебе.
Здравствуйте Снорк, Вы писали:
С>Буду премного благодарен за любой пример. С>Я концептуально в фишку въехать не могу. С>Вот DHTMLED.OCX — обычный OLE Control, я написал тулбар у нему ЖКЧ, и управляю через DECMD_*, спасибо retalik'у за дефайны. С>Через Get/SetDocHTML управляю, проблему с кириллицей решил так: вместо SetHTML я вызываю LoadDoc, так он ее всасывает без проблем. С>Если б он ещё не подвисал, зараза...
С>А MSHTML — идея в чём? Тоже OLE Control, но другой? Мне в проекте надо визуализировать/редактировать HTML, а не размещать его на страничках в Вебе.
Да это те же самые яйца, только с боку :) Вот только не "падают". Пока :))
На самом деле, кажется с ишака 5.0 (хотя в MSDN указан ie4.0)
). Для подключения к любым событиям в 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;
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
Я сразу спрошу, хотя может в новом контексте это и не вопрос.
Я когда DHTMLED.OCX юзал, так и не нашёл, как выравнивать "кубиком" текст.
То есть, в HTML'е такого нет, DECMD_ALIGNWIDTH нет тоже.
А очень бы надо. Как такое сотворить?
Здравствуйте Снорк, Вы писали:
С>Впереди — ночь :crash: , надеюсь, разберусь :shuffle:.
С>Я сразу спрошу, хотя может в новом контексте это и не вопрос. С>Я когда DHTMLED.OCX юзал, так и не нашёл, как выравнивать "кубиком" :) текст. С>То есть, в HTML'е такого нет, DECMD_ALIGNWIDTH нет тоже. С>А очень бы надо. Как такое сотворить?
С>Огромное спасибище за помошь!!!
А попробуй команду JustifyFull. Хотя и написано, что Not currently supported, но чем черт не шутит? Вон, про Redo и Undo тоже самое написано, а выполняет. Правда у меня ie6.
Здравствуйте 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) Есть более лёгкий способ отслеживать апдейт для тулбара:
Но! В контекстном меню присутствует очень гадкая вещь — перевод окна в режим "чиста браузера". Как её отследить? Я не нашёл.
Без этого мой проект потерял бы смысл, т.к. основан на частом переводе в визуализационный/редактируемый режимы,
а потому, пришлось писать свою реализацию интерфейса IDocHostUIHandler, хотя я и переопределил лишь метод, отвечающий за контекстное меню.
Здравствуйте Снорк, Вы писали:
С>Здравствуйте 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) Есть более лёгкий способ отслеживать апдейт для тулбара:
С>
С>Но! В контекстном меню присутствует очень гадкая вещь — перевод окна в режим "чиста браузера". Как её отследить? Я не нашёл. С>Без этого мой проект потерял бы смысл, т.к. основан на частом переводе в визуализационный/редактируемый режимы, С>а потому, пришлось писать свою реализацию интерфейса IDocHostUIHandler, хотя я и переопределил лишь метод, отвечающий за контекстное меню.
С>То есть, дело вкуса, где ловить тулбарный апдейт.
А я даже по причине необходимости реализации IDocHostUIHandler — меню надо было, повторяющее тулбар — на это и не обращал внимания. Век живи, век учись. :)
Здравствуйте Serge Baltic, Вы писали:
SB>Здравствуйте kig, Вы писали:
kig>>Проблему решил переходом на MSHTML Editing и забыл про него (DHTMLED.OCX).
SB>Sorry, назрел вопрос: каким событием лучше ловить пользовательский ввод текста в этом самом DHTML?
Случайно сюда зашел и увидел вопрос. Ничего, что так поздно?
Мне кажется, вот это подойдет
интерфес IHTMLEditDesigner метод TranslateAccelerator
Выше по ветке разрисованно, как ловится таб. Точно не помню, но кажется IE туда вообще все события DHTML отправляет.