H
hanyongjian
Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个单元文件ImageEditDlg,其中有一全局过程为
procedure EditDBImage(ASource: TDataSource; AField: ShortString);
起先,我将ImageEditDlg单元文件添加到应用程序中去运行,可以使用EditDBImage
过程弹出一窗口对ASource数据源的AField图像字段进行编辑。现在的问题是,由于对
图像编辑的功能使用得比较少。所以我将ImageEditDlg单元单独放到一个DLL库中去由
应用程序动态调用。但运行时仅弹出一个窗口,而看到不图像。窗口的基本功能不变,
就是不能够从数据集读取图像或将图像保存到数据集中去。
谁能够提示一下错误的原因。
部分程序代码如下:
应用程序:
ImageEditDlg.EditDBImage(ASource, AField);
//以上过程弹出一个窗口,可以对ASource中的AField图像字段进行编辑。
//后将原过程更改为使用DLL库。
TEditDBImageProc = procedure(AHandle: THandle; ASource: TDataSource; AField: ShortString); StdCall;
EDLLLoadError = class(Exception);
procedure EditDBImage(ASource: TDataSource; AField: ShortString); //编辑图形字段
implementation
//-----------------------------------------------------------------------------
procedure EditDBImage(ASource: TDataSource; AField: ShortString); //编辑图形字段
var
LibHandle: THandle;
EditProc: TEditDBImageProc;
begin
LibHandle := LoadLibrary('EditDBImage.DLL');
try
if LibHandle = HINSTANCE_ERROR then
raise EDLLLoadError.Create('找不到EditDBImage.DLL文件!');
@EditProc := GetProcAddress(LibHandle, 'EditImage');
if (@EditProc = nil) then
raise Exception.Create('GetProcAddress调用失败,错误代码是:' + IntToStr(GetLastError))
else
EditProc(Application.Handle, ASource, AField);
finally
FreeLibrary(LibHandle);
end;
end;
//以上过程仅弹出一个窗口,但却见不到图像,新添加的图像也保存不到数据集中去。
ImageEditDlg单元文件中的一些定义:
procedure EditImage(AHandle: THandle; ASource: TDataSource; AField: ShortString);StdCall;
procedure EditDBImage(ASource: TDataSource; AField: ShortString);
exports EditImage;
implementation
//-----------------------------------------------------------------------------
procedure EditImage(AHandle: THandle; ASource: TDataSource; AField: ShortString);StdCall;
begin
Application.Handle := AHandle;
EditDBImage(ASource, AField);
end;
//-----------------------------------------------------------------------------
procedure EditDBImage(ASource: TDataSource; AField: ShortString);
//编辑ASource中的AField图片字段。
var
DlgImage: TDlgImageEdit;
begin
DlgImage := TDlgImageEdit.Create(Application);
with DlgImage do
try
dbeImage.DataSource := ASource;
dbeImage.DataField := AField;
ShowModal;
finally
Free;
end;
end;
procedure EditDBImage(ASource: TDataSource; AField: ShortString);
起先,我将ImageEditDlg单元文件添加到应用程序中去运行,可以使用EditDBImage
过程弹出一窗口对ASource数据源的AField图像字段进行编辑。现在的问题是,由于对
图像编辑的功能使用得比较少。所以我将ImageEditDlg单元单独放到一个DLL库中去由
应用程序动态调用。但运行时仅弹出一个窗口,而看到不图像。窗口的基本功能不变,
就是不能够从数据集读取图像或将图像保存到数据集中去。
谁能够提示一下错误的原因。
部分程序代码如下:
应用程序:
ImageEditDlg.EditDBImage(ASource, AField);
//以上过程弹出一个窗口,可以对ASource中的AField图像字段进行编辑。
//后将原过程更改为使用DLL库。
TEditDBImageProc = procedure(AHandle: THandle; ASource: TDataSource; AField: ShortString); StdCall;
EDLLLoadError = class(Exception);
procedure EditDBImage(ASource: TDataSource; AField: ShortString); //编辑图形字段
implementation
//-----------------------------------------------------------------------------
procedure EditDBImage(ASource: TDataSource; AField: ShortString); //编辑图形字段
var
LibHandle: THandle;
EditProc: TEditDBImageProc;
begin
LibHandle := LoadLibrary('EditDBImage.DLL');
try
if LibHandle = HINSTANCE_ERROR then
raise EDLLLoadError.Create('找不到EditDBImage.DLL文件!');
@EditProc := GetProcAddress(LibHandle, 'EditImage');
if (@EditProc = nil) then
raise Exception.Create('GetProcAddress调用失败,错误代码是:' + IntToStr(GetLastError))
else
EditProc(Application.Handle, ASource, AField);
finally
FreeLibrary(LibHandle);
end;
end;
//以上过程仅弹出一个窗口,但却见不到图像,新添加的图像也保存不到数据集中去。
ImageEditDlg单元文件中的一些定义:
procedure EditImage(AHandle: THandle; ASource: TDataSource; AField: ShortString);StdCall;
procedure EditDBImage(ASource: TDataSource; AField: ShortString);
exports EditImage;
implementation
//-----------------------------------------------------------------------------
procedure EditImage(AHandle: THandle; ASource: TDataSource; AField: ShortString);StdCall;
begin
Application.Handle := AHandle;
EditDBImage(ASource, AField);
end;
//-----------------------------------------------------------------------------
procedure EditDBImage(ASource: TDataSource; AField: ShortString);
//编辑ASource中的AField图片字段。
var
DlgImage: TDlgImageEdit;
begin
DlgImage := TDlgImageEdit.Create(Application);
with DlgImage do
try
dbeImage.DataSource := ASource;
dbeImage.DataField := AField;
ShowModal;
finally
Free;
end;
end;