Тема: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Извините за обращение, но первый раз пишу СА.
Код Delphi:

library PJAEServer;

uses
  ComServ,
  UForm1 in 'UForm1.pas' {Form1},
  PJAEServer_TLB in 'PJAEServer_TLB.pas',
  UMetods in 'UMetods.pas' {CreateForm: CoClass};

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

{$R *.TLB}

{$R *.RES}

begin
end.
unit UMetods;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, PJAEServer_TLB, StdVcl
  ,UForm1;

type
  TCreateForm = class(TAutoObject, ICreateForm)
  protected
    NButton: Integer;
    F:TForm1;
  protected
    procedure Form(TCSApp0, ActMo0, Attr1, ArrForm: OleVariant); safecall;
    function Get_NButton: Integer; safecall;
    procedure Set_NButton(NButton: Integer); safecall;

  end;

implementation

uses Windows, ComServ, Messages, Dialogs, SysUtils, WinTypes, Variants, StdCtrls
  , WinProcs, Classes, Graphics, Controls, Forms, ComCtrls;

procedure TCreateForm.Form(TCSApp0, ActMo0, Attr1, ArrForm: OleVariant);
begin
  ShowWindow (Application.handle, SW_HIDE);//Скрыть окно приложения
  F:=TForm1.Create(nil);
  F.TCSApp:=TCSApp0;
  F.ActMo:=ActMo0;
  F.Caption:=ArrForm;
  F.Attr:=Attr1;
  F.ShowModal;
  F.Attr.ShowModal; //ОБЪЕКТ НЕДОСТУПЕН
  F.Free;
  F:=nil;
end;

initialization
  TAutoObjectFactory.Create(ComServer, TCreateForm, Class_CreateForm,
    ciMultiInstance, tmApartment);
end.

Кусок из формы:

unit UForm1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Grids, ImgList, Buttons;

type
  TForm1 = class(TForm)

. . . . .

    procedure Button1Click(Sender: TObject);
    procedure StrGgrdDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    TCSApp,ActMo, Attr:OleVariant;
    StringofCode:string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormShow(Sender: TObject);
var i,j, n:Integer;
begin
  StrGgrd.Cells[0,0]:=' №№';
  StrGgrd.Cells[1,0]:='  Наименование атрибута';
  StrGgrd.Cells[2,0]:='  Значение атрибута';
  Label2.Caption:=ActMo.Properties[5].AsString; //Обозначение
  Label3.Caption:=ActMo.Properties[20].AsString; //Обозначение
  Label6.Caption:=ActMo.Properties[17].AsString; //Обозначение
  Label7.Caption:=ActMo.Properties[16].AsString; //Обозначение
  n:=0;
  try
    Attr.ShowModal;
    Attr.First;
    while not Attr.Eof do
    begin
        Inc(n); Attr.Next;
    end;
    Attr.First;
  except
    ShowMessage('Count='+IntToStr(n));
  end;

Обращение из TCS:

    Set    MainLib=CreateObject("PServer.CreateForm")
    If MainLib Is Nothing Then 
        Call TCSApp.ShowErrorMessage("Отсутствует библиотека PServer.dll")
        Exit Sub
    End If             
    n=0
‘Создаю объект список атрибутов
    Set Attr = TCSActiveModule.ChildModules.ModuleByName("PrjVerParams").AsIDispatch
    Do While Not Attr.Eof
        n=n+1
        Attr.Next
    Loop
    k=Attr.ShowModal(cStr(n)) ' Показывает список атрибутов и их кол-во правильно
    If  Not Attr Is Nothing Then 
        MainLib.Form TCSApp, TCSActiveModule, Attr, "Мы работаем из PServer.dll"
    End If

Форма открывается нормально, но на ней нет значений атрибутов. Пишет, что объект не найден. Как добраться до атрибутов?

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

А почему бы не получать TCSActiveModule.ChildModules.ModuleByName("PrjVerParams").AsIDispatch уже в самой библиотеке?
Вы ведь в неё TCSActiveModule передаёте?

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Дмитрий Гамий пишет:

А почему бы не получать TCSActiveModule.ChildModules.ModuleByName("PrjVerParams").AsIDispatch уже в самой библиотеке?

Т.е. Вы предлагаете создать объект

Attr=CreateOleObject(TCSActiveModule.ChildModules.ModuleByName("PrjVerParams").AsIDispatch)

внутри библиотеки?

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

JAEAEJ пишет:
Дмитрий Гамий пишет:

А почему бы не получать TCSActiveModule.ChildModules.ModuleByName("PrjVerParams").AsIDispatch уже в самой библиотеке?

Т.е. Вы предлагаете создать объект

Attr=CreateOleObject(TCSActiveModule.ChildModules.ModuleByName("PrjVerParams").AsIDispatch)

внутри библиотеки?

Ну, можно так:

 
var
   Attr: IGModule;
begin
   ...
   Attr := ActMo0.ChildModules.ModuleByName['PrjVerParams'].AsIDIspatch as IGModule;
end;

И ещё - если вы работаете с документом архива,  у него есть другой способ получения атрибутов версии документа:

TCSActiveModule.Properties("VERPARAMS").AsIDispatch

Пользоваться ChildModules разработчики не рекомендуют.

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

И ещё - если вы работаете с документом архива,  у него есть другой способ получения атрибутов версии документа:
   
TCSActiveModule.Properties("VERPARAMS").AsIDispatch

Я работаю с выборками. Там (IPModule) нет свойства 'VERPARAMS'.
Тогда наверно так:

Attr := ActMo0.Properties('PrjVerParams').AsIDispatch as IDModule; 

?

