您的位置:程序门 -> delphi -> 网络通信/分布式开发



help:vc代码 转 delphi!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


help:vc代码 转 delphi![已结贴,结贴人:zxf0089]
发表于:2007-02-05 14:39:20 楼主
void   __fastcall   tfrmmain::sbdowngoodsclick(tobject   *sender)
{
        int   ncount   =   0;
        unsigned   char   pszbuffer[65536];
        unsigned   char   pszresult[128];
        int     nfieldlength[16];
        ansistring   strdata;
        if(0   ==   m_nportopen)
        {
                m_hporthandle   =   shtp_openport(cbport.itemindex+1,b115200);
                if(null   ==   m_hporthandle)
                {
                        messagebox(null, "无法打开此串口 ", "错误提示 ",mb_ok ¦mb_iconstop);
                        return;
                }
                shtp_settimeout(m_hporthandle,100);
                m_nportopen   =   1;
        }
        //首先提取list中的数据长度
        int   ngoodsamount   =   lvlist.items.count;
        if(0   ==   ngoodsamount)
        {
                messagebox(null, "没有数据可以下载 ", "错误提示 ",mb_ok ¦mb_iconstop);
                if(m_nportopen)shtp_closeport(m_hporthandle);
                m_hporthandle   =   null;
                  m_nportopen   =   0;
                return;
        }
        tinifile   *pinifile;
        ansistring   strfilename   =   editfile.text;
        ansistring   strlistfile   =   changefileext(   strfilename,   ".dlf "   );
        pinifile   =   new   tinifile(   changefileext(   strfilename,   ".ini "   )   );
        //提取有多少字段
        int   nsector   =   pinifile.readinteger(   "goods ",   "amount ",   1   );
        for(int   i=0;i <nsector;i++)
        {
                char   psztest[16];
                sprintf(psztest, "%d ",i);
                nfieldlength[i]   =   pinifile.readinteger(   "length ",   psztest,   10   );
        }
        //提取条码索引字段
        int   nindex   =   pinifile.readinteger(   "goods ",   "index ",   0   );
        //提取需要显示的字段
        strdata   =   pinifile.readstring(   "goods ",   "pos ",   "0 "   );
        int   nindexpos   =   strdata.pos(inttostr(nindex));
        if(nindexpos)nindexpos--;
        char   pszfieldlist[16];
        strcpy(pszfieldlist,strdata.c_str());
        int   ndownfieldlist   =   strlen(pszfieldlist);
        delete   pinifile;
        sbstate.simpletext   =   "正在处理数据... ";
        //准备数据,准备下载     //首先要对数据按照要查找的索引进行排序     //读取文件进行下载,一次要读去所有的内容
        char*   pszdownloadlist;
        //提取文件长度
        file*   fp;
        fp   =   fopen(strlistfile.c_str(), "r ");
        long   curpos,   length;
        curpos   =   ftell(fp);
        fseek(fp,   0l,   seek_end);
        length   =   ftell(fp);
        fseek(fp,   curpos,   seek_set);
        pszdownloadlist   =   (char*)malloc(length*sizeof(char));
        curpos   =   0;
        char   psztemplist[256];
        memset(psztemplist,0x00,256);
        strcpy(pszdownloadlist, " ");
        ncount   =   0;
        int   nrecordlength;
        while(fgets(psztemplist,256,fp))
        {
                nrecordlength   =   strlen(psztemplist);
                curpos   +=   nrecordlength;
                psztemplist[nrecordlength-1]   =   0x00;
                strcat(pszdownloadlist,psztemplist);
                memset(psztemplist,0x00,256);
                ncount++;
                //if(0   ==   ncount%100)
                {
                sbstate.simpletext   =   "正在处理数据... "   +   inttostr(ncount);
                msg   msg;
                while(::peekmessage(&msg,null,0,0,pm_remove))dispatchmessage(&msg);
                }
        }
        ngoodsamount   =   ncount;
        length   =   strlen(pszdownloadlist);
        fclose(fp);
        //发送物品库需要提供数目,长度等,备注:只下载显示字段
        //命令头格式:单次下载的长度(2)+记录数(3)+标志字节(1)+记录长度(1)+字段长度(1)...
        //备注:单次下载的长度为1024/2048/4096字节,记录数   商品库的数目
        //标志字节的高半个字节表示按照那个索引来查找条码   原则上下载的第一个字段是条码
        //低半个字节表示字段数目,记录数x记录长度是本次下载的所有商品库的字节
        //记录长度=所有字段的长度之和
        sbstate.simpletext   =   "准备发送物品库 ";
        //单次下载的长度
        pszbuffer[0]   =   ssi_unit_send_length/256;
        pszbuffer[1]   =   ssi_unit_send_length%256;
        //商品数目
        pszbuffer[2]   =   ngoodsamount/(256*256);
        pszbuffer[3]   =   ngoodsamount/256;
        pszbuffer[4]   =   ngoodsamount%256;
        //标志字节
        pszbuffer[5]   =   nindexpos < <4;
        pszbuffer[5]   +=   ndownfieldlist;
        //添加具体字段的长度
        int   ndownloadlength   =   0;
        for(int   i=0;i <ndownfieldlist;i++)
        {
                pszbuffer[7+i]   =   nfieldlength[pszfieldlist[i]-0x30];
                ndownloadlength   +=   nfieldlength[pszfieldlist[i]-0x30];
        }
        //字长度
        pszbuffer[6]   =   ndownloadlength;
        int   ndownflag   =   1;
        for(ncount=0;ncount <6;ncount++)
        {
                shtp_purgeport(m_hporthandle,2);
                shtp_putmessage(m_hporthandle,ssi_good_list,pszbuffer,7+ndownfieldlist);
                //等待接收下位机应答
                if(shtp_succ   ==   shtp_getmessage(m_hporthandle,pszresult,30))
                {
                        sbstate.simpletext   =   "正在发送物品库 ";
                        ndownflag   =   0;
                        break;
                }
        }
        if(ndownflag)
        {
                sbstate.simpletext   =   "没有接收到下位机应答... ";
                if(m_nportopen)shtp_closeport(m_hporthandle);
                m_hporthandle   =   null;
                m_nportopen   =   0;
                free(pszdownloadlist);
                return;
        }
        //开始连续发送数据
        dword   dwlength;
        int   noffset;
        sbstate.simpletext   =   "开始发送商品信息数据... ";
        int   ndown64kstep,ndownunitstep;
        ndown64kstep   =   length/65536;
        sleep(5);
        for(ncount=0;ncount <ndown64kstep;ncount++)
        {//开始下载64k数据
                for(int   i=0;i <64;i++)
                {
                        noffset   =     ncount*65536   +   i*ssi_unit_send_length;
                        shtp_purgeport(m_hporthandle,2);
                        writefile(m_hporthandle,pszdownloadlist+noffset,ssi_unit_send_length,&dwlength,null);
                        //需要确认一下才能发下一部分数据
                        if(shtp_succ   ==   shtp_getmessage(m_hporthandle,pszresult,300))
                        {
                                sbstate.simpletext   =   inttostr(noffset/ndownloadlength+1);
                                msg   msg;
                                while(::peekmessage(&msg,null,0,0,pm_remove))dispatchmessage(&msg);
                        }
                        else
                        {//没有接收到应答
                                sbstate.simpletext   =   "发送失败... ";
                                if(m_nportopen)shtp_closeport(m_hporthandle);
                                m_hporthandle   =   null;
                                m_nportopen   =   0;
                                free(pszdownloadlist);
                                return;
                        }
                }
        }
        //发送完所有数据
        sbstate.simpletext   =   "发送成功... ";
        if(m_nportopen)shtp_closeport(m_hporthandle);
        m_hporthandle   =   null;
        m_nportopen   =   0;
        free(pszdownloadlist);
        return;
}
发表于:2007-02-05 15:16:331楼 得分:10
这不是vc代码,是bcb代码,很好翻译的,只是太长了。。。。。。
发表于:2007-02-05 15:19:522楼 得分:10
这也太长了啊.....


