Utop大侠请进来拿分! ( 积分: 100 )

  • 主题发起人 主题发起人 9278707
  • 开始时间 开始时间
9

9278707

Unregistered / Unconfirmed
GUEST, unregistred user!
按你的方法,“不支持此接口”的问题已解决,再次表示感谢!
但现在又有了个新问题,我在DHTMLEdit中插入一Flash时(只限本机,http的没问题),在访问DHTMLEdit.DOM时提示“灾难性错误”错误,加上OleCtnrs单元,依然不能解决,为什么?
 
按你的方法,“不支持此接口”的问题已解决,再次表示感谢!
但现在又有了个新问题,我在DHTMLEdit中插入一Flash时(只限本机,http的没问题),在访问DHTMLEdit.DOM时提示“灾难性错误”错误,加上OleCtnrs单元,依然不能解决,为什么?
 
问题解决了。
还想问一下,ActivexForm中DHTMLEdit无法接受键盘的delete,backspace,Ctrl+c,Ctrl+v等操作应如何处理
 
好,帮顶



--------签名档---------------------------

比肩国内顶尖源码下载站点 -> 源码我爱你

http://www.source520.com
http://www.source520.net

80G源码电子书免费免注册下载,大量精辟技术文档库随时更新
******************************************************************
附:为了站点持续发展,现有本站近年来收藏的大量大型商业源码低价出售,
详情请进入以下链接查看:
http://www.source520.com/building_delphi.htm

浏览商业代码请从如下URL进入查看实物:
1.商业源码库1: ftp://source520see3:browse@61.152.199.245/
2.商业源码库2: ftp://source520see2:browse@61.152.199.245/
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, [red]ActiveX[/red], DHTMLEDLib_TLB;

type
TForm1 = class(TForm)
DHTMLEdit1: TDHTMLEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
aEditWndProc: TWndMethod;
procedure HtmleditWndProc(var Message: TMessage);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.HtmleditWndProc(var Message: TMessage);
var
WinMsg: TMsg;
iOIPAO: IOleInPlaceActiveObject;
aDispatch: IDispatch;
begin
with DHTMLEdit1 do //
if (Message.Msg >= CN_BASE + WM_KEYFIRST) and (Message.Msg <= CN_BASE + WM_KEYLAST) then begin
WinMsg.HWnd := Handle;
WinMsg.Message := Message.Msg - CN_BASE;
WinMsg.WParam := Message.WParam;
WinMsg.LParam := Message.LParam;
WinMsg.Time := GetMessageTime;
WinMsg.Pt.X := $115DE1F1;
WinMsg.Pt.Y := $115DE1F1;
if not VarIsEmpty(OleObject) then begin
if (WinMsg.message = wm_keydown) and (WinMsg.wParam = vk_tab) then begin
///deal with tab;
end else begin //解决快捷键冲突问题
aDispatch := OleObject;
aDispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO.TranslateAccelerator(WinMsg) = s_ok then begin
Message.Result := 1;
Exit;
end else if ((WinMsg.message = wm_keydown) or (WinMsg.message = wm_keyup))
and ((WinMsg.wParam = vk_back) or
(WinMsg.wParam = vk_left) or (WinMsg.wParam = vk_Right) or
(WinMsg.wParam = vk_up) or (WinMsg.wParam = vk_down)) then begin
// nothing
Message.Result := 1;
Exit;
//***************如果输入字符或回车则不作处理
end else if (WinMsg.message = WM_CHAR) or
(((WinMsg.message = wm_keydown) or (WinMsg.message = wm_keyup)) and
(WinMsg.wParam = VK_RETURN)) then
Exit;
//***************
end;
end;
end;
if Assigned(aEditWndProc) then
aEditWndProc(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with DHTMLEdit1 do begin
aEditWndProc := WindowProc;
WindowProc := HtmleditWndProc;
end;
end;

initialization
OleInitialize(nil)
//解决 Ctrl+c、Ctrl+x和拖放 的问题

finalization
try
OleUnInitialize;
except
end;


end.

===============
代码主要来自我的同事sweetgun
htmledit 还是挺烦的,时常会出一些奇怪的问题,呵呵
 
还有 DHTMLEDLib_TLB.pas 也要改一下
procedure TDHTMLEdit.CreateControl;

procedure DoCreate;
begin
FIntf := IUnknown(OleObject) as IDHTMLEdit;
// sweetgun
FIntf._AddRef
// 防止程序退出的时候出现异常:好像是delphi释放对象两次
end;

begin
if FIntf = nil then DoCreate;
end;
 
utop大侠你的代码在activexform中还是行不通
好象在ie5.0以下的应用程序中dhtmledit会不支持快捷键操作,以上的版本即使不加入消息的处理也能够响应快捷键,但是在activexform中不行。
能否占用你一些时间帮我看看,我真的很急
 
不好意思之前没在activexform中测过,昨晚试了试,暂时没有找到办法,怀疑是delphi封装 ActiveX 的问题,因为htmledit 本身也是ActiveX,消息处理过程乱掉了。看有没有熟悉ActiveX的兄弟能解决~
 
问题虽然还没解决但是还是特别感谢utop大侠
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
922
SUNSTONE的Delphi笔记
S
后退
顶部