Введение
"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. То что я выложил это пока только концепт. То над чем работаю уверен будет интересно разработчикам и администраторам :)