Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Delphi => Тема начата: IgorRUtver от 19.06.12, 20:35:39

Название: Многооконная Компас-DLL
Отправлено: IgorRUtver от 19.06.12, 20:35:39
 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.

Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 19.06.12, 21:38:29
Один из вариантов реализации процедуры 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;
Название: Re: Многооконная Компас-DLL
Отправлено: IgorRUtver от 28.06.12, 17:43:03
Заменил свой участок кода на предлагаемый, библиотека запускается но после выхода из библиотеки компас не закрывается пишет "необходимо завершить текущую операцию". Я видемо неграмотно описал проблему, прикладываю проект библиотеки, кнопка на Form1 должна скрыть или хоть какнибудь убрать Form1 а потом вывести на экран Form2, аналогично кнопка на Form2 должна скрыть Form2 и вывести на экран Form1. Но при попытке закрыть кнопкой  Button1Click Form2 с помощью Form2.Close вылетает ошибка. могу отправить на почту проект, он весит 8 метров и к сообщению не прикладывается((
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 28.06.12, 18:03:12
А зачем он мне нужен?

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

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

А лучше сначала взять книгу и почитать об инструменте на котором пишете, Компас тут не виноват, Вам просто элементарных знаний не хватает, надеюсь ни чем не обидел.
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 29.06.12, 08:03:21
См. вложение.
Название: Re: Многооконная Компас-DLL
Отправлено: IgorRUtver от 29.06.12, 20:04:06
ООО спасибо за вложение, именно то что нужно, есть над чем подумать!!!)))) а по поводу знаний не спорю, я пока нуб, времени мало а програмировать нравится, еще раз спасибо за помощ)
Название: Re: Многооконная Компас-DLL
Отправлено: IgorRUtver от 29.06.12, 21:07:29
Открыл в компасе библиотеку STEP1 делает то что нужно))) ура) попытался запустить проект делфи пишет file not found: 'System.SysUtils.dcu' анологично с System.Classes  объявляемыми в разделе uses. я так понял это какието библиотеки  :~, и еще чтото в архиве нет файлов форм. пишет что не найдены Unit1.dfm
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 29.06.12, 21:32:51
Весь код есть, остальное автоматом.
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 29.06.12, 22:43:02
Утром спешил за пол часа сделал, но в торопясь пропустил ошибку вместо Form2.OnClose опредилил обработчик Form2.OnClick, исправленный код.
Название: Re: Многооконная Компас-DLL
Отправлено: IgorRUtver от 03.07.12, 19:12:43
Спасибо за библиотеку, вижу что рабочая и все как надо :o:, вопрос возможно уже не совсем по теме, при запуске проекта пишет "Unit note found: 'Sistem.pas' or binary equivalents (DCU,DPU) ". Нашел в папке с Delphi файл Sistem.pas,  скопировал в каталог проекта и подключил его к проекту, но всеравно такаяже ошибка, это из-за делфи или что это за файл такой?
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 03.07.12, 19:23:06
Настройте свой проект в опциях, что, где и когда.
Название: Re: Многооконная Компас-DLL
Отправлено: IgorRUtver от 05.07.12, 16:09:43
Спасибо!
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 01.08.12, 07:27:52
Мультфильм, как делалась библиотека, правда без пояснений, я думаю кто захочет, тот разберётся, тем более, что здесь всё очень, просто. http://narod.ru/disk/58648073001.1e1423c34d7d02095c14a46f87a44d5d/Project_2_Form.exe.html
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 01.08.12, 22:43:16
Исправление ошибок допущенных в предыдущем видео.
http://narod.ru/disk/58730282001.5168a45c71e84b10341f47d6078dd4bc/Project_2_Form_Edit.exe.html
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 07.11.13, 19:54:14
Цитата: 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
Название: Re: Многооконная Компас-DLL
Отправлено: Sabahs от 01.04.16, 06:03:47
Project_2_Form.exe - https://yadi.sk/d/oxqGkBO7qe4bB (https://yadi.sk/d/oxqGkBO7qe4bB)
Project_2_Form_Edit.exe - https://yadi.sk/d/UBBDMncwNEfkB (https://yadi.sk/d/UBBDMncwNEfkB)