重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这种东西,专业点的一般是用数据库来储存聊天记录。。如果你不想用。。可以每次收到消息的时候,先将原richtextbox.text的内容存入一个变量。。然后追加内容。。。
成都创新互联长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为秭归企业提供专业的成都网站设计、成都网站制作、外贸网站建设,秭归网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。
首先你需要写大概1000000000000000000个If语句,只要if语句覆盖了所有人可能说出来的话就可以了,比如:
If text1.text = "现在多少点了" then
label1.caption="现在是北京时间:" time
else
if text1.text="现在几点了"then
label1.caption="现在是:" time
else
......
end if
end if
当然,这个方法是不可行的。
想做一和电脑聊天的软件当然可能,但是想让电脑自己组织语言,这100%不可能(至少对编程来说,因为现在还没有研制出人工智能)。所有软件或游戏含有与电脑沟通的语句其实都是最初安排进去的,都是设定好的,不同的只是别人不是像这样打1000000000000个IF语句,而是有点技术含量(一般都是联网查询这句话的意思,至于联网的服务器…完全就是if数据库了,真的全if,就像上面一样),然后在本地批对相应的回答……做与电脑聊天的软件……不大可能。
还有一点,若想让电脑说出来,也就是你说的重点:语音聊天,让电脑说出文本简单很多,只需要下面的代码:
示例代码(窗体中有一个text文本框和一个按钮,单机按钮后说出文本框内容)
Private Sub Command1_Click()
CreateObject("SAPI.SpVoice").Speak Text1.Text
End Sub
还有,至于输出语言,XP好像只能输入英文和中文。不能英文和中文同时输入,win7设置一下好像可以。(详见控制面板→语音)
网上很多相关的现成的代码
你需要知道的一点是数据接收不是接收一次就完了 接收端根本不知道数据什么时候要过来 所以数据端应该一直重复着"等待-接收"的过程 于是就有了要在线程中接收数据的代码
用VB做聊天程序的方法
---- 所谓"聊天"是指两个程序能够发送数据给对方。这个程序涉及到数据通讯的知识,仿佛很复杂,不过,由于VB给我们提供了一个Winsock控件,问题就变得很简单了。
---- 先编写"聊天(主机)"程序。在窗体里添加Winsock控件,并设置其Protocol属性为1-SckUDPProtocol,其他属性为缺省值。接着添加两个标签和两个文本框,设置两个标签的标题属性分别为"接收窗"和"发送窗";两个文本框的标题属性为空。最后编写代码:
---- 1."聊天(主机)"
Private Sub Form-Load()
′设置网络地址
Winsock1.LocalPort=1024
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1999
End Sub
Private Sub Text1-Change()
′发送用户输入的内容
Winsock1.SendData Text1.Text
End Sub
Private Sub Winsock1-DataArrival
(Byval bytesTotal As Long)
Dim rec As String
′接收对方数据并在文本框内显示
Winsock1.GetData rec, vb String
Text2.Text=rec
End Sub
---- 2."聊天(副机)"
Private Sub Form_Load()
′设置网络地址
Winsock1.LocalPort=1999
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1024
---- 其他部分程序与(主机)相同。最后将两个程序存盘,并编译成执行(.Exe)文件。现在就可以使用这个程序进行对话了。
---- 七.文本框中文本的某一特定字符或字符串同时高亮显示的方法
---- 由于普通TextBox控件不支持不连续字符串的同时高亮显示,所以我们选择RichTextBox控件。单击工程(Project)选单项,在弹出的下拉选单中单击组件(Components)选单项,从弹出的对话框中选择Microsoft Rich Textbox Control 5.0复选框,确定加载RichTextBox控件。
---- 新建(New)一个工程,在窗体(Form)上添加一个RichTextBox控件和两个Command(按钮)控件,都采用系统默认的Name属性值;设置RichTextBox的Text属性值为空,Command1和Command2的Caption属性值分别设为"输入文本"和"选择字符串"。最后,添加如下VB代码:
Private Sub Command1-Click()
Dim str As String
Dim Text As String
str=〃输入文本〃
Text=InputBox(str)
RichTextBox1.Text=Text
End Sub
Private Sub Command2-Click()
Dim str As String
Dim Text As String
Dim Position As Integer
Dim Lenth As Integer
str=〃输入要高亮显示的字符串〃
Text=InputBox(str)
If Text 〈〉 〃〃 Then
Position=InStr(RichTextBox1.Text, Text)-1
Lenth=Len(Text)
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
Do While InStr(Position+Lenth+
1, RichTextBox1.Text, Text) 〈〉 0
Position=InStr(Position+Lenth+
1, RichTextBox1.Text, Text)-1
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
Loop
End If
End Sub
---- 按F5执行程序,单击"输入文本"按钮,在弹出的对话框中输入一些文本,确定后,刚刚输入的文本将显示在RichTextBox中;再单击"选择字符串"按钮,在弹出的对话框中输入你希望高亮显示的字符串,确定后,RichTextBox中相应的字符串将以红色高亮显示。
---- 八.编程实现Windows 95/98操作系统热启动的方法
---- 要利用程序实现系统的重新启动,可以在你的程序中调用API函数来实现。建一个子函数:(以VB为例)
Declare Function SystemParametersInfo Lib 〃
user32〃 Alias -
〃SystemParametersInfo〃 (ByVal uAction As Long,
ByVal uParam As Long,
ByVal lpvParam As Any, ByVal
fuWinIni As Long) As Long
Sub DisableCtrlAltDelete(bDisabled As Boolean)
Dim X As Long
X=SystemParametersInfo(97, bDisabled, CStr(1), 0)
End Sub
Call DisableCtrlAltDelete(true) ′禁止热启
Call DisableCtrlAltDelete(false) ′允许热启
---- 九.在Windows 95/ 98启动后自动启动程序的方法
---- 我们都知道在Windows 95/98的"开始"→"程序"选单下有一"启动"选单项,当每次启动Windows 95或Windows 98时,系统都会自动启动放在"启动"选单栏里的可执行程序。
---- 但目前有好多软件,像解霸五、ICQ,以及大部分实时侦测病毒的软件等等,安装后,并没有放在"启动"选单里,也能在启动操作系统时自动启动。怎么实现的呢?
---- 其实只要知道Windows注册表的一些知识,这个问题就不能称之为问题了。用鼠标单击"开始",打开开始选单,再单击"运行",出现一对话框,然后输入"regedit",确定后,会打开系统注册表编辑器,找到HKEY-LOCAL-MACHINE? SOFTWARE?Microsoft?Windows?CurrentVersion?Run,加入你的程序的入口,就可以了。如果不知道怎么加,就参考一下已经存在的键值。
---- 十. 如何把数据文件输出到Text控件中?如果数据量比较大,窗体满屏也不够大,怎么解决?
---- 有一个比较简单的方法,就是把数据放到一个文本框(Text)里,并在其中加上水平和垂直滚动条。具体实现步骤为:先在窗体(Form)里加入一个文本框,采用默认名Text1;然后,设置文本框Text1的属性:Text属性设置为空,MultiLine属性设置为True,ScrollBars属性设置为3-Both;接着添加如下VB代码:
Private Sub Form-Load()
Dim Handle As Integer
Dim FileName As String
On Error GoTo ErrExit
begin:
′输入要显示的数据文件的名称
FileName=InputBox$(〃Input Filename〃,
〃Open File〃)
On Error GoTo FileErr
Handle=FreeFile
Open FileName For Input As #Handle
′把数据文件中的数据输出到文本框中
Text1.Text=Input$(LOF(Handle), Handle)
Close #Handle
Exit Sub
FileErr:
Dim ErrNum As Integer
If Err.Number=53 Then
ErrNum=MsgBox(〃File not exist〃,
vbOKCancel, 〃Error Information〃)
If ErrNum=1 Then
GoTo begin
Else
Exit Sub
End If
End If
MsgBox Err.Description, , 〃file open failed〃
ErrExit:
Exit Sub
End Sub
′使文本框充满整个窗体
Private Sub Form-Resize()
Text1.Left=0
Text1.Top=0
Text1.Width=Form1.Width-100
Text1.Height=Form1.Height-400
End Sub
---- 通过这样的处理,不仅能解决问题,而且用户还可以在文本框中对数据进行编辑。
---- 十一.关联文件列表框、目录列表框和驱动器列表框的方法
---- 想做一个对话窗体,包含驱动器列表框、目录列表框和文件列表框,并能实现三者的同步操作,怎么做?这都是我们在实际应用中经常会遇到的问题,在VB中解决这个问题非常简单,可以通过Path属性的改变引发Change事件来实现。例如:
Sub Dir1-Change()
File1.Path=Dir1.Path
End Sub
---- 该事件过程使窗体上的目录列表框Dir1和文件列表框File1产生同步。因为目录列表框Path属性的改变将产生Change事件,所以在Dir1-Change事件过程中,把Dir1.Path赋给File1.Path,就可以产生同步效果。类似地,增加下面的事件过程,就可以使三种列表框同步操作:
Sub Drive1-Change()
Dir1.Path=Drive1.Drive
End Sub
---- 该过程使驱动器列表框和目录列表框同步,前面的过程使目录列表框和文件列表框同步,从而使三种列表框同步,问题即可解决。
用做一个好点的聊天不容易.给你介绍一个最简单聊天程序吧.
使用时,两个人同时打开,把两者的本机端口和远程端口设置为刚好相反.
Option Explicit
Private IgnoreText As Boolean
'----------------------各控件说明----------------------------
'--名称-------------类型---------------作用------------------
'frmMain Form CHAT主窗体
'Winsock1 Winsock 连接控件
'Label1 Label CONNECT WITH IP标签
'Label2 Label LOCAL PORT标签
'Label3 Label REMOTE PORT标签
'txtRemoteIP TextBox 远程IP地址输入框
'txtLocalPort TextBox 本地PORT输入框
'txtRemotePort TextBox 远程PORT输入框
'cmdConnect CommandButton 连接CONNECT按钮
'Label4 Label Type your text and hit Enter to send it.标签
'Frame1(remoteip) Frame REMOTE IP 框架
'Frame2(host ip) Frame HOST IP 框架
'Text1 TextBox 显示对方(远程主机)发送的CHAT内容
'Text2 TextBox 输入己方(本地主机)要发送的CHAT内容,按ENTER键发送
'cmdClear CommandButton 清空输入框(TEXT2)和显示框(TEXT1)中的内容
'StatusBar1 StatusBar 状态栏
'当CLEAR按钮按下时,清空TEXT1和TEXT2中的内容
Private Sub cmdClear_Click()
Text1 = ""
With Text2
'清空输入框
.Text = " "
'并把焦点置于TEXT2
.SetFocus
End With
End Sub
'当CONNECT按钮按下时,进行以下操作
Private Sub cmdConnect_Click()
On Error GoTo ErrHandler
With Winsock1
'设置 RemoteHost 属性
.RemoteHost = Trim(txtRemoteIP)
'设置 RemotePort 属性
'RemotePort 属性的值应该等于 远程主机上的 LocalHost 属性的值
.RemotePort = Trim(txtRemotePort)
'LocalPort 属性的值是不能改变的,必须检查它是否已经被设置
'如果 LocalPort 属性为空(没有被设置),将其设为在LocalPort输入框中输入的数值
If .LocalPort = Empty Then
.LocalPort = Trim(txtLocalPort)
Frame2.Caption = .LocalIP
'这是必须的,Bind 方法的作用是为控件“保留”一个本地端口,防止被其他用户调用。
.Bind .LocalPort
End If
End With
'为了保证使用者不能改变LocalPort的值,将txtLocalPort输入框锁定
txtLocalPort.Locked = True
'在状态栏中显示“正在连接”的状态
StatusBar1.Panels(1).Text = " 正在连接 " Winsock1.RemoteHost " "
'如果连接正常,做以下设置
Frame1.Enabled = True
Frame2.Enabled = True
Label4.Visible = True
Text2.SetFocus
Exit Sub
'如果在连接过程中出现错误,则转向ErrHandler:,并显示错误提示
ErrHandler:
MsgBox "连接远程主机失败!", vbCritical
End Sub
'当窗体加载时显示提示信息并在 txtRemoteIP 框中显示本地主机的IP
Private Sub Form_Load()
Show
txtRemoteIP = Winsock1.LocalIP
End Sub
Private Sub Label5_Click()
End Sub
'接收TEXT2输入框的按键,并做响应
Private Sub Text2_KeyPress(KeyAscii As Integer)
'定义变量 Last_Line_Feed 来记录最后输入行的位置
Static Last_Line_Feed As Long
'定义 New_Line 字符串记录新键入的一行文本的内容
Dim New_Line As String
'如果使用者按下CLEAR按钮对输入框内容清空,这时TEXT2为空,则重设最后输入行的位置为0
If Trim(Text2) = vbNullString Then Last_Line_Feed = 0
'当使用者按下ENTER键时
If KeyAscii = 13 Then
'取得最后输入行的内容并赋值给 New_Line 字符串
New_Line = Mid(Text2, Last_Line_Feed + 1)
'重设最后输入行的位置
Last_Line_Feed = Text2.SelStart
'通过 WINSOCK 发送新输入的一行文本的内容
Winsock1.SendData New_Line
'在状态栏显示发送信息
StatusBar1.Panels(2).Text = " 发送 " (LenB(New_Line) / 2) " 字节 "
End If
End Sub
Private Sub txtRemoteIP_Change()
End Sub
'当 WINSOCK 接收到新的数据(信息)时,进行以下响应
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'定义 New_Text 字符串来记录新接收的信息
Dim New_Text As String
'接收信息并赋值给 New_Text
Winsock1.GetData New_Text
'在TEXT1显示框中显示新接收到的信息
Text1.SelText = New_Text
Frame1.Caption = Winsock1.RemoteHostIP
'在状态栏中显示接收信息
StatusBar1.Panels(2).Text = " 接收到 " bytesTotal " 字节 "
End Sub
非常简单的,关键就是你要好好研究和吃透winsock控件,这是编写点对点聊天的重中之重。
聊天软件要编写多点对多点、且在广域网运行的才会有用,仅仅点对点只能是学习之用而以。