聊天程序通过编译,但是运行.exe的出现list index out of bounds(2),麻烦高手帮忙解决下 谢谢哦

guqian1984 2006-06-15 12:08:06
服务器端:
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Menus.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published: // IDE-managed Components
TMainMenu *MainMenu1;
TButton *BtnToAll;
TLabel *Label1;
TLabel *Label3;
TEdit *EdtSend;
TListBox *ListUserAddr;
TListBox *ListUserName;
TStatusBar *StatusBar1;
TServerSocket *ServerSocket1;
TMenuItem *MenuListen;
TMenuItem *MenuClose;
TMenuItem *MenuDisConnect;
TLabel *LabelNotice;
TLabel *Label2;
void __fastcall ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket);
//void __fastcall EdtSendChange(TObject *Sender);
void __fastcall ListUserNameClick(TObject *Sender);
void __fastcall BtnToAllClick(TObject *Sender);
void __fastcall MenuListenClick(TObject *Sender);
void __fastcall ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
int &ErrorCode);
void __fastcall EdtSendKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall MenuDisConnectClick(TObject *Sender);
void __fastcall MenuCloseClick(TObject *Sender);
void __fastcall ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket);
private: // User declarations
int m_iClientNum; //连接的客户机的数量
AnsiString m_sIsName; //用户的姓名
AnsiString m_sIsChat; //对话内容
AnsiString m_sIsCommand;//命令
AnsiString m_sPart; //分隔标志与具体内容
AnsiString m_sTo; //选择的对象
void __fastcall AppException(TObject *Sender,Exception *E); //自定义函数,处理程序异常
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
//当程序发生异常的时候将显示出现的错误
void __fastcall TMainForm::AppException(TObject *Sender,Exception *E)
{
Application->ShowException(E);
Application->Terminate();
}
//---------------------------------------------------------------------------
//对程序中的各主要成员变量进行初始化
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
ServerSocket1->Port=50;
ServerSocket1->Active=true;
m_iClientNum=0;
m_sIsName="NA";
m_sIsChat="CT";
m_sPart="#";
m_sIsCommand="CO";
m_sTo="ALL";
MenuListen->Enabled=false;
MenuClose->Enabled=true;
Application->OnException=AppException;
TDateTime NowTime;
NowTime=Now();
StatusBar1->Panels->Items[2]->Text=NowTime.DateTimeString();
}
...全文
913 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
iec 2006-06-23
  • 打赏
  • 举报
回复
数组越界了
痞子酷 2006-06-21
  • 打赏
  • 举报
回复
删除时,ItemIndex最好赋值-1
痞子酷 2006-06-21
  • 打赏
  • 举报
回复
主要原因出现在 ListBox这个控件上,对改控件操作是,注意先BEGIN,再动作(删除、新增),最后END
HelloBear188 2006-06-20
  • 打赏
  • 举报
回复
既然代码都贴出来了,不如把代码打个包给大家给你调试修改修改也许会更好些!
雪狼__ 2006-06-20
  • 打赏
  • 举报
