最近做个即时通讯软件,模仿QQ或者MSN的,但是遇到问题,聊天内容区域如何实现的?可以插入表情图片和文字的那个区域。
我想用WebBrowser来实现,发先即时消息呢,需要实时刷新。
听说是用richtextbox可以实现。有没有高人开发过的啊?
大家讨论一下啊。
我的其他界面都出来了,就是聊天内容窗体这里了。
我想用WebBrowser来实现,发先即时消息呢,需要实时刷新。
听说是用richtextbox可以实现。有没有高人开发过的啊?
大家讨论一下啊。
我的其他界面都出来了,就是聊天内容窗体这里了。
不想用的话,就用TRichView吧。插入图片很简单。我在用原始的RichEdit做,太累....
用TRichView?好的,我可以做个demo研究一下,如果方便,那就用这个了。但是我在想,用TRichView能否显示如msn的窗体里面提示的那段“单击此处查看与此联系人的全部对话记录”,然后下面有短横线,这个效果呢,点击还要显示全部聊天内容的窗体。
後來我也就用 WebBrowser 了。www.2ccc.com 上有個 TEditWebBrowser ,我是用那個來改的我在這裡感謝一下那個作者。希望有做過即時通訊的問題聊一下技術
//--------------------------------
procedure TForm2.Button5Click(Sender: TObject);
var
V: OleVariant;
h:WideString;
begin
V := WebBrowser1.Document;
//-------------------------------------------------------------------------
h := '<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312">'+
'<style type="text/css">*{padding:0;margin:0;;font:13px/20px Arial,Sans-serif,"宋体";color:#666666;}'+
'#tmpStyle{MARGIN: 0px;font-family: "宋体", "Times New Roman"; font-size: 9px;}'+
'.say{margin:0px;}'+
'#footer {margin-top:5px;margin-bottom:0px;border-top:1px solid #999999;border-bottom:0px;width:40px;}</style>'+
'<script language="JavaScript" type="text/javascript"> '+
' function addSay(){ '+
' var x=document.getElementById("listTable").insertRow(); '+
' var h1=x.insertCell(0); '+
' h1.innerHTML="<tr class=''say''><td width=''100%''>'+'寶兒 说:'+'</td></tr>"; '+
' }; '+
' function addCont(){ '+
' var y=document.getElementById("listTable").insertRow(); '+
' var h2=y.insertCell(0);'+
' h2.innerHTML="<tr><td width=''100%''><table height=''26px'' border=''0px'' width=''100%'' cellpadding=''0px'' cellspacing=''0px''>"+ '+
' "<tr><td width=''12px''></td><td style=''font-size:15px;color:#0000ff''>'+'测试'+'</td></tr></table></td></tr>";'+
' }; '+
' function addRow(){'+
' addSay(); '+
' addCont(); } '+
' </script></head><body> '+
' <a href="javascript:addRow();" style="color:#0000ff;text-indent:1em;">单击此处</a>查看与此联系人的全部对话记录'+
' <div id="footer"></div> '+
' <table id="listTable" border="0px" width="100%" cellpadding="0px" cellspacing="1px">'+
' <tr class="say"><td width="100%">寶兒 说:</td></tr> '+
' <tr><td width="100%"><table height="26px" border="0px" width="100%" cellpadding="0px" cellspacing="0px"> '+
' <tr><td width="12px"></td><td style="font-size:15px;color:#0000ff">测试说话内容啊</td></tr></table></td></tr> '+
' </table></body></html>';
//--------------------------------------------------------------------------
Memo1.Lines.Add(h);
V.Script.Document.Body.InnerHTML := h;
//WebBrowser1.OleObject.document.documentElement.innerHTML := h;
//Memo1.Lines.Add(h);
end;
//---------------------------
以上就是部分代码,当我点击WebBrowser1中的“单击此处”想要增加一条记录,结果就报“缺少对象”。谁能给个提示,怎么解决呢。ps:
TEditWebBrowser和TRichView看来也是很好的选择。最好用的或者说最好控制的应该是哪个呢?
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('about:blank');//这种方式,上面代码产生的样式和脚本都不能得到使用
WebBrowser1.Navigate('D:\CallCenter\rrrrr\chat\eee.html');//这样直接加载一个页面没问题
end;那么如何让WebBrowser1.Navigate('about:blank');这种方式,动态产生的页面里面的样式和脚本都能得到正确解析和使用呢?
WebBrowser1.OleObject.Document.parentWindow.execScript('addRow()', 'javascript');
为什么不能这样使用呢,如果也面不是动态产生而是加载的则可以正常执行,现在不行。为什么呢
1、初始化WebBrowser1有两种方式,如下,第一种自然是动态创建html,第二种自然就是已经有一个页面,然后再对源码操作。
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('about:blank');//方式一
WebBrowser1.Navigate('d:\test.html');//方式二
end;2、调用页面脚本的执行如下:
procedure TForm2.Button4Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.parentWindow.execScript('addRow()', 'javascript');
end;总结:
如果用了【方式一】初始化,则调用动态产生的html的里面的脚本会报错,提示“缺少对象”。
如果采用了【方式二】初始化,则调用的页面里面的脚本没有问题,哪怕脚本部分是动态添加的也没问题,也就是说这个页面存在即可。我的问题就是,必须用【方式一】初始化,那么,如何解决这个“缺少对象”的错误呢???!!!
ps:以上代码可以直接调试。