Лоцман API + Плагин + Delphi

Автор Dim, 30.04.08, 10:05:17

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

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

Dim

Цитата: Максим от 18.06.08, 10:41:18
Цитата: Dim от 18.06.08, 08:59:40
Цитата: Максим от 18.06.08, 08:46:36
А кто-нибудь пользовался функцией FindObject?
У меня не работает поиск по аттрибутам. Если кто знает как правильно, напишите пожалуста!!!
Заранее благодарен.

Один из любых параметров, например, параметр - stProductName = 'Т160-.00.00' (шаблон поиска для ключевого атрибута), остальные пустые (''), то найдется...  :)
С такими параметрами все прекрасно ищется, а вот поиск по аттрибутам не идет к сожалению

Аги, понятно, надо пробовать... я пробую...  :!::?:

YorikER

Для Максим:
Цитата: Максим от 18.06.08, 07:20:17
Собственно ненравится как работает Асконовский плагин ЛОЦМАН-Архив, делаем свой.
И еще вопросик, как программно отобразить объект в отдельном окне.
(Напирмер: беру программно в работу  учетную карточку, привязываю к нему абонент. Хотелось бы реализовать программно открытие объекта взятого в работу в отдельном окне)
К сожалению, плагины уже давно позабыл... Не понравилось то, что невозможно открыть MDI окно, только модальное... Для активной работы нужен многодокументный (многооконный) режим, поэтому очень быстро перешел на программирование собственного клиентского приложения... В этом случае ЛОЦМАН раскрывается во всей своей красе...

YorikER

Для Dim: в pdf интеграция пока не планируется, в MSWord и в MSExcel в планах есть...

Dim

Привет YorikER!!! Спасибо. меня не было 2 недели т.к. я лежал в больнице... Я рад что будет в Word и Excel, это меня устраивает... буду ждать  с нетерпением, когда открыт твой сайт для лоцмана... Заранее спасибо  :)

Максим

Может кто-нибудь все-таки пользовался функцией findobject и искал объекты через аттрибуты?

Немогу организовать поиск через аттрибуты

YorikER

Для Максим:
Первый кусок кода - назначение Типа и Условия по атрибутам (frMTK - специальный визуальный компонент, содержащий таблицу результатов поиска и ряд методов работы с ней)

procedure TfmFindMTK.UpdateTable;
begin
  frFMTK.stProduct:='%';
  if rgFindMTK.ItemIndex=0 then
    frFMTK.stAttr:='Обозначение чертежа'+#2+'Обозначение чертежа Like '+QuotedStr(edDes.Text+'%')
  else
    frFMTK.stAttr:='Обозначение'+#2+'Обозначение Like '+QuotedStr(edDes.Text+'%');
  frFMTK.RefreshTable;
  //frFTZ.cdsObj.Locate('_ID_VERSION',IdV,[]);
  sbMy.Panels[0].Style:=psText;
  sbMy.Panels[0].Text:='Количество записей: '+IntToStr(frFMTK.inRecordCount);
end;

Здесь
stProduct:='%'; означает выбрать все объекты заранее определенного типа;
stAttr:='Обозначение чертежа'+#2+'Обозначение чертежа Like '+QuotedStr(edDes.Text+'%') - означает выбрать по атрибуту 'Обозначение чертежа', при условии, что он равен значению, которое начинается с содержимого поля edDes.Text ('%');


Второй кусок кода:

procedure TfrFindTable.RefreshTable;
begin
  Screen.Cursor:=crHourGlass;
  MainForm:=TfrLMDIClient(Application.MainForm);
  cdsObj.Data:=MainForm.LDCOM.AppServer.FindObjects(
            stType,    // список типов
            stProduct,     // шаблон поиска для ключевого атрибута
            '',         // шаблон поиска по версиям
            '',         // список состояний
            stAttr,     // шаблон поиска по атрибутам
            '',         // зарезервирован
            '',         // зарезервирован
            inRC,       // код возврата
            stEM);      // сообщение об ошибке
  if inRC<>0 then ShowMessage(stEM);
  inRecordCount:=cdsObj.RecordCount;
  boRefresh:=True;
  Screen.Cursor:=crDefault;
end;

