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

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

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

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

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

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

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

ActiveDocument вылетает с ошибкой

Автор Fabeldyr, 05.07.12, 02:00:22

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

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

Fabeldyr

собственно задача следующая: есть база данных, их нужно разместить в нужную форматку, ясное дело, что на один лист данные не влезут, поэтому по заполнению листа нужно добавить ещё один, для этого нужно использовать LayoutSheets->Add

среда разработки: C++ Builder 6

по аналогии с этим примером: http://forum.ascon.ru/index.php/topic,14291.0.html написал следующее:
KompasObjectPtr kompas;
ksDocument2DPtr doc;
IApplication *test;

...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (!kompas)
  {
    kompas = (IDispatch*)CreateOleObject("KOMPAS.Application.5");
    if (kompas)
    {
      kompas -> Visible = true; // Показать Компас
      kompas -> ActivateControllerAPI();
    }
  }
}

...

void TForm1::create_doc(void)
{
  if (kompas)
  {
    doc = kompas -> Document2D();
    if (doc)
    {
      test = (IApplication*)kompas -> ksGetApplication7();
      ksDocumentParam* docPar = (ksDocumentParam*)kompas -> GetParamStruct(Kompas6constants_tlb::ko_DocumentParam);
      задаём параметры штампа
      doc -> ksCreateDocument((LPDISPATCH)docPar);
    }
  }
}

...

if (лист закончился)
test -> get_ActiveDocument();

на этой строке компилятор вылетает с ошибкой "Access violation at address 7E3787AA"

если быть совсем точным, то вылет происходит в файле utilcls.h// Implementation of OLECHECK - Throw an exception if !SUCCEEDED(hr)
template <class T>
HRESULT DebugHlpr_HRCHECK(HRESULT hr, T* expr, T* file, int line)
{
  if (!SUCCEEDED(hr))
  {
    TCHAR szMsg[_MAX_PATH*2];
    TCHAR lfile[_MAX_PATH*2];

    if (file)
      ::wsprintf(lfile, _T("%s"), file);
на этой строке
при наведении на файл подсвечивается file = ""
я так понимаю указатель на документ не передаётся

в чём ошибка?

05.07.12, 06:51:31 #1 Последнее редактирование: 05.07.12, 07:14:07 от Sabahs
Так собственно, где Вы заполнили параметры структуры интерфейса документа ksDocumentParam? Вы получили только указатель на интерфейс, который даже не инициализировали и сразу пытаетесь создать документ doc -> ksCreateDocument((LPDISPATCH)docPar);

Используйте API7, там можно создать документ с параметрами по умолчанию и получить указатель на интерфейс IKompasDocument, от которого получите коллекцию листов оформления  ILayoutSheets.

Documents:IDocuments
DocPar:IKompasDocument
DocPar:=Documents.Add(ksDocumentFragment,True);

Fabeldyr

там где написано " задаём параметры штампа"
я просто не стал писать это сюда
вообще с одним листом всё прекрасно работает
а с апи7 никак не могу разабраться - как его подключить

//-------------------------------------------------------------------------------
// Получить доступ к новому API
// ---
procedure GetNewKompasAPI;
var
  disp : IDispatch;
begin
   if newKompasAPI = nil then
  begin
    disp := IDispatch(CreateKompasApplication);
    newKompasAPI := disp As IApplication;
  end;
end;

P.S. Я делаю иначе, что доставляет свои нюансы.