Открытые инструменты: дополнительные возможности в стандартном редакторе

21 15

Введение

"DIRECTUM Помощник" производит вставку имен объектов платформы в текст обработки. В стандартном редакторе уже присутствует подобный функционал, вызывается он через команды главного меню "Вставка -> Имя реквизита/Имя справочника" и т.д. Я попытался реализовать этот инструмент в виде самостоятельной панели инструментов. По двойному нажатию на элемент(родительский или дочерний) в дереве объектов помощника, он выполняет вставку наименования или характеристик элемента в место расположения курсора непосредственно в редакторе DIRECTUM. Для получения списка объектов, помощник подключается к sql сереверу к базе данных DIRECTUM, авторизация выполняется по прямому паролю.

 

Главное окно

Вставка текста происходит по двойному нажатию на элемент в дереве объектов.

 

Настройки расположены в нижней части главного окна

 

Фильтр по названию объекта

Листинг

Помощник работает следующим образом:

1. получает активное окно функцией GetForegroundWindow;

2. проверяет это окно на наличие редактора TSLSynEdit через FindWindowEx;

3. если в окне программы присутствует окно ввода редактора обработок TSLSynEdit, он запоминает хенлд окна и редактора TSLSynEdit.

4. отправка текста в редактор DIRECTUM выполняется при помощи функции PostMessage

Проверка активного окна

procedure TDIRAssistant.connector_guardTimer(Sender: TObject);
var
  new_handle, synedit:HWND;
begin
  //Организация подключения к редактору-----------------------------------------
  
  //смотрим активное окно
  new_handle := GetForegroundWindow();

  //если это не то окно которое мы уже захватили, тогда проверяем его на наличие компонента TSLSynEdit в котором выполняется редактирование кода в DIRECTUM
  if new_handle <> editor_window_handle then
  begin
    synedit    := FindWindowEx(new_handle, 0, 'TSLSynEdit', nil);
    if synedit <> 0 then
      ConnectToEditor(new_handle);
  end;

  //Если считаем что подключены, проверяем состояние окна, не закрыто ли оно
  if connected then
    if not IsWindow( editor_synedit_handle ) then
      connected := false;

  //Просто сообщение в строке статуса. Больше для разработчика чем для пользователя
  if connected then
    StatusBar.Panels[0].Text := 'Есть окно: ' + IntToStr( editor_window_handle )
  else
    StatusBar.Panels[0].Text := 'Нет окна';

  //----------------------------------------------------------------------------
  
end;
//по сути просто дублирование проверки, сохранение хендла в общедоступной переменной и установка служебных флагов   
procedure ConnectToEditor( possible_window:HWND );
var
  synedit : HWND;
begin
  if possible_window = 0 then exit;

  
  synedit := possible_window;
  synedit := FindWindowEx(synedit, 0, 'TSLSynEdit', nil);  
  if synedit <> 0 then
  begin
    editor_window_handle  := possible_window;
    editor_synedit_handle := synedit;
    if editor_synedit_handle <> 0 then
    begin     
      connected := true;
    end
    else
    begin
      connected := false;
    end;
  end;
end;   

Следующая функция передает требуемый текст в окно редактора, в место расположения курсора

//Отправка текста в окно посимвольно
procedure PostString( str:string );
var
    i:integer;
begin
  str := ' ' + str;
  for i:= 1 to Length( str ) do
  begin
    PostMessage( editor_synedit_handle, wm_Char, Word(str[ i ]), 0);
  end;
  SetForegroundWindow( editor_synedit_handle );
end;

Исходники программы прилагаются. В основе разработки лежат стандартные компоненты Delphi 7, все должно собираться без проблем и на других местах.

P.S. Данная разработка возникла в голове примерно в одно время вместе с замечательным материалом Дениса Баранова "Инспектор объектов", а реализацию получила только сейчас.

 

Вложения

Помощник.rar (431,91 Кб) (rev2)

Cтраница проекта http://code.google.com/p/directum-assistant/

 