Метод объекта TfrFindTable.RefreshTable, который обновляет таблицу, используя метод сервера приложений FindObjects (MainForm.LDCOM - объект типа DCOMConnection).

YorikER

Прощу прощения, в первом куске кода тип заранее определен, поиск ведется по шаблону ключевого атрибута и шаблону просто атрибутов.

Максим

Цитата: YorikER от 10.07.08, 11:07:08
Для YorikER
Огромное спасибо, подчерпнул для себя еще кое-что интересное.

Максим

а может быть есть у кого работающий код как объект открыть в отдельном окне?

через postmessage обновление работает, а вот в отдельном окне не открывается :(

YorikER

А какие проблемы... Создаете в проекте Delphi новую форму - MyForm. Свойство FormStyle ее должно быть только fsNormal (модальное окно - это то мне и не понравилось - вернуться назад можно только через закрытие данного окна). В разделе Public формы создаете переменную inID: integer - текущидентификатор вершины БД. Если надо еще какие-нибудь переменные. Формируете в форме поля, лайблы, списки, кнопки и т.д. Затем описываете событие OnShow - оно выполняется перед загрузкой формы на экран. В данном событии формируете код заполнения поле формы. А затем в своем плагине пишете кусок кода вызывающий форму:

var
  MyForm: TMyForm;
begin
  MyForm:=TMyForm.Create(nil);
  try
    if MyForm.ShowModal=mrOk then
    begin
      ...
    end;
  finally
    MyForm.Free;
  end;
end;

На экран будет загружаться отдельное окно, и в событии OnShow оно просто будет заполняться нужным вам способом... Дальнейшее - это ваши фантазии... Единственное только то, что кроме этого окна вы никуда не уйдете, оно будет модальным - это недостаток плагинов. Если хотите многоконный режим - вам необходимо писать свое клиентское приложение, используя компонент TDCOMConnection, который устанавливает DCOM соединение с сервером приложений, и методы самого сервера приложений...

Максим

Цитата: YorikER от 10.07.08, 14:07:07
А какие проблемы... На экран будет загружаться отдельное окно, и в событии OnShow оно просто будет заполняться нужным вам способом... Дальнейшее - это ваши фантазии... Единственное только то, что кроме этого окна вы никуда не уйдете, оно будет модальным - это недостаток плагинов. Если хотите многоконный режим - вам необходимо писать свое клиентское приложение, используя компонент TDCOMConnection, который устанавливает DCOM соединение с сервером приложений, и методы самого сервера приложений...
У меня в плагине 10 немодальных окон, с которыми я работаю. :)
А объект нужно открыть в отдельном окне средствами ЛОЦМАНА. т.е. симитировать кнопу "Открыть" (Ctrl+O) в Лоцмане.

YorikER

Пардон, окна собственные или же ЛОЦМАН-Клиента? Может я отстал, и АСКОН уже предоставил такую возможность... Какая версия ЛОЦМАНа?

Максим

Цитата: YorikER от 11.07.08, 08:17:35
Пардон, окна собственные или же ЛОЦМАН-Клиента? Какая версия ЛОЦМАНа?
Версия 8.5.0.295
Задача стоит в открывании окон Лоцман-клиента программно. А с собственными можно делать что угодно, можно запустить плагин, затем перейти к окнам Лоцмана, там поработать, а потом снова вернуться к работе с плагином.
в оперформ вместо Form1.ShowModal напиши Application.Run

YorikER

Значит я действительно отстал... В версии 7.1 SP2 возможности открыть свое MDI окно в плагине не было... Да здравствует АСКОН!!!

Dim

Здравствуйте всем!!! Помогите, пожалуйста, кто делал исходник, который отображает в дереве (TreeView) связанных объектов в Лоцмане, у мя не получается... Мне нужно именно связаны с компонентами TreeView и понять... Заранее спасибо.  :|

YorikER

