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

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

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

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

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

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

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

Многооконная Компас-DLL

Автор IgorRUtver, 19.06.12, 20:35:39

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

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

IgorRUtver

 8-) Помогите. В программировании новичек, появилась необходимость создания многооконной прикладной библиотеки под компас.
Создал одно окно, все норм работает, также смог загрузить из dll 2ю форму, но вот беда: закрыть форму отображенную в модальном режими нажатием кнопки не получается, выводит ошибку, подскажите как можно реализовать несколько форм и переключение между ними.

Ниже код проекта
...
library Gidra2;

{ 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. }

uses
  SysUtils,
  Classes,
  ksTLB,
  Forms,
  ksAuto,
  Former1 in 'Former1.pas' {Form1},
  Former2 in 'Former2.pas' {Form2};

{$E RTW}

{$R *.res}
// глобальная переменная приложения КОМПАС API
var
kompas : KompasObject;


function LibraryName: PChar; pascal;
begin
Result := 'Пожарные системы';
end;

function LibraryId: integer; pascal;
begin
Result := 100;
end;

procedure LibraryEntry(command: WORD); pascal;
var GearsForm : TForm1;
begin
kompas := KompasObject(CreateKompasObject);
if (kompas = nil) then exit;
// получаем дескриптор главного окна КОМПАС
Application.Handle := kompas.ksGetHWindow;
// запрещаем доступ к главному окну
kompas.ksEnableTaskAccess(0);
// создаем объект диалогового окна
GearsForm := TForm1.Create(Application);
GearsForm.ks := kompas;
// выводим диалог на экран
GearsForm.ShowModal;
// удаляем объект
GearsForm.Free;
// возвращаем доступ к окну
kompas.ksEnableTaskAccess(1);
Application.Handle := 0;
kompas := nil;

end;

function ShowForm2 : Integer; stdcall;
var
  Form : TForm2;
begin
  Form := TForm2.Create(Application);
  Result := Form.ShowModal;
  Form.Free;
end;

exports
LibraryName name 'LIBRARYNAME',
LibraryId name 'LIBRARYID',
LibraryEntry name 'LIBRARYENTRY',
ShowForm2;

end.







Код формы отображаемой в компасе при запуске библиотеки
...

unit Former1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ksTLB, ksAuto, ksConstTLB, LDefin3D, LDefin2D, math, StdCtrls;

const
//Константа - название dll
Lib='Gidra2.RTW';


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ks : KompasObject;
  end;
//Объявляем функцию из DLL
  function ShowForm2 : Integer;stdcall external lib;


var
  Form1: TForm1;

implementation

{$R *.dfm}

//Эта кнопка открывает 2ю форму в модальном режиме
procedure TForm1.Button1Click(Sender: TObject);
begin

ShowForm2;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.


19.06.12, 21:38:29 #1 Последнее редактирование: 19.06.12, 21:50:48 от Sabahs
Один из вариантов реализации процедуры LibraryEntry
Kompas:=KompasObject(CreateKompasObject);
if Kompas=nil then Exit;
Application.Handle:=Kompas.ksGetHWindow;
Form1:=TForm1.Create(Application);
Form1.Show;
Form2:=TForm2.Create(Application);
Kompas.ksSystemControlStart('Остановить библиотеку');
if Kompas<>nil then Kompas.ksSystemControlStop;
Application.Handle:=0;
Kompas:=nil;
if Form2<>nil then
begin
   Form2.Close;
   Form2.Free;
   Form2:=nil;
end;
if Form1<>nil then
begin
    Form1.Close;
    Form1.Free;
    Form1:=nil;
end;

IgorRUtver

Заменил свой участок кода на предлагаемый, библиотека запускается но после выхода из библиотеки компас не закрывается пишет "необходимо завершить текущую операцию". Я видемо неграмотно описал проблему, прикладываю проект библиотеки, кнопка на Form1 должна скрыть или хоть какнибудь убрать Form1 а потом вывести на экран Form2, аналогично кнопка на Form2 должна скрыть Form2 и вывести на экран Form1. Но при попытке закрыть кнопкой  Button1Click Form2 с помощью Form2.Close вылетает ошибка. могу отправить на почту проект, он весит 8 метров и к сообщению не прикладывается((

А зачем он мне нужен?

Чтобы Компас не выдавал ошибку "необходимо завершить текущую операцию", нужно в обработчике OnClose главной формы, добавить строку: if Kompas<>nil then Kompas.ksSystemControlStop;

Скрыть форму можно так ShowWindow(Form1.Handle,SW_HIDE);

А лучше сначала взять книгу и почитать об инструменте на котором пишете, Компас тут не виноват, Вам просто элементарных знаний не хватает, надеюсь ни чем не обидел.

См. вложение.

IgorRUtver

ООО спасибо за вложение, именно то что нужно, есть над чем подумать!!!)))) а по поводу знаний не спорю, я пока нуб, времени мало а програмировать нравится, еще раз спасибо за помощ)

IgorRUtver

Открыл в компасе библиотеку STEP1 делает то что нужно))) ура) попытался запустить проект делфи пишет file not found: 'System.SysUtils.dcu' анологично с System.Classes  объявляемыми в разделе uses. я так понял это какието библиотеки  :~, и еще чтото в архиве нет файлов форм. пишет что не найдены Unit1.dfm

Весь код есть, остальное автоматом.

Утром спешил за пол часа сделал, но в торопясь пропустил ошибку вместо Form2.OnClose опредилил обработчик Form2.OnClick, исправленный код.

IgorRUtver

Спасибо за библиотеку, вижу что рабочая и все как надо :o:, вопрос возможно уже не совсем по теме, при запуске проекта пишет "Unit note found: 'Sistem.pas' or binary equivalents (DCU,DPU) ". Нашел в папке с Delphi файл Sistem.pas,  скопировал в каталог проекта и подключил его к проекту, но всеравно такаяже ошибка, это из-за делфи или что это за файл такой?

Настройте свой проект в опциях, что, где и когда.

IgorRUtver


Мультфильм, как делалась библиотека, правда без пояснений, я думаю кто захочет, тот разберётся, тем более, что здесь всё очень, просто. http://narod.ru/disk/58648073001.1e1423c34d7d02095c14a46f87a44d5d/Project_2_Form.exe.html


Цитата: Sabahs от 01.08.12, 07:27:52
Мультфильм, как делалась библиотека, правда без пояснений, я думаю кто захочет, тот разберётся, тем более, что здесь всё очень, просто. http://narod.ru/disk/58648073001.1e1423c34d7d02095c14a46f87a44d5d/Project_2_Form.exe.html
Новая ссылка http://yadi.sk/d/id6HekeQCJcT2
Цитата: Sabahs от 01.08.12, 22:43:16
Исправление ошибок допущенных в предыдущем видео.
http://narod.ru/disk/58730282001.5168a45c71e84b10341f47d6078dd4bc/Project_2_Form_Edit.exe.html
Новая ссылка http://yadi.sk/d/Vn-aJnuaCJdHX