怎样修改IProvider接口里的方法?在线等待——怎么也解决不了啊,帮忙—— (100分)

  • 主题发起人 主题发起人 hongxing_dl
  • 开始时间 开始时间
H

hongxing_dl

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在接口IProvider的DataRequest方法中加入自己的一段程序,
我试过修改source/provider.pas 但没什么作用!!!!!!
请问各位富翁 具体该怎么操作?在线等待————————
 
来点代码吧?
 
怎么修改IProvider的方法呀????
各位见死不救吗?这个问题真的就那么复杂不成??????
希望明天能看到结果——谢谢!!!!!!!!!!!!!!
 
to hongxing_dl
修改之后的源代码记得把原来lib目录下的provider.dcu替换掉。
 
把lib目录及lib/debug下的provider.dcu改名成provider_BAC.dcu
然后把source/provider.pas的路径加入delphi的搜索路径里
或者干脆把source/provider.pas复制到你dpr文件的目录下
 
>wjh_wy
感谢老兄这么晚了还来回答我的问题。
还有chenshaizi老兄
我照你们的方法试过了,没用。
后来我干脆把所有provider.pas和provider.dcu都改名,但似乎还可以正常运行,不知何故,是不是还需要其他操作?
请继续关注,谢谢——
 
这事就很怪了。就照chenshaizi大侠所说,干脆把provider.pas文件跟工程文件放同一个目录,这样也不行吗,期待高手帮你解决。
 
谢谢楼上各位的关注!!!
是啊,它根本就不执行我加入的代码。
我把所有的provider.pas和provider.dcu都删了,然后在当前工程文件目录里留一个我修改后的,但问题依旧。
期待高手——————
 
我觉得最好是用继承写一个新的,修改代码的方法不可取
 
to 迷糊 老兄
如果是继承一个新的,那么我原来的程序需要改吗?我用的是三层,服务器端是不是也要修改呢?这样不是跟麻烦吗?(接口不一样了,这是我的理解),请指教
 
这样做我不信就不行,
把修改后的provider.pasy文件的路径加入到libary目录中,
provider.pasy文件的路径应该是这个样子E:/Program Files/Borland/Delphi7/Source/Vcl的,
然后把这个E:/Program Files/Borland/Delphi7/Source/Vcl目录,
在加入 路径的对话框里进行移动,
把它移动到第一个位置上,
delphi系统首先会找第一个目录下的单元文件,
这样应该是可以的
 
在编译程序的时候,如果找到Dcu文件就不会去找Pas文件,要把Dcu文件也更新呀。
 
TO chenshaizi:
试过了,确实不行。
to why_wy:
dcu是重新编译过来的
我都把所有的provider都删除了,就./Program Files/Borland/Delphi7/Source/Vcl留了我修改后的pas 和 dcu ,把自己的程序也拷贝到Program Files/Borland/Delphi7/Source/Vcl下面去了,但死活不给执行!!!!
代码就改成下面这样了:
function TProviderObject.DataRequest(Input: OleVariant): OleVariant;
begin
ShowMessage(Input);//就加上这么一句
CheckProvider;
if VarIsArray(Input) and (VarArrayHighBound(Input, 1) >= 1) and
(VarType(Input[0]) = varInteger) and (VarType(Input[1]) = varInteger) and
(Input[0] = DRSig) then
begin
case Input[1] of
DRParams: Result := FProvider.FetchParams;
DRRefresh: Result := FProvider.FetchData(Input[2]);
end;
end else
Result := FProvider.DataRequest(Input);
end;
相应的这里我也改了:
function TCustomProvider.DataRequest(Input: OleVariant): OleVariant;
begin
ShowMessage(Input);///////
if Assigned(FOnDataRequest) then
Result := FOnDataRequest(Self, Input) else
Result := NULL;
end;

请各位帮忙看看——试一试。
 
你provider.pas放同一个目录跟踪调试一下,看会不会执行到这步。
 
最后的招了,
你的DataRequest方法有没有执行,
给它正确的它不执行,我来给它个错误的看它是不是编译了,
这样
function TProviderObject.DataRequest(Input: OleVariant): OleVariant;
begin
//ShowMessage(Input);//就加上这么一句
ShowMessageAAAAAAAAAAAAAAAAAAAA(Input);
{换这一句,如果编译时提示错误了,说明是已经编译到这里了,
反之,则没有编译到这里,可能它的这个单元另外存到什么地方去了
}
CheckProvider;
if VarIsArray(Input) and (VarArrayHighBound(Input, 1) >= 1) and
(VarType(Input[0]) = varInteger) and (VarType(Input[1]) = varInteger) and
(Input[0] = DRSig) then
begin
case Input[1] of
DRParams: Result := FProvider.FetchParams;
DRRefresh: Result := FProvider.FetchData(Input[2]);
end;
end else
Result := FProvider.DataRequest(Input);
end;

 
我更改的成功了,
我是这样做的,
在E:/Program Files/Borland/Delphi7/Source/Vcl下新建了一个目录a;
然后把Provider.pas复制到a目录下,
然后把E:/Program Files/Borland/Delphi7/Source/Vcl/a目录回到到
library path的第个位置(一定要是第一个位置,可以通过移动位置达到目的)
,至于lib里的Provider.dcu我没有改名,也没有删除。
你再试一下
 
to chenshaizi:

然后把E:/Program Files/Borland/Delphi7/Source/Vcl/a目录回到到
library path的第个位置(一定要是第一个位置,可以通过移动位置达到目的)

没看懂你的意思——
请问library path在哪里修改呢?
 
我试过,确实是编译了的,但就是不执行我的代码呀!!!
to :chenshaizi
你在你的代码里面加的语句执行了的吗?
我加的ShowMessage(Input)怎么就没执行呢?而且根本就不能单步
 
现在是这样的
我试过了,如果修改服务端是可以的,因为是服务端提供的这个iprovider接口。
请问可以直接对客户端进行修改吗?调用的时候
 
你可以用OVERWRIDE,重写呀。。
 
后退
顶部