我爱builder

C++Builder 程序员博客

那位大侠帮忙给一个获得HID信息的源码啊?急求,非常重要,还有如何读出USB的信息。
#include "HelloWDM.h"
extern "C"{
#include"hidsdi.h"
#include<setupapi.h>
}

// {0E57C50F-0CCC-4ad2-A895-93C5ED119860}
DEFINE_GUID(MY_WDM_DEVICE, 0xe57c50f, 0xccc, 0×4ad2, 0xa8, 0×95, 0×93, 0xc5, 0xed, 0×11, 0×98, 0×60);
#pragma INITCODE 
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
HDEVINFO hdevinfo;
SP_DEVICE_INTERFACE_DATA MyDeviceInterfaceData;
SP_DEVICE_INTERFACE_DETAIL_DATA MyDeviceInterfaceDetailData;
SP_INFO_DATA MyDeviceInfoData;
Long Result;
KdPrint(("Enter DriverEntry
"));
  HidD_GetHidGuid(&MY_WDM_DEVICE);
hdevinfo = SetupDiGetClassDevs(&MY_WDM_DEVICE,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
  MyDdeviceInfoData.cbsize = sizeof(MyDdeviceInfoData);
Result = SetupDiEnumDeviceInterfaces(hDevInfo,0,&MY_WDM_DEVICE,MemeberIndex,&MyDdeviceInfoData);我这里只有遍历所有usb设备的源码,呵呵拜托发给我参考一下,谢谢啦!万分感激,简直是救命稻草。我的邮箱:markfilan@hotmail.com邮件已发,其中遍历usb设备是我根据网上得整理得,其他得是网上得资料和一些必须得头文件,很不好找得,呵呵。呵呵,真的很感谢啊.

  • Filed under: C++ Builder
  •   TXXXX = class(TInterfacedObject, IOleObject, IViewObject)
      private
        // IOleObject
        function SetClientSite(const clientSite: IOleClientSite): HResult; stdcall;
        …

        // IViewObject
        …
      end;

    这样的Delphi类如何翻译为BCB的代码?
    注:IOleObject, IViewObject均为COM接口。

    Delphi源码可以在BCB中直接编译。

  • Filed under: C++ Builder
  • .h文件
    typedef struct
    {
      TGroupBox *gb;
      TRichEdit *RichEdit1;
      TImage *img;

    }TInst;

    .cpp文件
    TForm1 *Form1;
    TInst *inst=new TInst();

    //—————————————————————————
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //—————————————————————————

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        inst->gb = new TGroupBox(this);
        inst->gb->Caption = "Log";
        inst->gb->Parent = Form1;
        inst->gb->Top =Form1->Top+20;
        inst->gb->Left =Form1->Left +20;
        inst->gb->Width =800;
        inst->gb->Height=800;

        inst->RichEdit1= new TRichEdit(inst->gb);
        inst->RichEdit1->Parent =inst->gb;
        inst->RichEdit1->Top =inst->gb->Top+10;
        inst->RichEdit1->Left =inst->gb->Left+10;
        inst->RichEdit1->Width=600;
        inst->RichEdit1->Height =650;

        inst->img=new TImage(inst->RichEdit1 );
        inst->img->Parent =inst->RichEdit1 ;
        inst->img->Top =inst->RichEdit1->Top +10;
        inst->img->Left =inst->RichEdit1->Left +10;
        inst->img->Width =300;
        inst->img->Height=300;
        inst->img->Stretch =true;
        inst->img->Transparent =true;
        inst->img->Picture=this->Image1->Picture ;

    我想让我创建的img 在RichEdit1,但现在img 的位置随RichEdit1输入而向下移动,且RichEdit1输入也有问题,请指教?

    }RichEdit1加载图片不是如此使用的.

    严重支持    songhtao

  • Filed under: C++ Builder
  • DWORD WINAPI CSendFileServer::ThreadListen(LPVOID lpParam)
    {
    CSendFileServer* pServer = (CSendFileServer*)lpParam;
    SOCKET sockListen = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr(pServer->m_sClientIP);
    sin.sin_port = htons(pServer->m_iListenPort);

    if(bind(sockListen, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
    closesocket(sockListen);
    pServer->m_pWnd->SendMessage(WM_BINDERROR);
    return 1;
    }

    if(listen(sockListen, 5) == SOCKET_ERROR)
    {
    closesocket(sockListen);
    pServer->m_pWnd->SendMessage(WM_LISTENERROR);
    return 1;
    }

    pServer->m_pWnd->SendMessage(WM_STARTLISTEN);

    fd_set fdListen;
    timeval seltime;
    seltime.tv_sec = 0;
    seltime.tv_usec = 10000;

    while(!pServer->m_bEndListenThread)
    {
    FD_ZERO(&fdListen);
    FD_SET(sockListen, &fdListen);

    if(select(0, &fdListen, NULL, NULL, &seltime) <= 0 || !FD_ISSET(sockListen, &fdListen) )
    continue;

    int len = sizeof(sin);
    SOCKET sock = accept(sockListen, (SOCKADDR*)&sin, &len);

    PARAMRECV* pParamRecv = new PARAMRECV;
    pParamRecv->sock = sock;
    pParamRecv->ptr = pServer;

    DWORD id;
    HANDLE h = CreateThread(NULL, 0, ThreadRecv, pParamRecv, 0, &id);
    CloseHandle(h);
    }
    closesocket(sockListen);
    return 0;
    }

    //功能:接收线程
    //参数:LPVOID lpParam
    //返回:无意义
    DWORD WINAPI CSendFileServer::ThreadRecv(LPVOID lpParam)
    {
    PARAMRECV* pParam = (PARAMRECV*)lpParam;
    CSendFileServer* pServer = (CSendFileServer*)pParam->ptr;

    fd_set fdRecv;
    timeval seltime;
    seltime.tv_sec = 0;
    seltime.tv_usec = 10000;

    while(1)
    {
    FD_ZERO(&fdRecv);
    FD_SET(pParam->sock, &fdRecv);

    if(select(0, &fdRecv, NULL, NULL, &seltime) <= 0 || !FD_ISSET(pParam->sock, &fdRecv) )
    continue;

    MSGREQUEST msgRequest;
    int iRecvCnt = recv(pParam->sock, (char*)&msgRequest, sizeof(msgRequest), 0);
    if(iRecvCnt <= 0)
    break;

    //如果是请求文件列表
    if(msgRequest.iCommand == FILELIST)
    {
    pServer->m_pWnd->SendMessage(WM_SENDFILELIST, (WPARAM)&pParam->sock, 0);
    }

    //如果是请求文件数据
    else if(msgRequest.iCommand == FILEDATA)
    {
    long lFileOffset = msgRequest.lFileOffset;

    CFile file;
    BOOL bResult = file.Open(pServer->m_sFilePath, CFile::modeRead|CFile::shareDenyNone, NULL);
    if(!bResult)
    {
    break; //如果文件打开失败就终止线程
    }

    char sSendBuf[SENDSIZE];
    while(lFileOffset < msgRequest.lFileLength)
    {
    int iSeek = file.Seek(lFileOffset, CFile::begin);
    int iReadCnt = file.Read(sSendBuf, SENDSIZE);
    if(iReadCnt ==0)
    break;

    int iSendCnt = send(pParam->sock, sSendBuf, iReadCnt, 0);

    //如果发送失败就终止线程
    if(iSendCnt == -1)
    break;
    else
    {
                                            pServer->m_pWnd->SendMessage(WM_SENDFILESTATUS, (WPARAM)&msgFileStatus, 0);
                                    lFileOffset += iSendCnt;
                                    }
    }//end of while(lFileOffset < lFileLength)

    file.Close();
    }//end of else if(msgRequest.iCommand == FILEDATA)

    break;
    }//end of while(1)
    closesocket(pParam->sock);
    delete pParam;
    return 0;
    }

    vc的?
    要是这里面有vc专有的类,基本上是重写.还不如vc编成dll,cb动调.<
    CB也能编译MFC。
    <
    这个问题解决了。谢谢楼上几位。
    继续问问题:

    我定义了一个CSendFileServer类,然后在这个类的某个函数里,我想用SendMessage函数,给某一个窗体,或者程序发消息,让窗体执行消息操作,怎么定义这个窗口句柄
    C的代码是在类里定义了
    //窗口指针
    CWnd* m_pWnd;

    我应该怎么改,改成:TForm* m_pWnd,但执行后,不响应消息函数<
    学习当然要学习了,但先要解决手里的问题哈哈。
    谢谢南国梨

  • Filed under: C++ Builder
  • DWORD WINAPI CSendFileServer::ThreadListen(LPVOID lpParam)
    {
    CSendFileServer* pServer = (CSendFileServer*)lpParam;
    SOCKET sockListen = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr(pServer->m_sClientIP);
    sin.sin_port = htons(pServer->m_iListenPort);

    if(bind(sockListen, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
    closesocket(sockListen);
    pServer->m_pWnd->SendMessage(WM_BINDERROR);
    return 1;
    }

    if(listen(sockListen, 5) == SOCKET_ERROR)
    {
    closesocket(sockListen);
    pServer->m_pWnd->SendMessage(WM_LISTENERROR);
    return 1;
    }

    pServer->m_pWnd->SendMessage(WM_STARTLISTEN);

    fd_set fdListen;
    timeval seltime;
    seltime.tv_sec = 0;
    seltime.tv_usec = 10000;

    while(!pServer->m_bEndListenThread)
    {
    FD_ZERO(&fdListen);
    FD_SET(sockListen, &fdListen);

    if(select(0, &fdListen, NULL, NULL, &seltime) <= 0 || !FD_ISSET(sockListen, &fdListen) )
    continue;

    int len = sizeof(sin);
    SOCKET sock = accept(sockListen, (SOCKADDR*)&sin, &len);

    PARAMRECV* pParamRecv = new PARAMRECV;
    pParamRecv->sock = sock;
    pParamRecv->ptr = pServer;

    DWORD id;
    HANDLE h = CreateThread(NULL, 0, ThreadRecv, pParamRecv, 0, &id);
    CloseHandle(h);
    }
    closesocket(sockListen);
    return 0;
    }

    //功能:接收线程
    //参数:LPVOID lpParam
    //返回:无意义
    DWORD WINAPI CSendFileServer::ThreadRecv(LPVOID lpParam)
    {
    PARAMRECV* pParam = (PARAMRECV*)lpParam;
    CSendFileServer* pServer = (CSendFileServer*)pParam->ptr;

    fd_set fdRecv;
    timeval seltime;
    seltime.tv_sec = 0;
    seltime.tv_usec = 10000;

    while(1)
    {
    FD_ZERO(&fdRecv);
    FD_SET(pParam->sock, &fdRecv);

    if(select(0, &fdRecv, NULL, NULL, &seltime) <= 0 || !FD_ISSET(pParam->sock, &fdRecv) )
    continue;

    MSGREQUEST msgRequest;
    int iRecvCnt = recv(pParam->sock, (char*)&msgRequest, sizeof(msgRequest), 0);
    if(iRecvCnt <= 0)
    break;

    //如果是请求文件列表
    if(msgRequest.iCommand == FILELIST)
    {
    pServer->m_pWnd->SendMessage(WM_SENDFILELIST, (WPARAM)&pParam->sock, 0);
    }

    //如果是请求文件数据
    else if(msgRequest.iCommand == FILEDATA)
    {
    long lFileOffset = msgRequest.lFileOffset;

    CFile file;
    BOOL bResult = file.Open(pServer->m_sFilePath, CFile::modeRead|CFile::shareDenyNone, NULL);
    if(!bResult)
    {
    break; //如果文件打开失败就终止线程
    }

    char sSendBuf[SENDSIZE];
    while(lFileOffset < msgRequest.lFileLength)
    {
    int iSeek = file.Seek(lFileOffset, CFile::begin);
    int iReadCnt = file.Read(sSendBuf, SENDSIZE);
    if(iReadCnt ==0)
    break;

    int iSendCnt = send(pParam->sock, sSendBuf, iReadCnt, 0);

    //如果发送失败就终止线程
    if(iSendCnt == -1)
    break;
    else
    {
                                            pServer->m_pWnd->SendMessage(WM_SENDFILESTATUS, (WPARAM)&msgFileStatus, 0);
                                    lFileOffset += iSendCnt;
                                    }
    }//end of while(lFileOffset < lFileLength)

    file.Close();
    }//end of else if(msgRequest.iCommand == FILEDATA)

    break;
    }//end of while(1)
    closesocket(pParam->sock);
    delete pParam;
    return 0;
    }

    vc的?
    要是这里面有vc专有的类,基本上是重写.还不如vc编成dll,cb动调.<
    CB也能编译MFC。
    <
    这个问题解决了。谢谢楼上几位。
    继续问问题:

    我定义了一个CSendFileServer类,然后在这个类的某个函数里,我想用SendMessage函数,给某一个窗体,或者程序发消息,让窗体执行消息操作,怎么定义这个窗口句柄
    C的代码是在类里定义了
    //窗口指针
    CWnd* m_pWnd;

    我应该怎么改,改成:TForm* m_pWnd,但执行后,不响应消息函数<
    学习当然要学习了,但先要解决手里的问题哈哈。
    谢谢南国梨

  • Filed under: C++ Builder
  • DWORD WINAPI CSendFileServer::ThreadListen(LPVOID lpParam)
    {
    CSendFileServer* pServer = (CSendFileServer*)lpParam;
    SOCKET sockListen = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr(pServer->m_sClientIP);
    sin.sin_port = htons(pServer->m_iListenPort);

    if(bind(sockListen, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
    closesocket(sockListen);
    pServer->m_pWnd->SendMessage(WM_BINDERROR);
    return 1;
    }

    if(listen(sockListen, 5) == SOCKET_ERROR)
    {
    closesocket(sockListen);
    pServer->m_pWnd->SendMessage(WM_LISTENERROR);
    return 1;
    }

    pServer->m_pWnd->SendMessage(WM_STARTLISTEN);

    fd_set fdListen;
    timeval seltime;
    seltime.tv_sec = 0;
    seltime.tv_usec = 10000;

    while(!pServer->m_bEndListenThread)
    {
    FD_ZERO(&fdListen);
    FD_SET(sockListen, &fdListen);

    if(select(0, &fdListen, NULL, NULL, &seltime) <= 0 || !FD_ISSET(sockListen, &fdListen) )
    continue;

    int len = sizeof(sin);
    SOCKET sock = accept(sockListen, (SOCKADDR*)&sin, &len);

    PARAMRECV* pParamRecv = new PARAMRECV;
    pParamRecv->sock = sock;
    pParamRecv->ptr = pServer;

    DWORD id;
    HANDLE h = CreateThread(NULL, 0, ThreadRecv, pParamRecv, 0, &id);
    CloseHandle(h);
    }
    closesocket(sockListen);
    return 0;
    }

    //功能:接收线程
    //参数:LPVOID lpParam
    //返回:无意义
    DWORD WINAPI CSendFileServer::ThreadRecv(LPVOID lpParam)
    {
    PARAMRECV* pParam = (PARAMRECV*)lpParam;
    CSendFileServer* pServer = (CSendFileServer*)pParam->ptr;

    fd_set fdRecv;
    timeval seltime;
    seltime.tv_sec = 0;
    seltime.tv_usec = 10000;

    while(1)
    {
    FD_ZERO(&fdRecv);
    FD_SET(pParam->sock, &fdRecv);

    if(select(0, &fdRecv, NULL, NULL, &seltime) <= 0 || !FD_ISSET(pParam->sock, &fdRecv) )
    continue;

    MSGREQUEST msgRequest;
    int iRecvCnt = recv(pParam->sock, (char*)&msgRequest, sizeof(msgRequest), 0);
    if(iRecvCnt <= 0)
    break;

    //如果是请求文件列表
    if(msgRequest.iCommand == FILELIST)
    {
    pServer->m_pWnd->SendMessage(WM_SENDFILELIST, (WPARAM)&pParam->sock, 0);
    }

    //如果是请求文件数据
    else if(msgRequest.iCommand == FILEDATA)
    {
    long lFileOffset = msgRequest.lFileOffset;

    CFile file;
    BOOL bResult = file.Open(pServer->m_sFilePath, CFile::modeRead|CFile::shareDenyNone, NULL);
    if(!bResult)
    {
    break; //如果文件打开失败就终止线程
    }

    char sSendBuf[SENDSIZE];
    while(lFileOffset < msgRequest.lFileLength)
    {
    int iSeek = file.Seek(lFileOffset, CFile::begin);
    int iReadCnt = file.Read(sSendBuf, SENDSIZE);
    if(iReadCnt ==0)
    break;

    int iSendCnt = send(pParam->sock, sSendBuf, iReadCnt, 0);

    //如果发送失败就终止线程
    if(iSendCnt == -1)
    break;
    else
    {
                                            pServer->m_pWnd->SendMessage(WM_SENDFILESTATUS, (WPARAM)&msgFileStatus, 0);
                                    lFileOffset += iSendCnt;
                                    }
    }//end of while(lFileOffset < lFileLength)

    file.Close();
    }//end of else if(msgRequest.iCommand == FILEDATA)

    break;
    }//end of while(1)
    closesocket(pParam->sock);
    delete pParam;
    return 0;
    }

    vc的?
    要是这里面有vc专有的类,基本上是重写.还不如vc编成dll,cb动调.<
    CB也能编译MFC。
    <
    这个问题解决了。谢谢楼上几位。
    继续问问题:

    我定义了一个CSendFileServer类,然后在这个类的某个函数里,我想用SendMessage函数,给某一个窗体,或者程序发消息,让窗体执行消息操作,怎么定义这个窗口句柄
    C的代码是在类里定义了
    //窗口指针
    CWnd* m_pWnd;

    我应该怎么改,改成:TForm* m_pWnd,但执行后,不响应消息函数<
    学习当然要学习了,但先要解决手里的问题哈哈。
    谢谢南国梨

  • Filed under: C++ Builder
  • #include <stdio.h>
    #include <stdlib.h>

    struct node{
    int to;
        int value;  //保存各个节点的时间参数,就是每个工序持续的时间
        node *next;
    };    //用于保存每个节点信息的结构体

    struct graph{
        node **from;
        int n;
    };    //用于保存整个网络图(AOE)信息的结构体

    //用邻接表数据结构构造网络计划图………….邻接表不懂得话,可以看看数据结构方面的书籍!
    void CreatGraph(graph &G)
    {
        printf("请输入网络计划图拥有的节点数: ");
        scanf("%d", &G.n);
        G.from = (node **)malloc(sizeof(node *) * G.n);
        for (int i=0; i <G.n; i++) { G.from[i] = NULL; }

        printf("请输入每个工序所持续的时间:
    ");
        printf("(格式:起始节点 终止节点 权值)
    ");  //通过输入信息来记录网络计划图的完整信息,保存在G这个数据结构里!
        int x, y, w;
        while (scanf("%d%d%d", &x, &y, &w) != EOF)
    {
            x–; y–;
            node *p = (node *)malloc(sizeof(node));
            p->to = y;
            p->value = w;
            p->next = G.from[x];
            G.from[x] = p;
        }
    }

    //对网络计划图进行初始化的函数
    void FindInDegree(graph &G, int indegree[])
    {
        int i;
        node *p;

        for (i=0; i <G.n; i++) { indegree[i] = 0; }
        for (i=0; i <G.n; i++) {
            for (p=G.from[i]; p; p=p->next) {
                indegree[p->to]++;
            }
        }
    }

    //拓扑排序函数(对整个网络图进行预处理,方便计算机对其进行运算)  如果对拓扑排序不懂,可以看看数据结构方面的数据!
    bool TopologicalOrder(graph &G, int ve[], int T[], int &topt)
    {
        int *indegree = (int *)malloc(sizeof(int) * G.n);
        FindInDegree(G, indegree);

        int *s = (int *)malloc(sizeof(int) * G.n);
        int tops = -1;
        for (int i=0; i <G.n; i++) {
            ve[i] = 0;
            if (indegree[i] == 0) { s[++tops] = i; }
        }

        int count = 0;
        topt = -1;
        while (tops != -1) {
            int j = s[tops–];
            T[++topt] = j;
            count++;
            for (node *p=G.from[j]; p; p=p->next) {
                int k = p->to;
                if (–indegree[k] == 0) { s[++tops] = k; }
                if (ve[j] + p->value > ve[k]) {
                    ve[k] = ve[j] + p->value;
                }
            }
        }

        if (count < G.n) return false;
        else return true;
    }

    bool CriticalPath(graph &G) //寻找关键路径的函数
    {
        int *T = (int *)malloc(sizeof(int) * G.n);
        int i, topt;
        int *ve = (int *)malloc(sizeof(int) * G.n);  //用来保存相关的时间参数
        int *vl = (int *)malloc(sizeof(int) * G.n);
        if (!TopologicalOrder(G, ve, T, topt)) return false;  //保存完整的拓扑结构,如果计划图有回路,则会运行失败!!!

        for (i=0; i <G.n; i++) {
            vl[i] = ve[G.n - 1];
        }

        while (topt != -1)  //循环取得各个网络节点的时间参数(包括最早开始时间和最迟完成时间)
    {
            int j = T[topt–];
            for (node *p=G.from[j]; p; p=p->next) {
                int k = p->to;
                if (vl[k] - p->value < vl[j]) {
                    vl[j] = vl[k] - p->value;
                }
            }
        }

        for (i=0; i <G.n; i++) {
            for (node *p=G.from[i]; p; p=p->next) {
                if (ve[i] == vl[p->to]-p->value)  //如果这个工序没有富裕的时间(通俗讲就是这个工作很紧急),结合幻灯片看!!
    {
                    printf(" <%d, %d>
    ", i+1, p->to+1);
                }
            }
        }

        return true;
    }

    //主程序
    int main()
    {
        graph G;
        CreatGraph(G);          //构造一个网络图
        printf("关键路径如下:
    ");
        CriticalPath(G);      //计算关键路径(有的时候关键路径不至一条!!!!!!!!)

        return 0;
    }很长哦,有问题的那一段放上班来呗!!我试了试,可以正常编译运行。你创建的是否Console工程?要选中Console Application才行。编译错误也得有个错误信息吧,能帖出来么?

    编译运行没什么错误,c++的console application,如果选c的话会有问题。

    至于逻辑错误,楼主自己再慢慢研究研究,代码太长了

  • Filed under: C++ Builder
  • procedure ShowInWebBrowser(WebB:TWebBrowser; Str:String);
    var
    ⠠v: Variant;
    ⠠HTMLDocument: IHTMLDocument2;
    begin
    ⠠HTMLDocument:= WebB.Document as IHTMLDocument2;
    ⠠if (Assigned(HtmlDocument)) then⠂ ⠂࠼br /> ⠠begin
    ⠂  v:= VarArrayCreate([0, 0], varVariant);
    ⠂  v[0]:= Str; //that is to be shown
    ⠂  HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
    ⠂  HTMLDocument.Close;
    ⠠end;
    end;

    学习学习,顺便围观老妖!感谢妖哥的回复,不过这个好像只能写入一条记录,不能写入多条记录。不知道你说的这个多条记录是什么东东?谢谢妖哥,已经可以写入多条字符。

  • Filed under: C++ Builder
  • unit ClientFrmMainUnit;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls,
      GlobalUnit, ExtCtrls;

    type
      TClientFrmMain = class(TForm)
        CBClientActive: TCheckBox;
        IncomingMessages: TMemo;
        Label1: TLabel;
        Client: TIdTCPClient;
        Label2: TLabel;
        EditCommand: TComboBox;
        Label3: TLabel;
        EditMessage: TEdit;
        Label4: TLabel;
        EditRecipient: TEdit;
        ButtonSend: TButton;
        edtHost: TEdit;
        Label5: TLabel;
        Timer1: TTimer;
        Button1: TButton;
        Button2: TButton;
        procedure CBClientActiveClick(Sender: TObject);
        procedure ButtonSendClick(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
      public
      end;

      TClientHandleThread = class(TThread)
      private
        CB: TCommBlock;
        procedure HandleInput;
      protected
        procedure Execute; override;
      end;

    var
      ClientFrmMain: TClientFrmMain;
      ClientHandleThread: TClientHandleThread;  // variable (type see above)

    implementation

    {$R *.DFM}

    procedure TClientHandleThread.Execute;
    begin
      while not Terminated do
      begin
        if not ClientFrmMain.Client.Connected then
          Terminate
        else
        try
          ClientFrmMain.Client.ReadBuffer(CB, SizeOf(CB));
          Synchronize(HandleInput);
        except
        end;
      end;
    end;

    procedure TClientHandleThread.HandleInput;
    begin
      if CB.Command = 'MESSAGE' then
        ClientFrmMain.IncomingMessages.Lines.Add(CB.MyUserName + ': ' + CB.Msg)
      else
        if CB.Command = 'DIALOG' then
          MessageDlg('"' + CB.MyUserName + '" sends you this message:' + #13 + CB.Msg,
                            mtInformation, [mbOk], 0)
        else  // unknown command
          MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg,
                      mtError, [mbOk], 0);
    end;

    procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
    begin
      if CBClientActive.Checked then
      begin
        Client.Host := edtHost.Text;
        try
          Client.Connect(10000);  // in Indy < 8.1 leave the parameter away
          ClientHandleThread := TClientHandleThread.Create(True);
          ClientHandleThread.FreeOnTerminate := True;
          ClientHandleThread.Resume;
        except
          on E: Exception do MessageDlg ('Error while connecting:' + #13 + E.Message,
                                          mtError, [mbOk], 0);
        end;
      end
      else
      begin
        ClientHandleThread.Terminate;
        Client.Disconnect;
      end;

      ButtonSend.Enabled := Client.Connected;
      CBClientActive.Checked := Client.Connected;
    end;

    procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
    var
      CommBlock : TCommBlock;
    begin
      CommBlock.Command      := EditCommand.Text;        // assign the data
      CommBlock.MyUserName  := Client.LocalName;
      CommBlock.Msg          := EditMessage.Text;
      CommBlock.ReceiverName := EditRecipient.Text;
      Client.WriteBuffer(CommBlock, SizeOf(CommBlock), true);
    end;

    procedure TClientFrmMain.Timer1Timer(Sender: TObject);
    begin
      ButtonSendClick(self);
    end;

    procedure TClientFrmMain.Button1Click(Sender: TObject);
    begin
      Timer1.Enabled := true;
    end;

    procedure TClientFrmMain.Button2Click(Sender: TObject);
    begin
      Timer1.Enabled := false;
    end;

    end.

    妖哥是干什么的啊
    真的好厉害!
    什么时候我也能变成高手啊  羡慕中……

  • Filed under: C++ Builder
  • 需求如下:
    在sql2005中建了一个表tPerson
    字段如下:

    字段名  字段类型 说明
    fId      int      身份证号码
    fName    char    姓名
    fPhoto  image    相片
    如何能实现把一个人的信息新增到表tPerson中?
    我用ADO数据控件
    最好用下面类似的语句
    strSql="insert into tPerson";
    strSql+=" (fId,fName,fPhoto)";
    strSql+=" values ('….');
    ADOQryExec->Close();
    ADOQryExec->SQL->Clear();
    ADOQryExec->SQL->Add(strSql);
    ADOQryExec->ExecSQL();
    期待个位老大的帮忙。。。

    int型的身份证号码?多少位数字?char的姓名?难道都叫A,B,C,D..
    –仅是为举个例子,不用严格要求  //用SQL语句插入数据库图片
      if (OpenPictureDialog1->Execute())
      {
        TMemoryStream *s = new TMemoryStream();
        s->LoadFromFile(OpenPictureDialog1->FileName);

        AnsiString strSql="insert into blob (mName,mJpg) values (:mName,:mJpg)";
        ADOQuery1->Close();
        ADOQuery1->SQL->Clear();
        ADOQuery1->SQL->Add(strSql);
        ADOQuery1->Parameters->ParamByName("mName")->Value = "姓名";
        ADOQuery1->Parameters->ParamByName("mJpg")->SetFieldType(ftBlob);
        ((TBlobField *)ADOQuery1->Parameters->ParamByName("mJpg"))->LoadFromStream(s);
        ADOQuery1->ExecSQL();
        delete s;
      }

    –经测试,ADOQuery1->Parameters->ParamByName("mJpg")->SetFieldType(ftBlob);
    这条语句有问题,大家帮忙看一下ADOQuery1->Parameters->ParamByName("mJpg")->LoadFromStream(s,ftBlob);
    //写如数据库 
      if(OpenDlg->Execute()) 
      { 
            TBlobField  *Field  =  (TBlobField*)ADOQueryAttach->FieldByName("Attach"); 
              Field->LoadFromFile(OpenDlg->FileName); 
              ADOQuery->Post(); 
      } 
       
      //从数据库读取字段 
       
      TBlobField  *Field  =  (TBlobField*)ADOQueryAttach->FieldByName("Attach"); 
      Field->SaveToFile("Your  Image  Name");  写和读基本都实现了
    但还有两个问题没弄好:
    1.如何判断Image控件上面是否有图像?
    2.TBlobField  *Field  =  (TBlobField*)ADOQueryAttach->FieldByName("Attach"); 
    该记录该字段是否有图片被保存进去,如何判断?

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档