二.在用Delphi调用MapBasic的Callback时,Delphi的函数并未被调用.我是用
Delphi中的ActiveX作为Callback类,是否能提供关于Callback的Delphi例子."。
答:我想你在Delphi中定义一个包含OLE事件的类后,应该把自己定义的Delphi函数名在这个类程序中声明一下,作为一个OLE对象(我估计这个函数是你自己的custom command),再在Delphi应用程序中用map application给这个对象赋予一个ID号,就可以调用了。我手上有一段例子,是用map application的setcallback进行调用的,copy给你,希望有所启发:
{以下这个单元用来定义包含OLE事件的类并声明你自己定义的Delphi函数名}
unit MyAuto;
interface
uses OleAuto,forms,windows,controls,messages,sysutils,classes;
type
TMyAuto = class(TAutoObject)
private
FMyProp: string;
function GetMyProp: string;
procedure SetMyProp(S: string);
public
constructor Create; override;
automated
procedure querytool(s:string); // 你自己定义的对象名
property MyProp: string read GetMyProp write SetMyProp;
end;
implementation
uses
Dialogs;
constructor TMyAuto.Create;
begin
inherited Create;
end;
procedure TMyAuto.SetMyProp(S: string);
begin
FMyProp := S;
end;
procedure TMyAuto.querytool(s:string);
begin
fgdmain.searchpoint(s); //Delphi程序中调用的函数名
end;
function TMyAuto.GetMyProp: string;
begin
Result := FMyProp;
end;
procedure RegisterMyAuto;
const
AutoClassInfo: TAutoClassInfo = (
AutoClass: TMyAuto;
ProgID: 'AUTOPROJ.MyAuto';
ClassID: '{FE67CF61-2EDD-11CF-B536-0080C72EFD43}';
Description: 'Sam';
Instancing: acInternal);
begin
Automation.RegisterClass(AutoClassInfo);
end;
initialization
RegisterMyAuto;
end.
{以下是在Delphi应用程序中调用,因程序太长,我就不全盘copy了}:
procedure Tform1.FormCreate(Sender: TObject);
var myauto1:tmyauto; mi,miresp:variant;
begin
mi:=createOleObject('mapinfo.application');
myauto1:=Tmyauto.create;
miresp:=myauto1.oleobject;
mi.do('set application window '+ intTostr(handle));
mi.setcallback (miresp); //在mbapplication中只有setcallback调用OLE对象
mi.do('Create Buttonpad "Callback" As Toolbutton ID 2001 Cursor 138 Calling OLE "QueryTool"'); //此处ID号你可任意指定。
end;
procedure Tfgdmain.searchPoint(s:string);//你自己定义的完成某种mapinfo 功能的函数,其中s 是你在图形上点击以后产生的包含x、y坐标信息的字符串。
var x,y,cmd : string;
i:integer;
mi_obj,mi_rid:string;
begin
delete(s,1,3);
i:=pos(',',s);
x:=copy(s,1,i-1);
delete(s,1,i);
i:=pos(',',s);
y:=copy(s,1,i-1);
cmd:='searchPoint( frontWindow() , ' + x + ' , ' +y+ ' )';
id:=mi.eval(cmd);
mi_obj:=mi.eval('searchinfo(1,1)');
if mi_obj='sctq_gx' then
begin
mi_rid:=mi.eval('searchinfo(1,2)');
mi.do('fetch rec '+mi_rid+' from '+mi_obj) ;
id:=mi.eval(mi_obj+'.col1');
popupmenu1.Popup(300,200);
end;
end;