(изменено: Дмитрий Гамий, 13 сентября 2012 13:39:10)

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Во вложении - пример ActiveX-библиотеки, которая как раз работает из режима "Выборки" и разрабатывалась под TechnologiCS 5.0.2.
В архиве:

  • папка "Some_DLL" - исходный код проекта Delphi 7

  • файл "Install.bat" - командный файл для регистрации библиотеки

  • файл "pSomeDll.dll" - сама библиотека

  • файл "ТекстМакроса.txt" - текст макроса для вызова формы из режима "Выборки"

Post's attachments

Some_DLL.zip 761.45 Кб, 2 скачиваний с 2012-09-13 

You don't have the permssions to download the attachments of this post.

(изменено: , 13 сентября 2012 16:16:33)

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Посмотрел проект "Some_DLL". Идёт работа с архивом, а мне нужно с
выборками. В выборках другие поля. Не совсем, а вернее совсем, не
понял строку

Values := (ArchDoc.Properties['PARAMS_VALUES'].AsIDispatch as IDModule);

Свойство 'PARAMS_VALUES' находится в IPModule, а не в IDModule?

И вообще - для чего стоят внешние круглые скобки?

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

В этом проекте из режима выборок (TCS_AM) считывается идентификатор текущего документа (prj_id).

procedure TForm1.SetCurrentDoc;
begin
   prj_note := TCS_AM.Properties['PRJ_NOTE'].AsString;
   prj_name := TCS_AM.Properties['PRJ_NAME'].AsString;
   prj_id := TCS_AM.Properties['PRJ_ID'].AsInteger;
end;

По этому идентификатору получаем экземпляр документа (единичную запись):

function TForm1.SetArchiveDoc(const id: integer): boolean;
begin
   ArchDoc := TCS_App.SingleDoc[2, id];
   if ArchDoc <> nil
   then
      begin
         ArchDoc.Refresh;
         result := true;
         exit;
      end;

   result := false;
end;

Дальше работаем  с экземпляром документа (ArchDoc) так же, как и с архивом - у этого объекта такие же поля (свойства), как и у записи из режима "Архив".

По вопросам к строке:

Values := (ArchDoc.Properties['PARAMS_VALUES'].AsIDispatch as IDModule);

Внешние круглые скобки, действительно, в этом месте лишние.

JAEAEJ пишет:

Свойство 'PARAMS_VALUES' находится в IPModule, а не в IDModule?

Все свойства находятся в интерфейсе IPModule, интерфейс IDModule порожден от IPModule и поэтому можно считывать свойства при обращении к переменной, объявленной как IDModule.
Здесь переменная Values объявлена как IDModule для того, чтобы была возможность осуществлять навигацию (преходы, поиск) по записям.

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Дмитрий Гамий

Извините, что долго не отвечал - текучка.

Наверно мы с Вами обсуждаем работу с разными страницами.
Я "Документооборот-Выборки", а Вы "Документооборот-Архив".
На странице "Выборки" нет свойства 'PARAMS_VALUES'. Т.е. я имею
в виду именно страницу "Выборки".

(изменено: Дмитрий Гамий, 16 сентября 2012 17:22:36)

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

JAEAEJ пишет:

На странице "Выборки" нет свойства 'PARAMS_VALUES'. Т.е. я имею
в виду именно страницу "Выборки".

Да, на странице "Выборки" нет такого свойства, а у интерфейса ISingleDoc - есть.
Из режима выборки я считываю идентификатор документа TCS_AM.Properties['PRJ_ID'].AsInteger, дальше получаю экземпляр документа и обрабатываю его. У него свойства такие же, как на странице "Документооборот-Архив".

Вы пробовали запустить макрос? Он у Вас работает?

И ещё - может имеет смысл обновиться до версии TechnologiCS 5.7.0 и использовать для решения Вашей задачи пользовательские формы ввода? (http://www.technologics.ru/node/66)

(изменено: JAEAEJ, 1 октября 2012 11:37:57)

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Извините, приболел.

Макрос теперь работает. Нахожусь на стр. "Выборки".  Вызов из TCS файл Proba0.txt.
Может кому и потребуется.
А по поводу перехода на новую версию - давно хочется, но нет денег.

Post's attachments

JAEServer.rar 1.68 Мб, 4 скачиваний с 2012-10-01 

You don't have the permssions to download the attachments of this post.

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

JAEAEJ пишет:

А по поводу перехода на новую версию - давно хочется, но нет денег.

Переход с 5.0.2 на 5.7.0 осуществляется бесплатно.

(изменено: JAEAEJ, 1 октября 2012 13:55:42)

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Переход с 5.0.2 на 5.7.0 осуществляется бесплатно.

Не знал. Спасибо. А проект, я послал, может кому и пригодится, как обёртка.
Узнал от руководства, что хотели перйти не 5.7, но обещали выделить финансы, для перехода на шестёрку.

В продолжении темы "Внутрипроцессорный СА": мне хочется создать форму, отобразить её, с передачей управления. При нажатии на одну из кнопок, но форме, передать управление в TCS, не уничтожая форму. В свойство "Nbutton" устанавливаю номер нажатой кнопки. Выполняю действия, в зависимости от этого номера И должен передать управление существующей фороме. Выделенный текст суть проблемы.

Re: СОМ-объект. Внутрипроцессорный СА. TCS 5.0.2. D7.

Ну, я так подозреваю, что можно и без передачи управления в TCS можно обойтись.
Можно, к примеру, в зависимости от нажатой кнопки, задавать соответствующее значение свойству ModalResult Вашей формы и анализировать его в процедуре

procedure TCreateForm.Form(TCSApp0, ActMo0, Attr1, ArrForm: OleVariant); 

В зависимости от этого, можно осуществлять любые манипуляции с TCSActiveModule (или у Вас - ActMo0).