回复
搜索一下Strings,看到Strings[n]中n大于count的就改正;
guqian1984 2006-06-15
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
//当客户机处于连接过程中时在状态栏中显示正在连接的提示
void __fastcall TMainForm::ClientSocket1Connecting(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->Panels->Items[1]->Text="正在连接,请稍后...";
}
//---------------------------------------------------------------------------
//当选择"connect"菜单项时,输入用户名与服务器端连接
void __fastcall TMainForm::MenuConnectClick(TObject *Sender)
{
InputQuery("请输入您的用户名","用户名:",m_sName);
if(m_sName.IsEmpty())
{
ShowMessage("您以无名氏登录");
m_sName="无名氏";
}
if(ClientSocket1->Active==false)
ClientSocket1->Open();
}
//---------------------------------------------------------------------------
//当客户接通时在状态栏中显示接通的提示
void __fastcall TMainForm::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
Socket->SendText(m_sIsName+m_sName);
AnsiString sTemp;
sTemp.sprintf("%s登录成功!",m_sName);
StatusBar1->Panels->Items[1]->Text=sTemp;
LabelNotice->Caption=m_sName+AnsiString("对所有人说...");
m_HasConnected=true;
}
//---------------------------------------------------------------------------
/*当服务器端有数据写入时,如果是清除命令,清除用户列表框;如果是新用户加入的信息,则在
用户列表框中加入新用户;如果是对话内容,则显示出来*/
void __fastcall TMainForm::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString sInfo;
AnsiString sType;
AnsiString sChat;
sInfo=Socket->ReceiveText();
sType=sInfo.SubString(1,2);
if(sInfo==AnsiString("CLEAR"))
ListUser->Items->Clear();
else
{
if(sType!=m_sIsChat)
{
if(sInfo!=m_sIsName)
LabelNotice->Caption="喂!新朋友来了!";
ListUser->Items->Add(sInfo);
}
else
{
sChat=sInfo.SubString(4,sInfo.Length()-3);
MemoReceive->Lines->Add(sChat);
}
}
}
//---------------------------------------------------------------------------
//当客户端Socket发生错误时将错误码设置为零
void __fastcall TMainForm::ClinetSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode=0;
}
//---------------------------------------------------------------------------
//当在用户列表框中单击时,选择要与之交谈的用户
void __fastcall TMainForm::ListUserClick(TObject *Sender)
{
if(m_HasConnected)
{
AnsiString sTemp;
if(m_sName==ListUser->Items->Strings[ListUser->ItemIndex])
{
LabelNotice->Caption="请不要和自己说话!";
}
else
{
sTemp.sprintf("%s对%s说...",m_sName,
ListUser->Items->Strings[ListUser->ItemIndex]);
m_sSpeakTo=ListUser->Items->Strings[ListUser->ItemIndex];
LabelNotice->Caption=sTemp;
}
}
else
{
ShowMessage("对不起!请先登录!");
}
}
//---------------------------------------------------------------------------
//当在发送信息框中按键时,如果按下的是Enter键,则向服务器发送信息
void __fastcall TMainForm::EdtSendKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_RETURN)
{
AnsiString sTemp;
sTemp=m_sIsChat+m_sSpeakTo+m_sPart+EdtSend->Text;
sTemp+=AnsiString("(")+m_sName+AnsiString("say:)");
ClientSocket1->Socket->SendText(sTemp);
EdtSend->Clear();
Key=0;
}
}
//---------------------------------------------------------------------------
//当单击"BtnToAll"按钮,表示与所有人进行交谈
void __fastcall TMainForm::BtnToAllClick(TObject *Sender)
{
if(m_HasConnected)
{
AnsiString sTemp;
m_sSpeakTo="ALL";
sTemp.sprintf("%s对%s说...",m_sName,"所有人");
LabelNotice->Caption=sTemp;
}
else
{
ShowMessage("对不起,请先登录!");
}
}
//---------------------------------------------------------------------------
//当客户机端断开时,在状态栏中显示断开连接的提示
void __fastcall TMainForm::ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->Panels->Items[1]->Text="服务器已经断开了连接!";
ListUser->Items->Clear();
LabelNotice->Caption="呜呜:o 被断开了!";
m_HasConnected=false;
MemoReceive->Clear();
}
//---------------------------------------------------------------------------
//当选择"MenuDisconnect"菜单项时,关闭ClientSocket
void __fastcall TMainForm::MenuDisConnectClick(TObject *Sender)
{
if(ClientSocket1->Socket->Connected)
ClientSocket1->Socket->Close();
}
//---------------------------------------------------------------------------
//当选择"MenuSet"菜单项时,设置服务器的IP地址
void __fastcall TMainForm::MenuSetClient(TObject *Sender)
{
AnsiString sIp;
InputQuery("输入框","输入服务器的IP",sIp);
if(!sIp.IsEmpty())
{
m_sHostAddress=sIp;
ClientSocket1->Address=m_sHostAddress;
}
}
//---------------------------------------------------------------------------
第一次用C++ Bulider 完成我的课程设计...在编译通过后 生成.exe文件的时候 运行时出现list index out of bounds(2)
有很多不懂的地方 希望高手能给予指点..谢谢
guqian1984 2006-06-15
  • 打赏
  • 举报
