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

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

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

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

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

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

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

Обучение по хелпу. Разработка своей библиотеки.

Автор sorockinalex, 16.11.07, 11:30:13

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

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

sorockinalex

Здравствуйте!
Создал простейшую библиотеку по хелпу pdf
Она должна создавать меню, но меню почему-то не создаётся. Помогите кто-нибудь разобраться в проблеме, пожалуйста!

PROJECT1.dpr
library Project1;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }



{$R 'Example1.res' 'Example1.rc'}


uses
  SysUtils,
  Classes,
  Windows,
  LDefin2D,
  ksAuto,
  KsTLB,
  command in 'command.pas';
{$E rtw}

{$R *.res}
  var iKompas : KompasObject;

function LibraryName: PChar; pascal;
begin
result := 'Вставка УГО' ;
end;

function LibraryID: UINT; pascal;
begin
result := LIB_ID;
end;

procedure LibraryEntry (command: WORD); pascal;
begin
iKompas := KompasObject(CreateKompasObject);
if iKompas = nil then
Exit;

case command of
COMMAND_1 : iKompas.ksMessage ( 'Болт 7798' );
COMMAND_2 : iKompas.ksMessage ( 'Шайба 18123' );
COMMAND_3 : iKompas.ksMessage ( 'Гайка 6393' );
COMMAND_4 : iKompas.ksMessage ( 'Гайка 5915' );
COMMAND_5 : iKompas.ksMessage ( 'Гайка 15521' );
COMMAND_6 : iKompas.ksMessage ( 'Штифт 10774' );
end;

iKompas.ksMessage('ПРИВЕТ!!!');
iKompas := nil;
end;

exports
LibraryName name 'LIBRARYNAME',
LibraryEntry name 'LIBRARYENTRY';

begin
end.



EXAMPLE1.rc
#ifndef __COMMAND_RH
#include "command.rh"
#endif

// Описание меню команд библиотеки
// Примечание: идентификаторы команд должны быть в интервале от 1 до 900
1000 MENU
{
MENUITEM "Болт ГОСТ 7798-70", COMMAND_1
MENUITEM "Болт ГОСТ 18123-72", COMMAND_2
POPUP "ГАЙКИ"
{
MENUITEM "Гайка ГОСТ 6393-73", COMMAND_3
POPUP "ГАЙКИ ШЕСТИГРАННЫЕ"
{
MENUITEM "Гайка ГОСТ 5915-70", COMMAND_4
MENUITEM "Гайка ГОСТ 15521-50", COMMAND_5
}
}
MENUITEM "Штифт ГОСТ 10774-80", COMMAND_6
}

//Определение BMP-слайдов для команд библиотеки
COMMAND_1 BITMAP "1.bmp"
COMMAND_2 BITMAP "2.bmp"
COMMAND_3 BITMAP "3.bmp"
COMMAND_4 BITMAP "4.bmp"
COMMAND_5 BITMAP "5.bmp"
COMMAND_6 BITMAP "6.bmp"

//Размеры окна вывода BMP-слайда:
1000 RCDATA {
160 // Размер по горизонтали
140 // Размер по вертикали
}

// Имя библиотеки
STRINGTABLE
{
1000 "Вставка УГО"
}

// Пиктограмма для свёрнутого окна библиотеки
1000 ICON "Example1.ico"


COMMAND.rh
#ifndef __COMMAND_RH
#  define __COMMAND_RH

#define LIB_ID    1000
#define COMMAND_1 1
#define COMMAND_2 2
#define COMMAND_3 3
#define COMMAND_4 4
#define COMMAND_5 5
#define COMMAND_6 6

#endif



COMMAND.pas
unit command;

interface

const LIB_ID    = 1000;
COMMAND_1 = 1;
COMMAND_2 = 2;
COMMAND_3 = 3;
COMMAND_4 = 4;
COMMAND_5 = 5;
COMMAND_6 = 6;
implementation

end.

yarikv

если библиотека не компиилируется попробуй удалить строку {$R *.res}

sorockinalex

библиотека компилируется, но не создаётся в ней меню - пустая библиотека получается. никаких пунктов меню болты, шайбы... не создаётся

yarikv

в файле EXAMPLE1.rc измени  1000  на LIB_ID во всем текте

у меня было так:

Цитировать#ifndef __COMMAND_RH
  #include "command.rh"
#endif

// Описание меню команд библиотеки
// Примечание: идентификаторы команд должны быть в интервале от 1 до 900
LIB_ID MENU
{
  MENUITEM "Болт ГОСТ 7798-70", COMMAND_1
  MENUITEM "Шайба ГОСТ 18123-72", COMMAND_2
  POPUP "ГАЙКИ"
  {
    MENUITEM "Гайка ГОСТ 6393-73", COMMAND_3
    POPUP "ГАЙКИ ШЕСТИГРАННЫЕ "
    {
      MENUITEM "Гайка ГОСТ 5915-70", COMMAND_4
      MENUITEM "Гайка ГОСТ 15521-50", COMMAND_5
    }
  }
  MENUITEM "Штифт ГОСТ 10774-80", COMMAND_6
}

