如何在BCB中开发多层系统(和Delphi真的不大一样)。。。(100分)

  • 主题发起人 主题发起人 springhill
  • 开始时间 开始时间
S

springhill

Unregistered / Unconfirmed
GUEST, unregistred user!
公司要用BCB做多层的开发,我是用李维的书来学习的,但公司现在只有我在做这一块的贮备工作,没有人交流,遇到了很大的困难,如下问题如何解决(例子程序):
服务端:
STDMETHODIMP TDynamicSQLDemoServerImpl::GetAllTables(VARIANT* vTables)
{
TStringList *tblList=new TStringList();
try
{
DynamicSQLDemoServer->ADOConnection1->GetTableNames(tblList);
const int tblcnt=tblList->Count;
ShowMessage(IntToStr(tblcnt));
int bounds[2]={0,tblcnt-1};
vTables=VarArrayCreate(bounds,tblcnt,varVariant);
for (int i=0;i<tblcnt;++i)
{
vTables=(Variant)tblList->Strings;
}
ShowMessage(IntToStr(VarArrayHighBound(vTables,1)));
}
__finally
{
delete tblList;
}
return S_OK;
}
客户端:
void __fastcall TForm2::btnConnectClick(TObject *Sender)
{
Variant vtblList;
SocketConnection1->Connected=true;
IDispatch* disp = (IDispatch*)(SocketConnection1->AppServer);
IDynamicSQLDemoServerDisp TempInterface((IDynamicSQLDemoServer*)disp);
TempInterface.GetAllTables(vtblList);

//ShowMessage(VarToStr(vtblList));
if (VarIsArray(vtblList))
{
ShowMessage("Is Array");
for (int i=VarArrayLowBound(vtblList,1);i<=VarArrayHighBound(vtblList,1);++i)
{
lbTables->Items->Add((&amp;vtblList));
}
}
else
{
ShowMessage("Is not Array");
}
}
没有效果,请做过多层开发的或照着李维书学习的BCBer帮我解决一下。
 
没用过bcb,不过 Variant vtblList 是不是
该改成 Variant *vtblList 这里传的应该是指针.
 
(乍一看似乎没有问题)没弄下来运行,不知道有什么问题,你仔细描述一下吧。
 
我估计是在BCB中,Variant的用法问题,我用上述方法调用服务器段的另一个方法没问题,
GetAllTables接受一个Variant*,目的是获取所有的表名,并传回客户端,在Client和Server怎么传递数据呢。
 
今天花了不少时间来做相关的例程(以前做过的程序都在公司的机器里),下面这个程序实现的是客户端获取服务器的数据库别名,并显示在ComboBox里,如果要获取数据表的表名,可参考此程序修改。
服务器端:
//IDL定义:
HRESULT _stdcall GetAliasNames([out, retval] VARIANT * Result );
//实现:
STDMETHODIMP TEasyDCOM_ServerImpl::GetAliasNames(VARIANT* Result)
//获取数据库别名列表
{
TStringList *slNames;
Variant V;
void *P;
slNames = new TStringList;
try{
Session->GetAliasNames(slNames);
V = VarArrayCreate(OPENARRAY(int, (0, slNames->Text.Length())), varByte);
P = VarArrayLock(V);
memcpy(P, slNames->Text.c_str(), slNames->Text.Length());
VariantCopy(Result, V);
}__finally{
VarArrayUnlock(V);
delete slNames;
}
return S_OK;
}
//客户端:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int iLen;
Variant V;
TMemoryStream *ms;
void *P;
TCOMIEasyDCOM_Server Obj;
Obj = CoEasyDCOM_Server::Create();
V = Obj->GetAliasNames();
iLen = VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1)+1;
P = VarArrayLock(V);
ms = new TMemoryStream;
try{
ms->WriteBuffer(P, iLen);
ms->Position = 0;
ComboBox1->Items->LoadFromStream(ms);
}__finally{
VarArrayUnlock(V);
delete ms;
}
}
 
1.照李维的书去学
2.李维讲的也不全对,必须亲自试验.
3.bcb有一些bug,比如:分页查询,javascript例程不完善等等.
综上所述:必须有一定的bcb基础,必须对别人的程序有判断能力.
有的路走不通应学会变通.必要时应具备修改系统的能力.总之,
慢慢来,不要急.
 
后退
顶部