回复
客户端:
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Menus.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published: // IDE-managed Components
TMemo *MemoReceive;
TMainMenu *MainMenu1;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *LabelNotice;
TListBox *ListUser;
TEdit *EdtSend;
TStatusBar *StatusBar1;
TButton *BtnToAll;
TClientSocket *ClientSocket1;
TMenuItem *MenuSet;
TMenuItem *MenuConnect;
TMenuItem *MenuDisConnect;
void __fastcall ClientSocket1Connecting(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall MenuConnectClick(TObject *Sender);
void __fastcall ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ClinetSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
int &ErrorCode);
void __fastcall ListUserClick(TObject *Sender);
void __fastcall EdtSendKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall BtnToAllClick(TObject *Sender);
void __fastcall ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall MenuSetClient(TObject *Sender);
void __fastcall MenuDisConnectClick(TObject *Sender);
void __fastcall ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket);
private: // User declarations
BOOL m_HasConnected;//表示是否与服务器相连通,true表示已经连接成功
AnsiString m_sHostAddress;//表示主机地址
AnsiString m_sName;//表示新加入的成员的姓名
AnsiString m_sIsChat;//表示发送的是对话内容
AnsiString m_sSpeakTo;//表示想要交谈的对象
AnsiString m_sPart;//用于分隔标志与具体的内容
AnsiString m_sSendInfo;//表示发送的信息
AnsiString m_sIsName;//表示发送的是用户的姓名
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
//在主窗体的构造函数中对成员变量进行初始化
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
m_sHostAddress="172.16.82.199";
ClientSocket1->Active=false;
ClientSocket1->Address=m_sHostAddress;
ClientSocket1->Port=50;
m_sSpeakTo="ALL";
m_sIsName="NA";
m_sIsChat="CT";
m_sPart="#";
m_HasConnected=false;
TDateTime NowTime;
NowTime=Now();
StatusBar1->Panels->Items[2]->Text=NowTime.DateTimeString();
}
guqian1984 2006-06-15
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
/*当服务器建立了一个与客户机的连接时,在状态栏上显示连接成功的提示,
将当前客户机的总数加1,由服务器向当前所有客户机发送刚刚连接成功的客户机的信息*/
void __fastcall TMainForm::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString sClientNum;
m_iClientNum++;
sClientNum.sprintf("有%台用户连接",ServerSocket1->Socket->ActiveConnections);
StatusBar1->Panels->Items[1]->Text="连接成功!";
StatusBar1->Panels->Items[0]->Text=sClientNum;
ListUserAddr->Items->Add(Socket->RemoteAddress);
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
ServerSocket1->Socket->Connections[i]->SendText("CLEAR");
Sleep(90);
}
//---------------------------------------------------------------------------
/*当客户机端有数据传输过来时,首先判断是否是刚刚登陆,
如果是,则将用户名加入服务器端的用户名列表中,
如果是发送对话内容,则将内存转给该客户机想要发送给的用户*/
void __fastcall TMainForm::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString sTemp;
AnsiString sPre;
AnsiString sWelcome;
sTemp=Socket->ReceiveText();
sPre=sTemp.SubString(1,2);
if(sPre==m_sIsName)
{
AnsiString sName;
sName=sTemp.SubString(3,sTemp.Length()-2);
ListUserName->Items->Add(sName);
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
{
for(int j=0;j<ListUserName->Items->Count;j++)
{
AnsiString sName;
sName=ListUserName->Items->Strings[j];
ServerSocket1->Socket->Connections[i]->SendText(sName);
Sleep(9);
}
sWelcome=m_sIsChat+m_sPart;
sWelcome+=AnsiString("大家欢迎(")+sName+AnsiString("):)的光临!(服务器说:)");
ServerSocket1->Socket->Connections[i]->SendText(sWelcome);
}
}
if(sPre==m_sIsChat)
{
AnsiString sTo,sChat;
int iPos;
iPos=sTemp.Pos(m_sPart);
sTo=sTemp.SubString(3,iPos-3);
sChat=m_sIsChat+sTemp.SubString(iPos,sTemp.Length()-iPos+1);
if(sTo==AnsiString("All"))
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;
i++)
ServerSocket1->Socket->Connections[i]->SendText(sChat);
if(sTo!=AnsiString("All"))
{
int iIndex=ListUserName->Items->IndexOf(sTo);
ServerSocket1->Socket->Connections[iIndex]->
SendText(sChat);
}
}
}
//---------------------------------------------------------------------------
/*当客户机端断开时在状态栏上显示断开连接的信息,
同时在服务器端的成员列表中删除刚刚断开的用户*/
void __fastcall TMainForm::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString sTemp;
sTemp.sprintf("%s断开连接!",Socket->RemoteAddress);
StatusBar1->Panels->Items[1]->Text=sTemp;
int iIndex;
iIndex=ListUserAddr->Items->IndexOf(Socket->RemoteAddress),
ListUserAddr->Items->Delete(iIndex);
ListUserName->Items->Delete(iIndex);
}
//---------------------------------------------------------------------------
//当Socket发生异常时执行以下代码:
void __fastcall TMainForm::ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode=0;
}
//---------------------------------------------------------------------------
// 当在EdtSend编辑框中按键时判断是否按下Enter键,如果是,则发送信息
void __fastcall TMainForm::EdtSendKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==VK_RETURN)
{
AnsiString sTemp;
sTemp=m_sIsChat+m_sPart+EdtSend->Text+AnsiString("(服务器说:)");
if(m_sTo==AnsiString("All"))
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
ServerSocket1->Socket->Connections[i]->SendText(sTemp);
if(m_sTo!=AnsiString("All"))
{
int iIndex=ListUserName->Items->IndexOf(m_sTo);
ServerSocket1->Socket->Connections[iIndex]->SendText(sTemp);
}
EdtSend->Clear();
}
}
//---------------------------------------------------------------------------
//当在表框中单击时将显示要与之对话的成员
void __fastcall TMainForm::ListUserNameClick(TObject *Sender)
{
m_sTo=ListUserName->Items->Strings[ListUserName->ItemIndex];
LabelNotice->Caption=AnsiString("向")+m_sTo+AnsiString("发信息!");
}
//---------------------------------------------------------------------------
//当单击"BtnToAll"按钮时表示将向所有人说话
void __fastcall TMainForm::BtnToAllClick(TObject *Sender)
{
m_sTo="ALL";
LabelNotice->Caption="向所有人发信息";
}
//---------------------------------------------------------------------------
//当选择"MenuDisConnect"菜单项时断开连接
void __fastcall TMainForm::MenuDisConnectClick(TObject *Sender)
{
if(m_sTo=="ALL")
{
AnsiString sTemp;
sTemp.sprintf("真的要断开与%s的连接吗?","所有人");
if(MessageDlg(sTemp,mtConfirmation,
TMsgDlgButtons()<<mbYes<<mbNo,0)==mrYes)
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
ServerSocket1->Socket->Connections[i]->Close();
}
if(m_sTo!="ALL")
{
AnsiString sTemp;
sTemp.sprintf("真的要断开与%s的连接吗?",m_sTo);
if(MessageDlg(sTemp,mtConfirmation,
TMsgDlgButtons()<<mbYes<<mbNo,0)==mrYes)
{
int iIndex=ListUserName->Items->IndexOf(m_sTo);
ServerSocket1->Socket->Connections[iIndex]->Close();
}
}
}

