-
Проблема следующая: хотелось бы из командной строки задавать имя файла и номер строки в нем для загрузки этого файла в редактор IDE и позиционирования на заданную строку. Если можно еще и номер позиции символа в строке, совсем хорошо. Чтение Command-Line Switches ничего не дало, для поиска в гугле, наверное не знаю, как сформулировать запрос.
То, что это возможно - факт. Хотелось бы знать, как.
-
[В порядке бреда] Можно написать консольную прогу которая автоматически позиционирует курсор, если знать класс окна редактора.
-
Dib@zol © (04.12.07 11:54) [1]
Бредить не надо.
-
> Бредить не надо.
Надо ждать Суслика :)
-
Насколько я помню, в BP7 поиск по исходным текстам с использованием регулярных выражений был внешней утилитой GREP, она взаимодействовала с IDE используя стандартное представление результатов. Я к тому что если фича существует, можно предположить что формат описания номеров строк такое же как и в GREP.
Разумеется компилятор как-то взаимодействует с IDE, но там видимо более глубокое взаимодействие, раз компиляция возможна без сохранения исходников. Если задача не ограничивается стандартными средствами и можно что-то своё ддописать к IDE, то проще всего глянуть как в GExpert раотает тот же поиск по регвыражениям, он тоже позиционирует курсор.
-
program SetCur;
uses
Windows, Messages;
const
EM_KEYDOWN = WM_USER + 47360;
EM_KEYUP = WM_USER + 47361;
var
W : HWND;
begin
W:=FindWindow('TEditWindow', nil);
W:=FindWindowEx(W, 0, 'TPanel', nil);
W:=FindWindowEx(W, 0, 'TPanel', nil);
W:=FindWindowEx(W, 0, 'TPanel', nil);
W:=FindWindowEx(W, 0, 'TPanel', nil);
W:=FindWindowEx(W, 0, 'TEditControl', nil);
SendMessage(W, WM_KEYDOWN, $43, $2E0001);
SendMessage(W, EM_KEYDOWN, $43, $2E0001);
SendMessage(W, WM_KEYUP, $43, $C02E0001);
SendMessage(W, EM_KEYUP, $43, $C02E0001);
end. Вота вам. Эта прога, будучи запущена, вводит символ "с" в окно редактора кода. Точно так же можно проставить и курсор. Делайте выводы.
-
Dib@zol © (04.12.07 12:21) [5]
Если у тебя есть фонтан, заткни его, дай отдохнуть и фонтану
-
> Игорь Шевченко
1. Спозиционировать курсор можно через интерфейсы редактора IDE, которые доступны через переменную BorlandIDEServices.
2. Это можно сделать и автоматически при открытии файла, если написать соответствующий эксперт IDE (что-то типа IOTAProject, точнее по памяти не скажу, надо копнуть исходники ToolsAPI.pas).
3. А вот как передать эксперту нужные параметры - это вопрос. Можно через временный файл. Можно добавить в меню Delphi свой пункт, при щелчке по которому эксперт выведет диалог запроса параметров. Но чтоб через параметры командной строки самой Delphi - такого не встречал.
-
> Можно добавить в меню Delphi свой пункт, при щелчке по которому > эксперт выведет диалог запроса параметров.
А можно и без пункта меню - когда эксперт перехватывает открытие файла, он сам и выводит диалог запроса параметров.
-
Не, ну я предлагаю как вариант. Вот код для имитации нажатия курсорных клавиш "Вниз" и "Вправо":
procedure PushDwn(H:HWND); begin SendMessage(H, EM_KEYDOWN, $28, $1500001); SendMessage(H, EM_KEYUP, $28, $C1500001); end;
procedure PushFwd(H:HWND); begin SendMessage(H, EM_KEYDOWN, $27, $14D0001); SendMessage(H, EM_KEYUP, $27, $C14D0001); end;
А поскольку при открытии курсор устанавливается в позицию 1:1, то нетрудно вычислить сколько раз нужно сымитировать нажатие чтобы установить курсор в нужное Вам место, координаты которого можно передавать проге в качестве параметров.
Зыж моё дело предложить, ваше дело отказаться.
-
> Dib@zol © (04.12.07 12:52) [9]
Андрей, вот поверь, что Игорь знает все эти примочки не хуже тебя. Но это неправильное решение, понимаешь?
-
А я знаю. Просто этот способ гораздо легче, нежели через всякие эксперты, не так ли? Зачем убиваться, если прогу делаешь для себя? Я ещё понимаю, если б на продажу! Но для себя-то? Тратить полдня на изучение километровых хелпов, потом ещё полдня кодить... не понимаю.
-
Юрий Зотов © (04.12.07 12:48) [7]
> Но чтоб через параметры командной строки самой Delphi - > такого не встречал.
То, что через параметры командной строки среды - этого я не могу, уже help посмотрел, не увидел. Но если у меня будет написана некая прослойка, пусть даже встроенная в IDE (хотя очень не хочется, потому как может быть Turbo Delphi Explorer в который ничего не встроишь), то передав ей нужные параметры я наверное смогу сделать то, что хочется.
Вопрос - с какого слова, кроме BorlandIDEServices начинать поиск ?
-
> Dib@zol © (04.12.07 13:00) [11]
А потом в IDE появляется еще одна панель - и все твои труды оказываются напрасными... :о)
Как известно, любая сложная проблема всегда имеет как минимум одно простое, легкое для понимания неправильное решение... :о)
-
Зачем мне это надо - написан некий анализатор исходного кода по неким правилам. Анализатор является консольной программой (и это хорошо), результаты выдает в виде строк в стандартный вывод имя_файла номер_строки сообщение
Хотелось бы иметь опциональную возможность перенаправлять результат вывода в некую программу, которая будет загружать все перечисленные файлы в IDE и позиционировать на указанную строку.
Если легкого способа не получится, идея отомрет, потому как в принципе и редактора FAR-а достаточно...
-
> Игорь Шевченко © (04.12.07 13:11) [12]См. в файле ToolsAPI.pas интерфейсы, начинающиеся с IOTA. Их там довольно много, но все не нужны. Особо обрати внимание на IOTAEditorServices, IOTAIDENotifier, IOTAActionServices, IOTAModuleServices. А это посмотри для затравки: http://www.gigabyte.iatp.org.ua/articles/experts.htmlВообще в Сети немало материалов по разработке экспертов IDE, найдешь легко.
-
Так чем дело кончилось?
-
В файле Project1.dsk есть строки
[View0] Module=Unit1.pas CursorX=10 CursorY=115 TopLine=108 LeftCol=1
при запуске Delphi отркоется редактор файла Unit1 и курсор будет на строке 115 в позиции 10
-
icWasya © (05.12.07 10:55) [17]
Это хорошо, если среда еще не запущена, а если в ней уже открыто N файлов да еще из разных проектов и требуется открыть еще один и установиться там. Собственно сам механизм я могу выдрать из GExperts, там, слава Аллаху, этих примеров механизмов, как звезд на небе, а вот как обеспечить взаимодействие отдельной программы со средой, пусть даже со встроенным экспертом, я пока затрудняюсь понять.
Проблема еще и в том, что файлов много - потенциально несколько тысяч...
-
Если я правильно понял вопрос, то решение вижу так: 1. Нужно создать эксперт и установить его в среду. 2. Эксперт при старте создает message-only окошко с уникальным типом или именем. 3. Окошко, при приходе определенного типа сообщения, запрашивает определенный сервис у среды, обращаясь к BorlandIDEServices (нужно посмотреть какой именно, с ходу сказать затрудняюсь), который создает окно в редакторе, загружает туда файл и устанавливает позицию куда требуется. Это явно делается просто, нужно только найти какой сервис за это отвечает, изучите ToolsAPI.pas и гляньте сторонние эксперты. 4. Консольное приложение ищет это окошко и посылает ему WM_COPYDATA, например, в котором передает имя файла и позицию, где нужно установить курсор. Можно также в приложении проверять, запущена ли среда, и если нет - запускать ее.
|