Delphi窗体重用(100分)

  • 主题发起人 主题发起人 gxsh
  • 开始时间 开始时间
G

gxsh

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Delphi中做了一个窗体放了一个ADOQuery,一个DataSource等其它控件,编译成一个DLL,
ADOQuery从外部接受连接字符串及SQL字符串,并连接到指定数据库查询相应的记录,
在Delphi调用通过,在VB中调用时总是提示“无效的连接或连接字符串”,然后出现DLL中的窗体及另一个提示:
“ADOQuery1 不能在一个已关闭的数据集上执行该操作”后退出,谁能帮我?

//DLL 主代码
unit main;

interface

uses
forms,Windows,Db, ADODB, Graphics, Classes, Controls,
StdCtrls, ExtCtrls,ReportControl;
type
TfrmRepView = class(TForm)
ReportRunTime1: TReportRunTime;
Label1: TLabel;
Image1: TImage;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
procedure FormActivate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
private

public

end;

var
frmRepView: TfrmRepView;
ADOConn:WideString;
ADOSQL:String;
function cRepView (conn:PChar;SQL:PChar):Boolean;stdcall;


implementation

{$R *.DFM}

function cRepView (conn:PChar;SQL:PChar):Boolean;

begin
ADOConn:= conn;
ADOSQL:=SQL;
frmRepView:=TfrmRepView.Create(nil);
try
Result:=(frmRepView.ShowModal=mrOK);
finally
frmRepView.Free;
end;
end;

procedure TfrmRepView.FormActivate(Sender: TObject);
begin
Application.ProcessMessages;
ReportRunTime1.SetDataset('d1',ADOQuery1);
ReportRunTime1.printpreview(true);
end;


procedure TfrmRepView.FormPaint(Sender: TObject);
begin
close;
end;

procedure TfrmRepView.FormCreate(Sender: TObject);
begin
with ADOQuery1 do
begin
SQL.Clear;
Close;
ConnectionString:= ADOConn;
SQL.Text:= ADOSQL;
ADOQuery1.Open;
end;
With ReportRunTime1 Do
begin
setdataset('d1',ADOQuery1);
reportfile:='c:/temp/meitong.ept';
enableedit:=true;
end;
end;


我在VB中是这样调用的:
'声名部分
Private Declare Function cRepView Lib "cRepView.dll" (ByVal conn As String, ByVal SQL As String)

'调用
Call cRepView("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/Temp/nanwei.mdb;Persist Security Info=False", _
"Select * From aa")
 
应该是函数的定义有问题,把pchar改为
type mystr=array[0..255] of char

function cRepView (conn:mystr;SQL:mystr):Boolean;

你可在
ADOConn:= conn;
ADOSQL:=SQL;
语句后面把conn、sql的值看一下有没有错
 
错了,是声明错了
'声名部分
Private Declare Function cRepView Lib "cRepView.dll" (ByVal conn As String, ByVal SQL As String)
应改为
Private Declare Function cRepView Lib "cRepView.dll" (ByVal conn As String, ByVal SQL As String) As Boolean

既函数的返回类型应定义, 加As Boolean
 
真是不好意思,是我自己粗心,声明错了,现在OK了,再多加几个参数就可以在VB中
正常使用 eReport 了。
因为为了简化调试我直接在DLL中指定了报表文件路径,结果在VB中调试时程序路径
与报表路径不符合,所以调试时总出错,一直怀疑DLL出问题,就没留意声明部分。
 
Private Declare Function cRepView Lib "cRepView.dll" (ByVal conn As String, ByVal SQL As String)
声明的变量类型,不匹配,显然是CONN出错
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
598
SUNSTONE的Delphi笔记
S
后退
顶部