//---------------------------------------------------------------------------
//当选择"MenuClose"菜单项时关闭ServerSocket
void __fastcall TMainForm::MenuCloseClick(TObject *Sender)
{
if(ServerSocket1->Active)
ServerSocket1->Close();
MenuListen->Enabled=true;
MenuClose->Enabled=false;
}
//---------------------------------------------------------------------------
//当选择"MenuListen"菜单项时打开ServerSocket并处于监听状态
void __fastcall TMainForm::MenuListenClick(TObject *Sender)
{
if(!ServerSocket1->Active)
ServerSocket1->Open();
MenuListen->Enabled=false;
MenuClose->Enabled=true;
}
//---------------------------------------------------------------------------
pp616 2006-06-15
  • 打赏
  • 举报
回复
在你使用Items->Strings[n]的时候先判一下n是否大雨ListBox的Count
guqian1984 2006-06-15
  • 打赏
  • 举报
回复
唉 对不起 我实在是不会... 能不能告诉我 在哪个地方加什么代码...麻烦各位高手了
weixing979 2006-06-15
  • 打赏
  • 举报
回复
怎么都粘出来了,看看
m_sTo=ListUserName->Items->Strings[ListUserName->ItemIndex];
类似这种代码,操作前先判断 ListBox的ItemIndex 是否是 -1

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