你自己翻译吧   那句看不懂再贴出来
发表于:2007-02-05 15:37:303楼 得分:0
这段代码主要是将程序中查询到的数据以文本文件的形式下发到盘点机中

拜托帮帮忙;
其实也不长的,谢谢!
发表于:2007-02-05 15:58:154楼 得分:0
我又删除了部分代码,帮我翻译一下下面的代码,谢谢!!!!
void   __fastcall   tfrmmain::sbdowngoodsclick(tobject   *sender)
{
        int   ncount   =   0;
        unsigned   char   pszbuffer[65536];
        unsigned   char   pszresult[128];
        int     nfieldlength[16];
        ansistring   strdata;
        //首先提取list中的数据长度
        int   ngoodsamount   =   lvlist.items.count;
        tinifile   *pinifile;
        ansistring   strfilename   =   editfile.text;
        ansistring   strlistfile   =   changefileext(   strfilename,   ".dlf "   );
        pinifile   =   new   tinifile(   changefileext(   strfilename,   ".ini "   )   );
        //提取有多少字段
        int   nsector   =   pinifile.readinteger(   "goods ",   "amount ",   1   );
        for(int   i=0;i <nsector;i++)
        {
                char   psztest[16];
                sprintf(psztest, "%d ",i);
                nfieldlength[i]   =   pinifile.readinteger(   "length ",   psztest,   10   );
        }
        //提取条码索引字段
        int   nindex   =   pinifile.readinteger(   "goods ",   "index ",   0   );
        //提取需要显示的字段
        strdata   =   pinifile.readstring(   "goods ",   "pos ",   "0 "   );
        int   nindexpos   =   strdata.pos(inttostr(nindex));
        if(nindexpos)nindexpos--;
        char   pszfieldlist[16];
        strcpy(pszfieldlist,strdata.c_str());
        int   ndownfieldlist   =   strlen(pszfieldlist);
        delete   pinifile;
        sbstate.simpletext   =   "正在处理数据... ";
        //准备数据,准备下载     //首先要对数据按照要查找的索引进行排序     //读取文件进行下载,一次要读去所有的内容
        char*   pszdownloadlist;
        //提取文件长度
        file*   fp;
        fp   =   fopen(strlistfile.c_str(), "r ");
        long   curpos,   length;
        curpos   =   ftell(fp);
        fseek(fp,   0l,   seek_end);
        length   =   ftell(fp);
        fseek(fp,   curpos,   seek_set);
        pszdownloadlist   =   (char*)malloc(length*sizeof(char));
        curpos   =   0;
        char   psztemplist[256];
        memset(psztemplist,0x00,256);
        strcpy(pszdownloadlist, " ");
        ncount   =   0;
        int   nrecordlength;
        while(fgets(psztemplist,256,fp))
        {
                nrecordlength   =   strlen(psztemplist);
                curpos   +=   nrecordlength;
                psztemplist[nrecordlength-1]   =   0x00;
                strcat(pszdownloadlist,psztemplist);
                memset(psztemplist,0x00,256);
                ncount++;
                //if(0   ==   ncount%100)
                {
                sbstate.simpletext   =   "正在处理数据... "   +   inttostr(ncount);
                msg   msg;
                while(::peekmessage(&msg,null,0,0,pm_remove))dispatchmessage(&msg);
                }
        }
        ngoodsamount   =   ncount;
        length   =   strlen(pszdownloadlist);
        fclose(fp);
        //发送物品库需要提供数目,长度等,备注:只下载显示字段
        //命令头格式:单次下载的长度(2)+记录数(3)+标志字节(1)+记录长度(1)+字段长度(1)...
        //备注:单次下载的长度为1024/2048/4096字节,记录数   商品库的数目
        //标志字节的高半个字节表示按照那个索引来查找条码   原则上下载的第一个字段是条码
        //低半个字节表示字段数目,记录数x记录长度是本次下载的所有商品库的字节
        //记录长度=所有字段的长度之和
        sbstate.simpletext   =   "准备发送物品库 ";
        //单次下载的长度
        pszbuffer[0]   =   ssi_unit_send_length/256;
        pszbuffer[1]   =   ssi_unit_send_length%256;
        //商品数目
        pszbuffer[2]   =   ngoodsamount/(256*256);
        pszbuffer[3]   =   ngoodsamount/256;
        pszbuffer[4]   =   ngoodsamount%256;
        //标志字节
        pszbuffer[5]   =   nindexpos < <4;
        pszbuffer[5]   +=   ndownfieldlist;
        //添加具体字段的长度
        int   ndownloadlength   =   0;
        for(int   i=0;i <ndownfieldlist;i++)
        {
                pszbuffer[7+i]   =   nfieldlength[pszfieldlist[i]-0x30];
                ndownloadlength   +=   nfieldlength[pszfieldlist[i]-0x30];
        }
        //字长度
        pszbuffer[6]   =   ndownloadlength;
        int   ndownflag   =   1;
        for(ncount=0;ncount <6;ncount++)
        {
                shtp_purgeport(m_hporthandle,2);
                shtp_putmessage(m_hporthandle,ssi_good_list,pszbuffer,7+ndownfieldlist);
                //等待接收下位机应答
                if(shtp_succ   ==   shtp_getmessage(m_hporthandle,pszresult,30))
                {
                        sbstate.simpletext   =   "正在发送物品库 ";
                        ndownflag   =   0;
                        break;
                }
        }
        //开始连续发送数据
        dword   dwlength;
        int   noffset;
        sbstate.simpletext   =   "开始发送商品信息数据... ";
        int   ndown64kstep,ndownunitstep;
        ndown64kstep   =   length/65536;
        for(ncount=0;ncount <ndown64kstep;ncount++)
        {//开始下载64k数据
                for(int   i=0;i <64;i++)
                {
                        noffset   =     ncount*65536   +   i*ssi_unit_send_length;
                        shtp_purgeport(m_hporthandle,2);
                        writefile(m_hporthandle,pszdownloadlist+noffset,ssi_unit_send_length,&dwlength,null);
                        //需要确认一下才能发下一部分数据
                        if(shtp_succ   ==   shtp_getmessage(m_hporthandle,pszresult,300))
                        {
                                sbstate.simpletext   =   inttostr(noffset/ndownloadlength+1);
                                msg   msg;
                                while(::peekmessage(&msg,null,0,0,pm_remove))dispatchmessage(&msg);
                        }
                }
        }
}
发表于:2007-02-06 09:51:015楼 得分:0
自己顶一下
发表于:2007-02-06 13:41:536楼 得分:20
太长了,自己翻译吧,那句不懂就问,语法又不是很难
发表于:2007-02-06 14:40:267楼 得分:10
还是从功能上实现
代码重写啦~


快速检索

最新资讯
热门点击