Уважаемый Dim. Вопрос не такой простой, как кажется... Чтобы на него как-то быстро ответить, необходимо хотя бы знать с чего начинать отвечать... Т.е. (прошу прощения) необходимо знать ваш опыт программирования в Delphi... Для начала хотя бы так:
1. TTreeView - компонент, представляющий в виде древовидной структуры набор строковых записей. Каждая запись может сопровождаться двумя изображениями, для хранения которых используются компоненты TImageList. К слову говоря, в ЛОЦМАНе в дереве используются три изображения: уровень доступа, тип и состояние объекта. Как программисты АСКОНа это сделали, я пока не сообразил...
2. Начинается построение с головного объекта. Необходимо иметь уникальный идентификатор объекта типа integer, по которому можно прочесть атрибуты объекта, пределить его тип, состояние и ключевой атрибут. Для этого используются методы сервера приложений GetInfoAboutVersion и GetAttributes. Не помню как в плагинах, в собственном клиенте необходимо сначала подключиться к серверу приложений, используя компонент TDCOMConnection, а затем, используя выше указанные методы сервера приложений поместить наборы данных в компоненты типа TClientDataSet. Разобрав наборы данных, сформировать головную строку и изображения, поместить их в TTreeView.
3. Затем, используя методы сервера приложений GetLinkedFast, GetLinkedObjectsEx или GetTree, получить наборы данных, описывающие объекты, связанные с головным компонентом по выбранной связи. Наборы данных помещаются так же в компоненты TClientDataSet. Разобрав в цикле каждый из подчиненных компонентов, заполняете структуру TTreeView.
В принципе все просто, если знать с чего начать и иметь опыт работы с указанными компонентами... Если речь идет не о плагине, в принципе могу каждый шаг объяснить более подробно...

Максим

Цитата: Dim от 14.07.08, 10:15:33
Здравствуйте всем!!! Помогите, пожалуйста, кто делал исходник, который отображает в дереве (TreeView) связанных объектов в Лоцмане, у мя не получается... Мне нужно именно связаны с компонентами TreeView и понять... Заранее спасибо.  :|
При построении дерева id записываю в overlayindex, неправильно конечно, но мне в программе он не нужен
При нажатии на объект его данные считываются с базы как и в Лоцмане.

Делаю не 3, а 2 иконки, хотя можно и три пробовать но мне это не нужно. в дереве прорисовываю две иконки как одну, те из imagelist1 и imagelist2 беру иконки(16х16) и заполняю imagelist3 (32х16).

Правда работает пока еще все медленно, где-то в 2 раза медленнее чем в Лоцмане. При открывании маленьких ветвей незаметно, а вот большие приходится долго ждать.

Напиши конкретно что ты хочешь сделать. Пару кусков кода выдрать можно.

Dim

Спасибо YorikER и Максим!!!
Мне нужно, допустим ComboBox, выбрал, например, Т160.00.00 и автоматически выводится TreeView, связанная с GetTree(можно другие функции - Связанные объекты), вот именно мне нужен кусок кода. Буду благодарен... мой Е-почта: krolik1979@list.ru .
Для меня сложно... Заранее спасибо  :)

Максим

Цитата: Dim от 15.07.08, 07:36:30
Спасибо YorikER и Максим!!!
Мне нужно, допустим ComboBox, выбрал, например, Т160.00.00 и автоматически выводится TreeView, связанная с GetTree(можно другие функции - Связанные объекты), вот именно мне нужен кусок кода. Буду благодарен...Для меня сложно... Заранее спасибо  :)
var
 node:Ttreenode;
 ver1:Tversion;
 data1:Tclientdataset;
...
ver1:=Tversion.fromidversion(idcombo);
data1:=Tclientdataset.create(nil);
data1.data:=ver.gettree('','','',idcombo,'Состоит из ...#1Документы',false);
data1.first;
while not data1.eof do
begin
 node:=treeview1.items.add(nil,data1.fields.fieldbyname('_PRODUCT').asstring);
 node.overlayindex:=data1.fields.fieldbyname('_ID_VERSION').asinteger;
 node.stateindex:=data1.fields.fieldbyname('_TYPE').asinteger;
 data1.next;
end;
data1.free;
ver.free;

YorikER

Уважаемый Максим. Пара соображений... Я храню id  в свойстве Node.Data тип Pointer, преобразуя в integer... Это на мой взгляд более правильно, т.к. Data для этого и предназначена...
Просьба прокомментируйте строку node.stateindex:=data1.fields.fieldbyname('_TYPE').asinteger; В этом случае тип объекта возвращается как integer? И что означает этот integer. Числовой идентификатор типа в БД?