// Определение BMP-слайдов для команд библиотеки
COMMAND_1 BITMAP "B7798.bmp"
COMMAND_2 BITMAP "Sh10906.bmp"
COMMAND_3 BITMAP "G3032.bmp"
COMMAND_4 BITMAP "G5915.bmp"
COMMAND_5 BITMAP "G5927.bmp"
COMMAND_6 BITMAP "Sh10774.bmp"

// Размеры окна вывода BMP-слайда:
LIB_ID RCDATA {
   160   // Размер по горизонтали
   140   // Размер по вертикали
}

// Имя библиотеки
STRINGTABLE
{
  LIB_ID "Упражнение 3"
}

sorockinalex

изменил, не помогло. не мог бы ты показать свой dpr файл???

yarikv

library Upragnenie3;

{$R 'Example3.res' 'Example3.rc'}

uses
  SysUtils, Classes, Windows, LDefin2D, ksAuto, ksTLB,
  Command in 'Command.pas';

var iKompas : KompasObject;

{$E rtw}

{$R *.res}

function LibraryID: UINT; pascal;
begin
  Result:=LIB_ID
end;

procedure LibraryEntry(command: WORD); pascal;
begin
  iKompas:= KompasObject(CreateKompasObject);
  if iKompas = nil then Exit;
  case command of
    COMMAND_1: iKompas.ksMessage('Болт ГОСТ 7798-70');
    COMMAND_2: iKompas.ksMessage('Шайба ГОСТ 18123-72');
    COMMAND_3: iKompas.ksMessage('Гайка ГОСТ 6393-73');
    COMMAND_4: iKompas.ksMessage('Гайка ГОСТ 5915-70');
    COMMAND_5: iKompas.ksMessage('Гайка ГОСТ 5927-70');
    COMMAND_6: iKompas.ksMessage('Штифт ГОСТ 10774-80');
  end;

  iKompas:= nil;
end;

Exports
LibraryID name 'LIBRARYID',
LibraryEntry name 'LIBRARYENTRY';

begin
end.

yarikv

COMMAND.rh и COMMAND.rc такие как и у тебя
у меня похоже просто нет функции LibraryName

sorockinalex


sorockinalex

теперь проблема с отображением картинок... ни одна не отображается...

sorockinalex

подвигал окно, снова прилепил панель. снизу появились картинки...
но при сворачивании панели иконка не отобржается..

sorockinalex

Пытаюсь разнести процедуры и функции по отдельным Unit.. Успешно компилируется, но при запуске на команде, вызывающий эту функцию компас вылетает... Если делать в составе главного модуля,  то работает.
Вот мой код:

Project1.dpr
library Project1;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

{$R 'Example1.res' 'Example1.rc'}

uses
  SysUtils,
  Classes,
  Windows,
  LDefin2D,
  ksAuto,
  KsTLB,
  command in 'command.pas',
  add2lib in 'add2lib.pas',
  InpDocPar in 'InpDocPar.pas' {Form1};

{$E rtw}
{$R *.res}
  var
    iKompas : KompasObject;
    iDoc : ksDocument2D;
    idocParams : ksDocumentParam;
    iSheetParams : ksSheetPar;
    iStdSheet : ksStandartSheet;

function NewProject:boolean;
  begin
    InputDocParameters (iDocParams.fileName,iDocParams.author,iDocParams.comment);
    //Создание и заполнение структры параметров чертежа
    iDocParams := ksDocumentParam (iKompas.GetParamStruct (35));
    with iDocParams do
      begin
        Init;
        fileName := 'example1.cdw';
        author :='Сорокин А.В.';
        comment := 'Пример чертежа';
        iDocParams.regime :=1; //видимый режим
      end;

    //Создание и заполнение структуры параметров листа, принадлежащей структуре pDocParams
    iSheetParams := ksSheetPar (iDocParams.GetLayoutParam);
    iSheetParams.Init;
    iSheetParams.shtType := 1001; //Тип штампа
    isheetparams.layoutName := ('C:\RTWExamples\Example1\GRAPHIC.lyt');
    iSheetParams.shtType := 1001; //Тип штампа


    //Создание и заполнение структуры параметров стандартного листа принадлежностей структуре pSheetParms
    iStdSheet := ksStandartSheet (iSheetParams.GetSheetParam);
    iStdSheet.format :=3; //Формат А4
    iStdSheet.multiply :=1; //Кратность формата
    iStdSheet.direct := TRUE; //Расположение основной надписи вдоль длинной стороны листа

    //Создание документа: лист чертежа, формат А4, горизонтально ориентирован, системный штамп номер 2
    iDoc :=ksDocument2D (iKompas.Document2D);
    if iDoc.ksCreateDocument (iDocParams)=true then
      begin
        iDoc.ksSaveDocument('');
      end
  end;

