Почему ошибка при формировании интерфейса?

0 голосов
спросил 22 Апр, 10 от dmitry12081973 (1,920 баллов) в категории Программные продукты Esri
Здравствуйте.
Подскажите, пожалуйста, что я не так делаю.

Создаю COM-объект в Delphi 7, при этом получаю автоматически с помощью делфиевского окна "COM Object Wizard" следующий код:

unit MAPCOMServerInit;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, MAPCOMServer_TLB, StdVcl, esriSystemUI_TLB;

type
  TMAPCOMServerDima = class(TAutoObject, ICommand)
  protected
    function Get_Caption: WideString; safecall;
    function Get_Category: WideString; safecall;
    function Get_Checked: WordBool; safecall;
    function Get_Enabled: WordBool; safecall;
    function Get_HelpContextID: Integer; safecall;
    function Get_HelpFile: WideString; safecall;
    function Get_Message: WideString; safecall;
    function Get_Name: WideString; safecall;
    function Get_Tooltip: WideString; safecall;
    function Get_Bitmap: OLE_HANDLE; safecall;
    procedure OnClick; safecall;
    procedure OnCreate(const hook: IDispatch); safecall;
  end;

implementation

uses ComServ;

function TMAPCOMServerDima.Get_Caption: WideString;
begin
end;

function TMAPCOMServerDima.Get_Category: WideString;
begin
end;

function TMAPCOMServerDima.Get_Checked: WordBool;
begin
end;

function TMAPCOMServerDima.Get_Enabled: WordBool;
begin
end;

function TMAPCOMServerDima.Get_HelpContextID: Integer;
begin
end;

function TMAPCOMServerDima.Get_HelpFile: WideString;
begin
end;

function TMAPCOMServerDima.Get_Message: WideString;
begin

end;

function TMAPCOMServerDima.Get_Name: WideString;
begin
end;

function TMAPCOMServerDima.Get_Tooltip: WideString;
begin
end;

function TMAPCOMServerDima.Get_Bitmap: OLE_HANDLE;
begin
end;

procedure TMAPCOMServerDima.OnClick;
begin
end;

procedure TMAPCOMServerDima.OnCreate(const hook: IDispatch);
begin
end;

initialization
  TAutoObjectFactory.Create(ComServer, TMAPCOMServerDima, Class_MAPCOMServerDima,
    ciMultiInstance, tmApartment);

В результате компиляции этого кода выдаётся ошибка:
Declaration of 'Get_Bitmap' differs from declaration in interface 'ICommand'

Смотрю исходный код файла esriSystemUI_TLB.pas, в котором этот ICommand объявлен и который соответственно взят в качестве предка для моего класса, вижу:

  ICommand = interface(IUnknown)
    ['{36B06538-4437-11D1-B970-080009EE4E51}']
    function Get_Enabled: WordBool; safecall;
    function Get_Checked: WordBool; safecall;
    function Get_Name: WideString; safecall;
    function Get_Caption: WideString; safecall;
    function Get_Tooltip: WideString; safecall;
    function Get_Message: WideString; safecall;
    function Get_HelpFile: WideString; safecall;
    function Get_HelpContextID: Integer; safecall;
    function Get_Category: WideString; safecall;
    procedure OnCreate(const hook: IDispatch); safecall;
    function Get_Bitmap: OLE_HANDLE; safecall;
    procedure OnClick; safecall;
    property Enabled: WordBool read Get_Enabled;
    property Checked: WordBool read Get_Checked;
    property Name: WideString read Get_Name;
    property Caption: WideString read Get_Caption;
    property Tooltip: WideString read Get_Tooltip;
    property Message: WideString read Get_Message;
    property HelpFile: WideString read Get_HelpFile;
    property HelpContextID: Integer read Get_HelpContextID;
    property Bitmap: OLE_HANDLE read Get_Bitmap;
    property Category: WideString read Get_Category;
  end;

То есть объявление функции Get_Bitmap точно такое же, как и в моём классе TMAPCOMServerDima.

Почему тогда ругается компилятор?

39 Ответы

0 голосов
ответил 28 Апр, 10 от dmitry12081973 (1,920 баллов)
Вы знаете, скорее всего у меня не получается нарисовать что-то в векторном слое World Time Zones, потому что он не отображается в компоненте TMapControl.
Может это в свою очередь из-за того, что использую нелицензионные компоненты, TMapControl в том числе?
0 голосов
ответил 28 Апр, 10 от pooperec (10,820 баллов)
оО
Так... Давайте по порядку...
А вернее, код в студию пожалуйста!
0 голосов
ответил 28 Апр, 10 от dmitry12081973 (1,920 баллов)
Я подумал, что лучше весь проект представить.
Отослал проект по адресу
http://floomby.ru/content/rUzkWzMJ4U/
0 голосов
ответил 28 Апр, 10 от pooperec (10,820 баллов)
1. Добавьте на форму компонент TLicenseControl, MapControl об этом Вас настоятельно просит.
2. Уберите 99% юнитов из uses, там реально нужен только esriControls_TLB, esri_System_TLB, esri_SystemUI_TLB.


