На Delphi под ArcGIS 8.2

0 голосов
спросил 31 Май, 03 от ShedMaster (440 баллов) в категории Программные продукты Esri

При программирование на Delphi под ArcMap не могу получить FeatureClass

Точнее не то чтобы совсем не могу но он рождается какой-то ущербный.

Признак ущербности - не определяется поле содержащее геометрию(shape)

Помогите пожалуйста.

 

 

15 Ответы

0 голосов
ответил 02 Июнь, 03 от Andranic (2,620 баллов)

Код в студию!

0 голосов
ответил 03 Июнь, 03 от Гость (210,080 баллов)

Пожалуйста, кое-что взял из примеров выложеных на esri.com

unit kk;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

{$WARN SYMBOL_PLATFORM OFF}

 

interface

 

uses

  ComObj, ActiveX, K_TLB, StdVcl, esriCore_TLB,Graphics,Dialogs;

 

type

  TKK = class(TAutoObject, ICommand)

  private

    m_pApp : IApplication; //ArcMap application

  protected

    CommandBitmap : TBitmap; // Glyph for CommandButton

    function Get_Bitmap(out Bitmap: OLE_HANDLE): HResult; stdcall;

    function Get_Caption(out Caption: WideString): HResult; stdcall;

    function Get_Category(out categoryName: WideString): HResult; stdcall;

    function Get_Checked(out Checked: WordBool): HResult; stdcall;

    function Get_Enabled(out Enabled: WordBool): HResult; stdcall;

    function Get_HelpContextID(out helpID: Integer): HResult; stdcall;

    function Get_HelpFile(out HelpFile: WideString): HResult; stdcall;

    function Get_Message(out Message: WideString): HResult; stdcall;

    function Get_Name(out Name: WideString): HResult; stdcall;

    function Get_Tooltip(out Tooltip: WideString): HResult; stdcall;

    function OnClick: HResult; stdcall;

    function OnCreate(const hook: IDispatch): HResult; stdcall;

 

  end;

 

implementation

 

uses ComServ;

 

function TKK.Ge

0 голосов
ответил 03 Июнь, 03 от Andranic (2,620 баллов)

1) то есть как я понял pFClass не null.

2) Вы пробовали непосредственно у FeatureClass смотреть ShapeType, а не через интерфейс IFeatureLayer2.

3) Где был взят пример (ссылка)?

0 голосов
ответил 03 Июнь, 03 от ShedMaster (440 баллов)

1) то есть как я понял pFClass не null.

Ага.

2) Вы пробовали непосредственно у FeatureClass смотреть ShapeType, а не через интерфейс IFeatureLayer2.

Это как ? А вообще-то как я только не пробовал.

При работе с IFeatureLayer рушится всегда, а при IFeatureLayer2 хотя бы работает. 

3) Где был взят пример (ссылка)?

www.esri.com в разделе ArcScripts

http://arcscripts.esri.com/scripts.asp

там есть из чего выбрать.

Конкретно: Using Borland Delphi with ArcObjects

0 голосов
ответил 04 Июнь, 03 от ShedMaster (440 баллов)

 Предыдущий Исходник работает  если строку где рождается FeatureClass переписать следующим образом:
OleCheck(ipFWFact.CreateFeatureClass(Name,pFields,pCLSID,nil,esriFTSimple,NameShp,'',pOutFClass));

Тогда в выходной mdb-базе появляются все видимые слои.
Попытки что либо сделать после того как FeatureClass якобы получен терпят крах:

  if pOutFClass=nil then begin MessageDlg('pOutFClass = nil !!!',mtInformation,[mbOk],0); exit; end;
  // Здесь не вылетает то есть  pOutFClass<>nil
  //
    pOutFClass.CreateFeature(pFeature);  // А вот на этой строке и почти на любой где пытаюсь
    pPoint:=CoPoint.Create as IPoint;       // вызвать метод pOutFClass-а, вылетает...
    with pPoint do begin
      Set_X(10000);
      Set_Y(10000);
    end; { end of with }
    pFeature._Set_Shape(pPoint as IGeometry);
    pFeature.Store;

