delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
请教 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061214144328129.html
Tag60190=record        
          CmdID:Word;          
          bOnline:boolean;          
          end;    
  我有一个这样的结构体,服务器返回给我一个这样的结构体.服务器的代码是C++,但服务器返回的时候,把bOnline付值为1或者零我用TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));接收服务器返回给我的结构体   .  
  当我接收完了之后,我怎么写条件判断语句呢?比如:if   byte(TagRoleonlineback.bOnline)=1   then这样写不对啊    
  该怎么写这个判断语句    
   
 

直接用就行了  
  if   TagRoleonlineback.bOnline   then

大哥,这样不行啊.我写了,不行啊,如果我要写个MESSAGEBOX弹出一个对话框,来看TagRoleonlineback.bOnline   这个值,该怎么写呢?

注意下   Boolean   delphi   中相当于   Integer   的长度,   另外还有   WordBool(2byte),   ByteBool

ShowMessage(BoolToStr(TagRoleonlineback.bOnline))

我也是这样写的呀,但对话框显示为空,是不是我服务器发过来的消息我没有接收到呢??TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));也就是说,这句没有接收服务器发过来的消息

对了,我这个boolean必须为一个字节

Tag60190=record        
          CmdID:Word;          
          bOnline:boolean;          
          end;    
  这个结构及其内部元素的字节长度,以及内部元素的排序顺序要与C语言的一致。  
  且要注意是否紧密排列的影响

目前结构是一致的,我不知道DELPHI里boolean是多少字节,C++那边传过来的是一个字节.我不玩DELPHI,但这个项目要用DELPHI,各位大哥帮帮忙啊

你这样声明结构试试  
  Tag60190=packed   record  
          CmdID:Word;  
          bOnline:boolean;  
          end;

目前需求是这样的,我先向服务器发一条消息(验证身份),然后服务器会反馈一条消息给我,我根据服务器反馈给我的消息,如果验证通过,就再发一条消息给服务器.如此而已,请问我该怎么写???

var  
  stredit2:string;  
  stredit3:string;  
  stredit1:string;  
  begin  
  if   TcpClient.Connected   =true   then  
          TcpClient.Disconnect;  
          try  
          begin  
          TcpClient.Host   :=Edit5.Text;   //   连接服务器的IP跟端口  
          Tcpclient.Port   :=StrtoInt(Edit6.Text);  
        with   TcpClient   do  
        begin  
            try  
                  Connect(3000);  
              except  
                TcpClient.Host   :='';  
                  tcpclient.Port   :=0;  
                Application.MessageBox(pChar('踢人-->登陆失败!'),pChar('错误'),MB_OK+MB_ICONINFORMATION);  
            end;  
          end;  
        Application.MessageBox(pChar('连接远程主机成功'),pChar('踢人'),MB_OK+MB_ICONINFORMATION);  
          TagCheck.CmdID   :=60001;  
          TagCheck.wSize   :=sizeof(TagCheck);  
          TagCheck.dwSerial   :=1000000000;  
          TagCheck.szGmAccountName   :='SuperGm';  
          TagCheck.szGmPassword   :='kungfu';  
            TagRole.CmdID   :=   60175;  
            TagRole.wSize   :=sizeof(TagRole);  
            TagRole.dwSerial   :=1000000000;  
            stredit2   :=Edit2.Text;  
            stredit3   :=Edit3.Text;  
            stredit1:=Edit1.Text;  
            TagRole.dwBorough   :=Crc(pchar(stredit2));  
            TagRole.dwWorldNameCrc   :=Crc(pchar(stredit3));  
            FillChar(TagRole.szRoleName,SizeOf(TagRole.szRoleName),#0);  
            Assert(Length(stredit1)<=SizeOf(TagRole.szRoleName));  
            Move(PChar(stredit1)^,TagRole.szRoleName[0],Length(stredit1));  
            TagRoleonline.CmdID   :=60185;  
            TagRoleonline.wSize   :=sizeof(TagRole);  
            TagRoleonline.dwSerial   :=1000000000;  
            TagRoleonline.dwBorough   :=Crc(pchar(stredit2));  
            TagRoleonline.dwWorldNameCrc   :=Crc(pchar(stredit3));  
            stredit1   :=Edit1.text;  
            FillChar(TagRoleonline.szRoleName,SizeOf(TagRoleonline.szRoleName),#0);  
            Assert(Length(stredit1)<=SizeOf(TagRoleonline.szRoleName));  
            Move(PChar(stredit1)^,TagRoleonline.szRoleName[0],Length(stredit1));  
            isize:=sizeof(TagCheck);  
            TcpClient.WriteBuffer(isize,sizeof(DWORD),true);//向服务器发出验证用户名跟密码的指令  
            TcpClient.WriteBuffer(TagCheck,sizeof(TagCheck),true);//向服务器发出验证用户名跟密码的指令  
            sleep(3000);  
            TcpClient.ReadBuffer(TagCheckback,sizeof(TagCheckback));//接受服务器返回的指令,验证是否通过  
            Application.MessageBox(pchar(inttostr(TagCheckback.CmdID)),pChar('角色验证ID'),MB_OK);  
            if   TagCheckback.dwErrorCode=0   then  
            begin  
              isize   :=sizeof(TagRoleonline);  
              TcpClient.WriteBuffer(isize,sizeof(DWORD),true);//向服务器发出查询这个角色是否在线的指令  
              TcpClient.WriteBuffer(TagRoleonline,sizeof(TagRoleonline),true);//向服务器发出查询这个角色是否在线的指令  
              sleep(3000);  
              TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));//接受服务器返回的指令,角色是否在线  
              Application.MessageBox(pchar(inttostr(TagRoleonlineback.CmdID)),pChar('角色是否在线ID'),MB_OK);  
              if   TagRoleonlineback.bOnline   then  
              begin  
                      Application.MessageBox(pchar('说明已经接收到服务器发给我的角色是否在线的消息'),pChar('角色是否在线'),MB_OK);  
                    isize   :=sizeof(TagRole);  
                    TcpClient.WriteBuffer(isize,sizeof(DWORD),true);   //向服务器发出踢角色下线的指令  
                    TcpClient.WriteBuffer(TagRole,sizeof(TagRole),true);   //向服务器发出踢角色下线的指令  
                    sleep(3000);  
                    TcpClient.ReadBuffer(TagRoleback,sizeof(TagRoleback));//接受服务器返回的指令,踢角色下线是否成功  
                    if     TagRoleback.dwErrorCode=0   then  
                        Application.MessageBox(pChar('该角色已被成功踢下线,请继续其它操作!'),pChar('踢人'),MB_OK+MB_ICONINFORMATION)  
                    else  
                        Application.MessageBox(pChar('该角色没有被成功踢下线,请继续其它操作!'),pChar('踢人'),MB_OK+MB_ICONINFORMATION);  
                end;  
              end;  
                TcpClient.Disconnect;  
              end;  
              except       on   e:exception   do  
              begin  
              Application.MessageBox(pChar(e.message),pChar('踢人'),MB_OK+MB_ICONINFORMATION);  
            TcpClient.Disconnect;  
            end;  
    end;  
  end;

大家帮忙看一下,看这段测试代码哪里不对,是不是要用线程,我如果开启线程的话,该怎么做呢??

posted on 2008-10-28 09:56 delphi2007 阅读(159) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。