P.P.S. То что я выложил это пока только концепт. То над чем работаю уверен будет интересно разработчикам и администраторам :)

21
Авторизуйтесь, чтобы оценить материал.
1
Александр Гуртяков

Попробовал. Интересная программа. Сразу хочется несколько замечаний для улучшения:

В настройках подключения нужно допускать указание пустого пароля

 

Наряду с возможностью вставки имени реквизита, было бы хорошо иметь возможность вставить имя поля (не PreProcQuery)

Возможность вызвать утилиту горячими клавишами

Было бы круто если список баз, к которым можно подключиться брался из конфигуратора

Когда вызываешь Файл-> Настройки хорошо бы иметь кнопку Отмена (а то получается либо полный выход, либо снова переподключаться, если требуется оставить текущую базу)

На таскбаре в win7 у меня почему то крякозяблы вместо названия :)

 

Арслан Абакаров

Учел замечания. :)

>Наряду с возможностью вставки имени реквизита, было бы хорошо иметь возможность вставить имя поля (не PreProcQuery)

Внизу окна подведите мышку к настройкам, они раскроются, выберите "Имена реквизитов справочников". Оно?

 

Алексей Язынин

   Возможность вызвать утилиту горячими клавишами

Нужно найти ярлык требуемой программы, после чего вызвать контекстное меню по правой клавише мыши и открыть пункт меню "Свойства". Далее в открывшемся окне, в поле "Быстрый вызов" следует указать клавишу, которая будет отвечать за вызов данной программы.
Быстрый вызов осуществляется для ярлыков, расположенных на рабочем столе в меню "Пуск"

Александр Гуртяков

>> Нужно найти ярлык требуемой программы, после чего ... 

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

>> Внизу окна подведите мышку к настройкам, они раскроются, выберите "Имена реквизитов справочников". Оно?

Нет, я имел ввиду имя SQL поля соответствующего реквизита.

Еще в прошлый раз забыл написать - почему то быстрый поиск не ищет по коду справочника или типу карточки. Только если вбивать наименование. Было бы очень удобно если бы сразу искал и по коду и по имени.

P.S. также очень приятно, что вы выложили исходники.

Арслан Абакаров

Выложил вчера вечером изменения.

Иван Булычев

еще одно мелкое замечание, в окне настройки подключения, поменять бы порядок перехода по TAB, а то после поля БД переходим на кнопки

Арслан Абакаров

Я очень извиняюсь за TABы, за элементарными вещами не уследил.

Если что, там по ентеру попорядку переходит.

Арслан Абакаров

Готовлю новый материал по взаимодействию с проводником DIRECTUM через WinAPI, будет новый функционал для работы с типовыми маршрутами.

Арслан Абакаров

Инструмент потихоньку развивается. Промежуточные версии с "торчащими" элементами отладки можно смотреть в разделе загрузок на странице проекта.

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

 

Анастасия Кузьмина

Арслан, а ведь это тянет на техническое решение на базе DIRECTUM!

Подумайте над публикацией в Каталог технических решений и сертификацией. Эта процедура описана в документе на сайте поддержки Правила публикации, сертификации и распространения технических решений партнеров DIRECTUM

Арслан Абакаров

Спасибо! Уже смотрю документы.

Надежда А

Продумайте запуск под Win-aутентификацией.

А также продумайте запуск с правами-Администратор или разработчик (для пользователя не должно быть прав).

Алексей Язынин

Показал вашу утилиту на курсах по разработке.

Арслан Абакаров

Алексей, очень приятно слышать. Я значительно проработал инструмент с момента первой публикации, жаль, что не успел с публикацией изменений ранее и инструмент был продемонстрирован в таком зачаточном состоянии. Буду рад через некоторое время показать обновленный вариант.

Надежда, мне как раз вчера пришла в голову мысль как можно реализовать доменную авторизацию инструмента в системе, спасибо за высказанное пожелание.

Арслан Абакаров

Авторизуйтесь, чтобы написать комментарий