BCB6用ClientSocket进行短连接式查询,有没有优雅的方法?
如题。
以前从网上看到的并且现在在使用的方法是:
用ClientSocket->Active=true;来触发
然后在ClientSocketConnect中发送查询包,比如:
void __fastcall TMainForm::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString Account=AccBalanceGrid->Cells[0][AccLine];
if(Account.Length()>19){
ShowMessage("Account.Length()>19!");
return;
}
AnsiString SendPack=AnsiString("00351010-4343-552")+
AnsiString::StringOfChar(' ',19-Account.Length())+
Account+"001";
if(ClientSocket1->Socket->Connected ){
ClientSocket1->Socket->SendText(SendPack);
}
}
然后在ClientSocketOnRead中接受返回包,比如:
void __fastcall TMainForm::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString ReceivePack=Socket->ReceiveText();
AccBalanceGrid->Cells[1][AccLine]=ReceivePack;
}
我现在遇到的问题是,如果要连续执行查询那么必须在ClientSocketOnRead中再次触发,比如:
void __fastcall TMainForm::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString ReceivePack=Socket->ReceiveText();
AccBalanceGrid->Cells[1][AccLine]=ReceivePack;
//为了再次查询
ClientSocket->Active=false;
ClientSocket->Active=true;
}
这样的代码我觉得比较丑陋而且容易出错,请教各位能否把查询做成一个函数来单独调用,比如查询函数原形为:
void Query(const AnsiString& SendPack,AnsiString& ReceivePack);
然后在某个地方就这样调用:
for(int i=1;i<Grid->RowCount;++i){
AnsiString Send=.....;
AnsiString Receive;
Query(Send,Receive);
......
}