C++Builder 程序员博客
26 Jul
那位大侠帮忙给一个获得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设备是我根据网上得整理得,其他得是网上得资料和一些必须得头文件,很不好找得,呵呵。
呵呵,真的很感谢啊.
24 Feb
TXXXX = class(TInterfacedObject, IOleObject, IViewObject)
private
// IOleObject
function SetClientSite(const clientSite: IOleClientSite): HResult; stdcall;
…
// IViewObject
…
end;
这样的Delphi类如何翻译为BCB的代码?
注:IOleObject, IViewObject均为COM接口。
Delphi源码可以在BCB中直接编译。
22 Feb
.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
27 Jan
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,但执行后,不响应消息函数
<
学习当然要学习了,但先要解决手里的问题哈哈。
谢谢南国梨
27 Jan
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,但执行后,不响应消息函数
<
学习当然要学习了,但先要解决手里的问题哈哈。
谢谢南国梨
27 Jan
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,但执行后,不响应消息函数
<
学习当然要学习了,但先要解决手里的问题哈哈。
谢谢南国梨
18 Jan
#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的话会有问题。
至于逻辑错误,楼主自己再慢慢研究研究,代码太长了
9 Jan
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;
学习学习,顺便围观老妖!
感谢妖哥的回复,不过这个好像只能写入一条记录,不能写入多条记录。
不知道你说的这个多条记录是什么东东?
谢谢妖哥,已经可以写入多条字符。
15 Dec
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.
妖哥是干什么的啊
真的好厉害!
什么时候我也能变成高手啊 羡慕中……
9 Dec
需求如下:
在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");
该记录该字段是否有图片被保存进去,如何判断?