0 голосов
ответил 04 Июнь, 03 от Andranic (2,620 баллов)

1) Попробуйте пример (создание FeatureClass):

http://arcobjectsonline.esri.com/default.asp?URL=/ArcObjectsOnline/Samples/Geodatabase/Creating%20Data/CreateNewShapefile.htm

2) Попробуйте ShapeType у FeatureClass

http://arcobjectsonline.esri.com/default.asp?URL=/arcobjectsonline/componenthelp/esricore/IFeatureClass_ShapeType.htm

2) С какой ошибкой вылетает строка

pOutFClass.CreateFeature(pFeature);?

0 голосов
ответил 05 Июнь, 03 от ShedMaster (440 баллов)

На сегодняшний день FeatureClass создается. Причем какой хочу и с какими хочу полями. И даже ShapeType вроде нормально определяется. Единственно, пока не могу определить с какой ошибкой вылетает строка: pOutFClass.CreateFeature(pFeature);

0 голосов
ответил 06 Июнь, 03 от ShedMaster (440 баллов)

image Как определить код ошибки ? Result напрямую не работает.

 

0 голосов
ответил 06 Июнь, 03 от Andranic (2,620 баллов)

1) Что значит вылетает строка, просто останавливается деббагер или все-таки выводит какой-то Message-Box. 

2) Ссеcию на редактирование открывали (IWorkspaceEdit или IEditor, методы StartEditing, StopEditing, StartEditOperation, StopEditOperation) ?.

3) Проверьте не может ли использовать какой-нибудь другой процесс ваши данные, которые вы пытаетесь редактировать.

0 голосов
ответил 08 Июнь, 03 от ShedMaster (440 баллов)

1) Вылетает, это в смысле появляется диалоговое окно в ArcMap-е в котором просят извинения за предоставленные неудобства и спрашивают отправить отчет об
    ошибках компании разработчику или нет. Потом вылазит еще одно окно с пояснением что память не может быть read по такому-то адресу и все.  ArcMap умер.

2)  Да. Код основной процедуры выглядит следующим образом:

 databaseName:='FC';
  OleCheck(CreateDatabase(databaseName,pWorkspace));   //Здесь вызывается процедура создающая на диске бд-Access с именем FC.mdb в которую хочется добавить записи
  if pWorkspace=nil then begin MessageDlg('pWorkspace=nil',mtInformation,[mbOk],0);Exit;end;

  pWorkSpaceEdit:=pWorkspace as IWorkspaceEdit;
  pWorkspaceEdit.StartEditing(False);                         // Начинаем редактировать...

  pFWorkspace:=pWorkspace as IFeatureWorkspace;
  OleCheck(CreateFeatureClass(pFWorkspace,'Points',esriGeometryPoint,pPointClass,progress));  // вызываем процедуру для рождения FeatureClass в базе FC.mdb

  if RESULT<>S_OK then begin  MessageDlg('Error code '+IntToStr(Result),mtInformation,[mbOk],0); Exit; end;  // Коды ошибок 169941004, 170989556, 169941292
//  я так и не нашел что за этими кодами скрывается.
//  Теперь пытаемся создать 9 фигур типа точки во FeatureClass-е
  numberToCreate:=9;
  OleCheck(CreatePointFeatures(pPointClass,numberToCreate));  // Вызывается процедура которая добавляет во FeatureClass numberToCreate фигур типа точка

//  Stop Editing
  if  pWorkspace<>nil then begin
   pWorkspaceEdit.IsBeingEdited(FFF);
   if FFF then begin
    pWorkspaceEdit.StopEditing(True);
    pWorkspaceEdit:=nil;
   end;
  end;
 if pWorkspace<>nil then pWorkSpace:=nil;
  RESULT:=S_OK;
 except
  Result:=S_FALSE;
 end;


3) Базу я создаю новую, поэтому вряд-ли какой-нибудь процесс еще может ее использовать.

 

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