Delphi真的走下坡路了,没人能回答这些问题了----没人能帮我了吗 ( 积分: 100 )

  • 主题发起人 主题发起人 chinazxy2008
  • 开始时间 开始时间
一,我把局部变量放在全局中申明问题依然存在,<br><br>var&nbsp;testPro&nbsp;:&nbsp;TDataSetProvider;<br><br>二:TDataSetProvider.Create(这里传入的应该是远程数据模块对象);<br>&nbsp;&nbsp;&nbsp;我在创建的时是在远程数据模块对象中创建的,且用Self.可以弹出数据模块中的其它Provider对象.<br><br>三,我在服务端写了测试代码,对象是创建成功了的,但就是客户端看不到动态创建的Provider,引用报的错误同样存在[:)]
 
&quot;我在创建的时是在远程数据模块对象中创建的,且用Self.可以弹出数据模块中的其它Provider对象.&quot;<br>你的意思是,同样是动态创建的Provide对象,其他地方创建的可以正常使用,就这里创建的不可以正常使用?<br>还应该注意的是Provide的创建应该是在调用函数调用之前。
 
chinazxy2008:<br>&nbsp;&nbsp;没看到我的回复吗?
 
在远程数据模模块中静态创建的可以正常访问,<br><br>且我Self.RegisterProvider(testPro);也注册了的,问题依然存在
 
我测试时发现问题了,在创建的方法中测试了,创建对象成功,但在退出创建方法后对象不存在了,请问怎么样回事
 
动态创建的对象作用域在一个客户的会话中,&nbsp;会话中断,&nbsp;应该被清除了吧.
 
一,我把局部变量放在全局中申明问题依然存在,<br>var&nbsp;testPro&nbsp;:&nbsp;TDataSetProvider;<br><br>testPro还要和testQr关联,&nbsp;应该两个变量都放在同一位置吧?&nbsp;我想最好在数据单元中.&nbsp;而不是全局变量<br>&nbsp;&nbsp;testPro&nbsp;:&nbsp;TDataSetProvider;<br>&nbsp;&nbsp;testQr&nbsp;:&nbsp;TQuery;
 
testPro&nbsp;:&nbsp;TDataSetProvider;<br>&nbsp;&nbsp;testQr&nbsp;:&nbsp;TQuery;<br><br>我是把这两个放在单元中了,也是一样,还有,只要我没有断开连接应该对象还是存在吧
 
建议你写多一个方法返回一份所有TDataSetProvider实例的名称,比较一下就知道是否成功创建了,是不是。
 
我写了,在创建对象的方法内是已经创建成功了,但又调用另一方法获取时对象不存在了,我在想为什么方法结束对象也跟着消失了呢
 
testPro&nbsp;:=&nbsp;TDataSetProvider.Create(Self);//似乎不能这样创建<br>改成<br>testPro&nbsp;:=&nbsp;TDataSetProvider.Create(FTempForm);//FTempForm是一个窗体实例
 
创建的方法是在远程数据模板中的,如果不写成testPro&nbsp;:=&nbsp;TDataSetProvider.Create(Self);的话,就提示引入本数据模板单元,引入本单编译又有问题
 
这个问题真的很难吗
 
这样吧,你在你的远程数据对象中声明多一个List对象,用来装你创建的TDataSetProvider对象,相信这样的话,它就肯定不会因为引用归零而自动释放了。
 
http://topic.csdn.net/t/20020429/21/690087.html<br>不知道这个有没有用?<br>另外,testQr没有Open不知道有没有关系?
 
