Доп. приложение ЛОЦМАНа

Автор Atroshenko, 30.10.07, 08:34:19

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

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

Atroshenko

Здравствуйте!
В плагинах под ЛОЦМАН 7.1, которые мы разработали, для перехода из
внешнего приложения использовано сообщение WM_GOTOOBJECT и использовано
в функции:
PostMessage(<клиентское окно>, WM_GOTOOBJECT, <ID объекта>, 0) Переход к объекту в клиентском окне выполнялось без проблем. При переходе на ЛОЦМАН 8.5 переход перестал выполняться. Прошу решить данную проблему. Может, вид сообщения или параметры в
функции изменились?

LDL

Работает данная фукнция, и синтаксис не менялся.

EVD

Тоже заметил, что в Лоцмане 8.5 SP1 не работают функции обновления объектов (WM_REFRESHVERSION, WM_REFRESHPARENT). В Лоцмане 8 все работало.

Atroshenko

Еще раз сформулирую вопрос поподробнее:
Наше предприятие перешло на Лоцман 8.5SP1. До этого работали на версии 7.1SP1. Все плагины были разработаны для этой версии. При переходе обнаружились следующие ошибки:
1) Не работает PostMessage(<клиентский хэндл>, WM_GOTOOBJECT, <ИД объекта>, 0). Примеры с сообщениями WM_GOTOCHILD и WM_GOTONODE в нашем случае не подходят. Пожалуйста, скажите, работает ли в 8.5 данное сообщение WM_GOTOOBJECT = WM_USER + 9. И если не поддерживается, есть ли какой-либо аналог или вариант использования другого сообщения?

2) Плагины в версии 8.5 не работают при выделении объекта в составе (правая область клиентского окна). Выдаётся сообщение: При выполнении [<название нашей функции>] в модуле [<наш модуль>] произошла ошибка [EAccessViolation]: Access Violation at address 038513DE in module <наш модуль>. Read of address 0000004. Если объект выделен в дереве, плагин работет нормально. При работе плагинов в версии 7.1 этого не было: плагин одинаково работал и в дереве и в составе. В чём тут проблема?

AI

1) Вроде работает WM_GOTOOBJECT, у меня по крайней мере проблем с ним не было.
Попробуйте такую комбинацию:
SendMessage(<клиентский хэндл>, WM_REFRESHPARENT, <ИД объекта>, 0)
SendMessage(<клиентский хэндл>, WM_GOTOOBJECT, <ИД объекта>, 0)

2) Если фокус стоит не на дереве объеков, то в качестве выбранного объекта передается пустое значение - нужно проверять такие ситуации.

Atroshenko

1) В ситуации №1 так и делаем - но ничего не получается.

2) Попробуем.

Atroshenko

По поводу отсутствия перехода по сообщению WM_GOTOOBJECT:
Ошибки никакой не выдаётся, только переход сам не совершается.
Мы используем следующую комбинацию:
PostMessage(ClientHandle, WM_REFRESHPROJECTLIST, 0, 0) PostMessage(ClientHandle, WM_GOTOOBJECT, ID, 0) Сегодня пробовали добавить WM_REFRESHPARENT, ID, 0). Переход всё равно не совершается. Главная трудность, что на этом у нас построены практически все плагины.
Главное, что эта комбинация работала совершенно нормально в версии 7.1 SP1.

AI

Если совсем ничего не получается попробуйте переходить на объект, используя файл-ссылку
 
  var LFile: TextFile;

  S:='-|'+DBName+'|'+StrToInt(ObjectID);
  System.AssignFile(lfile,GetEnvironmentVariable('TMP')+'\temp.lnd');
  System.Rewrite(lfile);
  System.Writeln(lfile,S);
  System.CloseFile(lfile);
  ShellExecute(0,nil,
    PAnsiChar(GetEnvironmentVariable('TMP')+'\temp.lnd')
    ,nil,nil,SW_SHOWNORMAL);

Atroshenko

#8
Всем спасибо за помощь!!!
Решили с помощью следующего кода:
S := '-|' + FIniFile.ReadString('Options', 'Base', '') + '|' + IntToStr(N);
      B := GetEnvironmentVariable('TMP');
      AssignFile(SF, B + '\temp.lnd');
      Rewrite(SF);
      Writeln(SF,S);
      CloseFile(SF);
      ShellExecute(0, nil, PAnsiChar(B + '\temp.lnd'), nil, nil, SW_SHOWNORMAL);