function DrawElem ( iDoc : ksDocument2D ) : Reference;
begin
if iDoc.ksMacro(0) = 0 then
Result := 0
else
begin
iDoc.ksLineSeg (-10,10,10,10,1);
iDoc.ksLineSeg (-10,0,-10,10,1);
iDoc.ksLineSeg (10,0,10,10,1);
iDoc.ksCircle (0,0,5,1);
iDoc.ksArcByPoint (0,0,10,-10,0,10,0,1,1);
Result := iDoc.ksEndObj;
end;
end;


function LibraryID: UINT; pascal;
begin
result := LIB_ID;
end;

procedure LibraryEntry (command: WORD); pascal;
begin

iKompas := KompasObject(CreateKompasObject);
if iKompas = nil then Exit;

iDoc := ksDocument2D ( iKompas.ActiveDocument2D );
if iDoc = nil then Exit;

case command of
COMMAND_1 : iDoc.ksLine (10,10,0);
COMMAND_2 : DrawElem (iDoc);
COMMAND_3 : NewProject;
COMMAND_4 : ;
COMMAND_5 : iKompas.ksMessage ( 'Гайка 15521' );
COMMAND_6 : iKompas.ksMessage ( 'Штифт 10774' );
end;

iDoc := nil;
iKompas := nil;
end;

Exports
LibraryID name 'LIBRARYID',
LibraryEntry name 'LIBRARYENTRY';

begin
end.



NewProj.pas
Unit NewProj;
interface
uses KsTLB;

var
iKompas : KompasObject;
iDoc : ksDocument2D;
idocParams : ksDocumentParam;
iSheetParams : ksSheetPar;
iStdSheet : ksStandartSheet;

function NewProject:integer;

implementation

function NewProject;
  begin
    //Создание и заполнение структры параметров чертежа
    iDocParams := ksDocumentParam (iKompas.GetParamStruct (35));
    with iDocParams do
      begin
        Init;
        fileName := 'example1.cdw';
        author :='Сорокин А.В.';
        comment := 'Пример чертежа';
        iDocParams.regime :=0; //видимый режим
        //type_ := lt_DocSheetStandart; //Чертёж стандартного формата
      end;

    //Создание и заполнение структуры параметров листа, принадлежащей структуре pDocParams
    iSheetParams := ksSheetPar (iDocParams.GetLayoutParam);
    iSheetParams.Init;
    iSheetParams.shtType := 2; //Тип штампа

    isheetparams.layoutName := ('C:\RTWExamples\Example1\GRAPHIC.lyt');
    //iSheetParams.shtType := 2; //Тип штампа
    //iSheetOptions.layoutName := ''

    //Создание и заполнение структуры параметров стандартного листа принадлежностей структуре pSheetParms
    //iStdSheet := ksStandartSheet (iSheetParams.GetSheetParam);
    //iStdSheet.format :=4; //Формат А4
    //iStdSheet.multiply :=1; //Кратность формата
    //iStdSheet.direct := TRUE; //Расположение основной надписи вдоль длинной стороны листа

    //Создание документа: лист чертежа, формат А4, горизонтально ориентирован, системный штамп номер 2
    iDoc :=ksDocument2D (iKompas.Document2D);
    if iDoc.ksCreateDocument (iDocParams)=true then
      begin
        iDoc.ksSaveDocument('');
      end
  end;
end.

sorockinalex

Разобрался. Забыл оформить как надо функцию. В скобках надо дописать передаваемые переменные
Теперь вот такой вопрос: создал я юнит с формой. Туда запихнул вышеприведённую функцию, но при вызове её я не вижу форму!! Как запустить форму из вункции?

yarikv

пользуйся поиском по сайту, эта тема уже много раз обсуждалась. есть еще и примеры

sorockinalex

нашёл вот это:

DocInfo:=TDocInfo.Create(nil);
DocInfo.OpenLib;
DocInfo.ShowModal;


добавил в свою функцию - при вызове в компасе функции компас просто вылетает...

нашёл вот это:
   if (iKompas = nil) then exit;
      // получаем дескриптор главного окна КОМПАС
   Application.Handle := iKompas.ksGetHWindow;
      // запрещаем доступ к главному окну
   iKompas.ksEnableTaskAccess(0);
      // создаем объект диалогового окна
   DocInfo := TDocInfo.Create(Application);
   DocInfo.ks := iKompas;
      // выводим диалог на экран
   DocInfo.ShowModal;
      // удаляем объект
   DocInfo.Free;
      // возвращаем доступ к окну
   iKompas.ksEnableTaskAccess(1);
   Application.Handle := 0;
   iKompas := nil;


выдаёт ошибку на строке
   DocInfo.ks := iKompas;
undeclared identifier: 'ks'

комментирую, компилится. открываю в компасе, вызываю процедуру - вылетает в этом месте, где вставлял код.

sorockinalex

вылетает на строчке DocInfo.ShowModal;. почему????????

sorockinalex

Блин. Уже пять часов мучаюсь! Помогите, что вы сидите сычами???
Как форму открыть в dll??? открывал и gayka и форум весь этот - ничего не работает из написанного!

sorockinalex


sorockinalex

Подскажите, как программно внести данные в поле Организация в свойствах документа?