• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Вызов библиотеки матриалов из под Delphi

Автор strls, 19.10.09, 21:45:13

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

strls

Не так давно начал писать на Delphi под Компас.
Возникла необходимость сделать следующее - пользователь в среде Компас запускает мое приложение, которое, в свою очередь, запускает библиотеку материалов. Пользователь выбирает в библиотеке материал, сортамент и передает его моему приложению.
Подскажите пожалуйста, можно ли из своего приложения таким образом работать с библиотекой материалов.

Prog2

Да, можно. Как-то возникла необходимость реализовать то же самое, но в Builder'е.


#include "BOSimple_TLB.h"
#include "Materials_TLB.h"
//---------------------------------------------------------------------------
// По щелчку на кнопке вызывается окно МиС.

void __fastcall TForm1::Button1Click(TObject *Sender)
{

  BOSimpleProviderPtr BOMat;
  WideString wstClassID, wstObjectID;
  int inOptions;
  inOptions = 0;

  BOMat = CreateComObject( CLSID_BOSimpleProvider ) ;
  if (BOMat->Status == 0)
  {
     ShowMessage("Тест выполнен успешно ! ");
  }

  else if (BOMat->Status == 1 ) ShowMessage("Ошибка подключения к базе данных материалов ! ");
  else if (BOMat->Status == 2 )  ShowMessage("Ошибка подключения к базе данных единиц измерения ! ");
  else if (BOMat->Status == 4 ) ShowMessage("Ошибка подключения к диспетчеру доступа ! ");
  else if (BOMat->Status > 4 ) ShowMessage("Ошибка  Код= "+IntToStr (BOMat->Status));



  inOptions = optGetProperties; // свойство "Показать свойства обьекта"

  wstLocation = "";

  BOMat->Select(true, // true - модальное окно выбора обьекта, false - не модальное.
               &wstLocation, // Location обьекта
               (long)Handle);   // Указатель окна

  // Получить информацию об обьекте
  BOMat->GetObjectInfo(wstLocation, &wstClassID, &wstObjectID);


  // Заголовок запроса
  BOMat->Request->set_Topic((WideString)"properties");

  // Атрибут запроса на получение свойств
  BOMat->Request->Attributes->Add((WideString)"Action", (WideString)"get");

  // Атрибут запроса ClassID
  BOMat->Request->Attributes->Add((WideString)"ClassID", wstClassID);

  // Атрибут запроса ObjectID
  BOMat->Request->Attributes->Add((WideString)"ObjectID", wstObjectID);

  BOMat->ExecuteRequest();


  if (BOMat->Response->Count > 0)
  {
    AnsiString res=BOMat->Response->get_Item(0)->DisplayName;
    res+=" класс ";
    res+=BOMat->Response->get_Item(0)->ClassID;
    ShowMessage( res );
  }

  // Парсим результат
  TreeView1->Items->Clear();
  ParseObjects(TreeView1, BOMat->Response, NULL);
 
}

//------------------------------------------------------------------------------

TTreeNode* TForm1::AddNode(TTreeView *TreeView, const AnsiString stMessage, TTreeNode *tnParentNode)
{
  TTreeNode *Result = TreeView->Items->AddChild(tnParentNode, stMessage);
  return Result;
}

//------------------------------------------------------------------------------
// Парсим коллекцию обьектов
//------------------------------------------------------------------------------

void TForm1::ParseObjects(TTreeView *TreeView, IBOObjectCollection *OC, TTreeNode *tnObjectNode)
{
  int i;
  IBOObject *O;
  TTreeNode *tnNode, *tnAttributes;
  AnsiString tmpStr;

  for(i=0; i<OC->Count; ++i)
  {
    O = OC->get_Item(i);

    tmpStr="";
    tmpStr+="Объект";
    tmpStr+=O->ObjectID;
    tmpStr+="класса";
    tmpStr+=O->ClassID;

    tnNode = AddNode(TreeView, tmpStr, tnObjectNode);

    tmpStr="";
    tmpStr+="DisplayName = ";
    tmpStr+=O->DisplayName;
    AddNode(TreeView, tmpStr, tnNode);

    if (O->Attributes->Count > 0)
    {
      tnAttributes = AddNode(TreeView, "Атрибуты", tnNode);
      ParseAttributes(TreeView, O->Attributes, tnAttributes);
    } 
    ParseObjects(TreeView, O->Objects, tnNode);

  }
}

//------------------------------------------------------------------------------
// Парсим коллекцию атрибутов
//------------------------------------------------------------------------------

void TForm1::ParseAttributes(TTreeView *TreeView, IBOAttributeCollection *AC, TTreeNode *tnObjectNode)
{
  int i;
  IBOAttribute *A;
  TTreeNode *tnChildNode;
  AnsiString tmpStr;

  for (i=0; i<AC->Count; ++i)
  {
    A = AC->get_Item(i);

    tmpStr="";
    tmpStr+="Name =";
    tmpStr+=A->Name;
    tmpStr+="Value = ";
    tmpStr+=A->Value;

    tnChildNode = AddNode(TreeView, tmpStr, tnObjectNode);
    ParseAttributes(TreeView, A->Attributes, tnChildNode);
  }
}

//------------------------------------------------------------------------------


За основу взят пример на Delphi из SDK для библиотеки МиС. Посмотрите, там хорошо процесс описан.

strls

Спасибо за ответ.
Разбираться с вашим примером програмы и вот нашел
http://forum.foxclub.ru/read.php?29,152944
очень похоже и на Delphi, только вот форум по FoxPro :|