帮忙翻译一段代码,谢谢!!

nanhui 2003-06-19 09:23:36
在程序开头定义一个继承类,公布基类中protected的方法

type
{为方便写参数,新建了一个继承TCustomMemoryStream的类}
TMyStream = class(TCustomMemoryStream)
public
procedure SetPointer(Ptr: Pointer; Size: Longint);
end;


procedure TMyStream.SetPointer(Ptr: Pointer; Size: Integer);
begin
{公布基类的方法}
inherited;   //问题1
end;


{将客户端传过来的OleVariant还原成数据库操作控件的参数值}
procedure TTEST_DELPHI.VariantToParameters(const v: OleVariant;
p: TParameters);
var
i: Integer;
Bounds: array[0..1] of Integer;
isArr: Boolean;
TempValue: Variant;
src: PChar;   //问题2
TempStream: TMyStream; //自己定义的流类,为了将处理流类型的数据
begin
if not VarIsArray(v) then //如果当前返回为空,参数为空就直接返回  
//问题3
begin
Exit;
end;
for i := 0 to p.Count - 1 do
begin
isArr := VarIsArray(v[i]); //判断当前的数据是否为数组,因为流类型的数据是采用这种方式转化的
if (isArr) then
begin
Bounds[0] := VarArrayLowBound(v[i], 1); //读出Array数组的首序号
Bounds[1] := VarArrayHighBound(v[i], 1); //读出Array数组的尾序号
TempValue := v[i];
src := VarArrayLock(TempValue);
TempStream := TMyStream.Create; //问题4 //创建MyStream的实例
TempStream.SetPointer(src, Bounds[1] - Bounds[0] + 1); //拷贝数据
TempStream.Position := 0; //初试化流的首地址
p.Items[i].LoadFromStream(TempStream, ftBlob); //赋值数据
TempStream.Free; //释放资源
VarArrayUnLock(TempValue);
end
else
begin
p.Items[i].Value := v[i]; //非流数据的类型就直接处理
end;
end;
end;

主要存在的问题的地方均做了说明
...全文
58 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
piaohu 2003-06-20
  • 打赏
  • 举报
回复
谢谢kingcaiyao(AKing) 兄
谢谢各位
后面所说的“Variant与struct之间的转换”我已经可以解决了
我是在DELPHI中实现的,然后写成一个DLL文件让CB调用
但是在CB中如何实现,目前还不清楚,
如果您有时间的话能否帮我试一下
需要DELPHI方面的源码,我可以也帖出来
谢谢
nanhui 2003-06-19
  • 打赏
  • 举报
回复
自己UP
nanhui 2003-06-19
  • 打赏
  • 举报
回复
其实主要的问题就在这几行了
Bounds[0]=VarArrayLowBound(v[i],1);  //v[i],
Bounds[1]=VarArrayHighBound(v[i],1);
TempValue=v[i];
src=(char*)VarArrayLock(TempValue);
TempStream=new TMyStream();
nanhui 2003-06-19
  • 打赏
  • 举报
回复
TO:kingcaiyao(AKing)
首先谢谢您的帮忙,但似乎您也没有测试过
原来存在的问题,现在大多还在
如果不是这些问题,那我也就不用帖出这个帖子了

能否再帮一下,把那些问题解决了
kingcaiyao 2003-06-19
  • 打赏
  • 举报
回复
先写TMyStream类:
.h File
class TMyStream:public TCustomMemoryStream
{
private:
public:
void __fastcall SetPointer(void *Ptr,int Size);
__fastcall TMyStream();
protected:
}
.cpp File
..........
__fastcall TMyStream::TMyStream():TCustomMemoryStream()
{
..................
}

void __fastcall TMyStream::SetPointer(void *Ptr,int Size)
{
TCustomMemoryStream::SetPointer(Ptr,Size);//继承父类的行为
....................
}

void __fastcall TTestDelphi::VaraitnToParameters(const OleVariant V,TParameters* p)
{
int i,Bounds[2];
bool isArr;
Variant TempValue;
char *src;
TMyStream* TempStream;
if(VarIsArray(v)) return;
for(i=0;i<p->Count-1;i++)
{
isArr=VarIsArray(v[i]);
if(isArr)
{
Bounds[0]=VarArrayLowBound(v[i],1);
Bounds[1]=VarArrayHighBound(v[i],1);
TempValue=v[i];
src=(char*)VarArrayLock(TempValue);
TempStream=new TMyStream();
TempStream->SetPointer(src,Bounds[1]-Bounds[0]+1);
TempStream->Position=0;
p->Items[i]->LoadFromStream(TempStream,ftBlob);
VarArrayUnlock(TempValue);
delete TempStream;
}
else p->Items[i]->Value=v[i];
}
}