Unit&nbsp;uTest;<br><br>interface<br><br>uses&nbsp;SysUtils,&nbsp;Classes,&nbsp;InvokeRegistry,&nbsp;Midas,&nbsp;SOAPMidas,&nbsp;SOAPDm,&nbsp;Provider,&nbsp;IniFiles,<br>&nbsp;&nbsp;DB,&nbsp;DBTables,DBClient;<br><br>type<br>&nbsp;&nbsp;Itest&nbsp;=&nbsp;interface(IAppServerSOAP)&nbsp;&nbsp;//IInvokable&nbsp;&nbsp;IAppServerSOAP<br>&nbsp;&nbsp;&nbsp;&nbsp;['{583E1D57-AD4B-4D0C-8CD0-C39DC77A94AA}']<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function&nbsp;&nbsp;sFunIniProvider(Name&nbsp;:&nbsp;string)&nbsp;:&nbsp;Boolean&nbsp;;&nbsp;StdCall;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;&nbsp;preGetProvider;&nbsp;StdCall;<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;TTest&nbsp;=&nbsp;class(TSoapDataModule,&nbsp;Itest,&nbsp;IAppServerSOAP,&nbsp;IAppServer)<br>&nbsp;&nbsp;&nbsp;&nbsp;qrM:&nbsp;TQuery;<br>&nbsp;&nbsp;&nbsp;&nbsp;dspM:&nbsp;TDataSetProvider;<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;public<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function&nbsp;&nbsp;sFunIniProvider(Name&nbsp;:&nbsp;string)&nbsp;:&nbsp;Boolean&nbsp;;&nbsp;StdCall;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;&nbsp;preGetProvider;&nbsp;StdCall;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;end;<br><br>implementation<br>&nbsp;uses&nbsp;Connect,&nbsp;ServerDll;<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;testPro&nbsp;:&nbsp;TDataSetProvider;<br>&nbsp;&nbsp;&nbsp;&nbsp;testQr&nbsp;:&nbsp;TQuery;<br><br>{$R&nbsp;*.DFM}<br><br>procedure&nbsp;TtestCreateInstance(out&nbsp;obj:&nbsp;TObject);<br>begin<br>&nbsp;obj&nbsp;:=&nbsp;Ttest.Create(nil);<br>end;<br><br>{&nbsp;Tdbest&nbsp;}<br><br>function&nbsp;TTest.sFunIniProvider(Name:&nbsp;string):&nbsp;Boolean;<br>begin<br>&nbsp;&nbsp;if&nbsp;FindComponent('dsp'+Name)&nbsp;=&nbsp;nil&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;FindComponent('qr'+Name)&nbsp;=&nbsp;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testQr&nbsp;:=&nbsp;TQuery.Create(Self);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;:=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testQr.Name&nbsp;:=&nbsp;'qr'+Name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testQr.DatabaseName&nbsp;:=&nbsp;'hnjtBase';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testQr.SQL.Text&nbsp;:=&nbsp;Uppercase('select&nbsp;*&nbsp;from&nbsp;zxy_TestM');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPro&nbsp;:=&nbsp;TDataSetProvider.Create(Self);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;:=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPro.Name&nbsp;:=&nbsp;'dsp'+Name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPro.DataSet&nbsp;:=&nbsp;testQr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPro.Exported&nbsp;:=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testPro.Constraints&nbsp;:=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Self.RegisterProvider(testPro);<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;True;<br>end;<br><br>procedure&nbsp;TTest.preGetProvider;<br>var<br>&nbsp;&nbsp;Fileini&nbsp;:&nbsp;TInifile;<br>&nbsp;&nbsp;i&nbsp;:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;FileIni:=tinifile.Create('D:/Provider.ini');<br>&nbsp;&nbsp;except<br>&nbsp;&nbsp;End;<br>&nbsp;&nbsp;For&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;Self.ComponentCount&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;Fileini.WriteString('Provider','Pro'+&nbsp;IntToStr(i),Self.Components.Name);<br>&nbsp;&nbsp;FileIni.Free;<br>end;<br><br>initialization<br>&nbsp;&nbsp;&nbsp;dmConnect&nbsp;:=&nbsp;TdmConnect.Create(Nil);<br>&nbsp;&nbsp;&nbsp;InvRegistry.RegisterInvokableClass(TTest,&nbsp;TtestCreateInstance);<br>&nbsp;&nbsp;&nbsp;InvRegistry.RegisterInterface(TypeInfo(Itest));<br>finalization<br>&nbsp;&nbsp;&nbsp;dmConnect.Free;<br>end.
 
问题还没解决
 
谁来帮帮我啊
 
你這個在服務端動態創建的實例會在客戶端調用後這個實例也就銷毀了,<br>你應該在調用後把這個動態創建的實例以參數形式返回給客戶端才行啊。<br>那麼就給客端真正動態創建了個實例啊。<br>測試下吧&nbsp;。
 
请教楼上的,是把动态创建的对象的名字返回给客户端还是对象返回给客户端,因为客户端的TClientDataSet.Provider&nbsp;主需要Provider&nbsp;的名字就可以了
 

Similar threads

后退
顶部