В методах Get_xxxx в инструменте, пропишите Result:= то что нужно (по обстоятельствам), так как потом из-за этого бока могут быть...

Код инструмента рабочий...
0 голосов
ответил 28 Апр, 10 от dmitry12081973 (1,920 баллов)
Огромное спасибо, буду разбираться, как поставить лицензию
0 голосов
ответил 02 Май, 10 от dmitry12081973 (1,920 баллов)
Скажите, пожалуйста, можно ли корректно поставить лицензию для этих делфиевских компонентов, если у меня уже есть лицензия на установленный пакет ArcGIS, который содержит ArcCatalog, ArcGlobe, ArcMap, ArcReader, ArcScene и Desktop Administrator? Или для этого требуется отдельная лицензия?
0 голосов
ответил 05 Май, 10 от pooperec (10,820 баллов)
Дмитрий, ответ я Вам давал
тут - https://forum.esri-cis.ru/index.php?qa=35549
тут - http://gis-lab.info/forum/viewtopic.php?f=16&t=5183&start=0
и повторюсь, пожалуй снова.

Для разработки своего приложения с использованием визуальных компонентов Вам необходима лицензия разработчика которая называется ArcGIS Engine Developer Kit license file. Ключ в файле лицензии называется "designer".

Вот здесь очень много интересного - http://forum.ru-board.com/forum.cgi?forum=35

Вам стоит зайти туда и там найти ответ на свой вопрос.

Или просто воспользоваться поиском Гугла по китайским сайтам...
0 голосов
ответил 25 Май, 10 от dmitry12081973 (1,920 баллов)
У меня всё получилось по поводу лицензии, спасибо SmileSmileSmile.

Загрузил в MapControl слой "World Time Zones", всё нормально до строки кода, который я прикреплял

FeatureCount := pFeatClass.FeatureCount(pQFilt);

В этой строке компилятор выдаёт ошибку:

image

Почему так происходит?
0 голосов
ответил 25 Май, 10 от pooperec (10,820 баллов)
if pQFilt<>nil then
if pFeatClass<>nil then
полный кусок кода пожалуйста.
0 голосов
ответил 25 Май, 10 от dmitry12081973 (1,920 баллов)
Я присылал Вам ранее этот код, вот он:

procedure TMAPCOMServer_Class.OnClick;
var
  pDoc: IMxDocument;
  pLayer: ILayer;
  pFeatLayer: IFeatureLayer;
  pFeature: IFeature;
  pFeatClass: IFeatureClass;
  pGeometry: IGeometry;
  pPointcoll: IPointCollection;
  pQFilt: IQueryFilter;
  pPoint: IPoint;
  pFeatCur: IFeatureCursor;
  FeatureCount: Integer;
  PointCount: Integer;
  PointCoordinates: String;
  Uniq_Code: String;
  FieldIndex: Integer;
  i: Integer;

  ipFWFact : IFeatureWorkspace;
  Name : string;
  pFields : IFields;

  count : integer;
  s : string;
begin
  pLayer := phook.FocusMap.Layer[0];

  s := pLayer.Name;

  pFeatLayer := pLayer as IFeatureLayer;

  s := pFeatLayer.Name;

  count := phook.FocusMap.LayerCount;

  pQFilt := CoQueryFilter.Create as IQueryFilter;
  pQFilt.WhereClause := 'FID >= 0';
  ShowMessage(pQFilt.WhereClause);

  pFeatClass := pFeatLayer.FeatureClass;

  try
  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    FeatureCount := pFeatClass.FeatureCount(pQFilt); //вот тут эта ошибка возникает
  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  except
    on e: exception do ShowMessage(e.Message);
  end;

  ShowMessage('Feature Count is      ' + IntToStr(FeatureCount));

  pFeatCur := pFeatLayer.FeatureClass.Search(pQFilt, False);
  pFeature := pFeatCur.NextFeature;

  repeat
    pGeometry := pFeature.Shape;
    pGeometry.QueryInterface(IID_IPointCollection, pPointcoll);
    FieldIndex := pFeature.Fields.FindFieldByAliasName('Uniq_Code');
    Uniq_Code := pFeature.Value[FieldIndex];
    PointCount := pPointcoll.PointCount;
    ShowMessage( Uniq_Code + '      ' + IntToStr(PointCount - 1) );
    PointCoordinates := '';
    For i := 0 To PointCount - 1 do
    begin
      pPoint := pPointcoll.Point;
      PointCoordinates := PointCoordinates + FloatToStr(pPoint.X) + '   ' + FloatToStr(pPoint.Y) + #13#10;
    end;
    ShowMessage(PointCoordinates);
    pFeature := pFeatCur.NextFeature;
  Until pFeature = nil;
end;

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...