kingcaiyao 2003-06-19
  • 打赏
  • 举报
回复
我要下班了,晚上要复习英语,马上要考试了,至于你所说的Variant与struct之间的转换,迟点再说吧。
呵呵,下班了:)
kingcaiyao 2003-06-19
  • 打赏
  • 举报
回复
其实TMyStream只需重载一个Write函数就可以了,Seek,Read函数TCustomMemoryStream已经重载了。
nanhui 2003-06-19
  • 打赏
  • 举报
回复
已经全部解决了
class TMyStream : public TCustomMemoryStream
{
public:
void __fastcall SetPointer(void * Ptr, int Size)
{
return TCustomMemoryStream::SetPointer(Ptr,Size);
};
int __fastcall Read(void *Buffer, int Count)
{
return TCustomMemoryStream::Read(Buffer,Count);
};
int __fastcall Write(const void *Buffer, int Count) { return 0;};
__fastcall TMyStream(void) : TCustomMemoryStream() {};
__fastcall ~TMyStream() {};
};


void __fastcall TForm1::VariantToParameters(const Variant &v,TParameters *p)
{
if (!VarIsArray(v))
return;
for (int i=0; i < p->Count; i++)
{
bool isArr = v.GetElement(i).IsArray();
if (isArr)
{
int Bounds[2];
Bounds[0] = v.GetElement(i).ArrayLowBound(1);
Bounds[1] = v.GetElement(i).ArrayHighBound(1);
Variant tempValue = v.GetElement(i);
void* src = VarArrayLock(tempValue);
TMyStream *Temp = new TMyStream();
Temp->SetPointer(src,Bounds[1]-Bounds[0]+1);
Temp->Position =0;
p->Items[i]->LoadFromStream(Temp,ftBlob);
delete src;
delete Temp ;
Temp =NULL;
VarArrayUnlock(tempValue);
}
else
p->Items[i]->Value = v.GetElement(i);
}
}

谢谢kingcaiyao(AKing)
kingcaiyao 2003-06-19
  • 打赏
  • 举报
回复
第2个问题和第3个问题,很简单,你既然是读出数组的首序号,因此函数VarArrayLowBound,VarArrayHighBound中的第一个数应该是数组的首址,应该改为:
Bounds[0]=VarArrayLowBound(v,1);  
Bounds[1]=VarArrayHighBound(v,1);
第4个问题:
src应该定义成void*,因为VarArrayLock是返值类型为void*
第5个问题:
TempValue=v[i],这里出错(我想提示的错误应该是Variant::operator [](const int)' is not accessible)是因为Variant这个类并没有[]这个运算符,如果你想访问Variant数组其中的元素,应该用GetElement这个函数,应该是:TempValue=V.GetElement(i);
kingcaiyao 2003-06-19
  • 打赏
  • 举报
回复
TCustomMemoryStream是一个抽象类,它里面由pure virtual function,而你的TMyStream类并没有重载这些函数,因此你的TMyStream是一个含有pure virtual function的类,也就是abstract class(抽象类),抽象类当然不能用new运算符来进行动态创建。解决办法的是重载TCustomMemoryStream中的pure virtual function,我看了一下object pascal关于TCustomMemoryStream的源码,它本来从TStream继承下来有有三个pure virtual function,不过它自已已重载Read,Seek,而Write函数没有处理:
class TMyStream:public TCustomMemoryStreamStream
{
private:
//Add your members

public:
__fastcall TMyStream();
.............
//Other functions or procedures
protected:
void __fastcall SetPointer(void*,int);
int __fastcall Write(const void*,int);
}


.cpp File
__fastcall TMyStream::TMyStream():TCustomMemoryStream()
{
//Derive the action of parent class TStream
}
void __fastcall TMyStream::SetPointer(void*,int)
{
.............................
TCustomMemoryStream(void*,int);

}
int __fastcall TMyStream::Write(const void*,int)
{
return 0;
}

然后在应用程序中使用你的TMyStream类:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyStream *pStream=new TMyStream();
//or TStream *pStream=new TMyStream();
..................
.................
delete pStream;
}
这样,第1个问题就解决了.

nanhui 2003-06-19
  • 打赏
  • 举报
回复
谢谢了
在线等待吧
kingcaiyao 2003-06-19
  • 打赏
  • 举报
回复
To nanhui:
不好意思,我的确是随手写出来的,没有测试过,我这就去看看,sorry.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