二.在用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;