Конференция "Компоненты" » Спозиционировать редактор IDE на определенную позицию извне ?
 
  • Игорь Шевченко © (04.12.07 11:50) [0]
    Проблема следующая: хотелось бы из командной строки задавать имя файла и номер строки в нем для загрузки этого файла в редактор IDE и позиционирования на заданную строку. Если можно еще и номер позиции символа в строке, совсем хорошо.
    Чтение Command-Line Switches ничего не дало, для поиска в гугле, наверное не знаю, как сформулировать запрос.

    То, что это возможно - факт. Хотелось бы знать, как.
  • Dib@zol © (04.12.07 11:54) [1]
    [В порядке бреда] Можно написать консольную прогу которая автоматически позиционирует курсор, если знать класс окна редактора.
  • Игорь Шевченко © (04.12.07 11:57) [2]
    Dib@zol ©   (04.12.07 11:54) [1]

    Бредить не надо.
  • Kolan © (04.12.07 11:58) [3]
    > Бредить не надо.

    Надо ждать Суслика :)
  • guav © (04.12.07 12:13) [4]
    Насколько я помню, в BP7 поиск по исходным текстам с использованием регулярных выражений был внешней утилитой GREP, она взаимодействовала с IDE используя стандартное представление результатов.
    Я к тому что если фича существует, можно предположить что формат описания номеров строк такое же как и в GREP.

    Разумеется компилятор как-то взаимодействует с IDE, но там видимо более глубокое взаимодействие, раз компиляция возможна без сохранения исходников.
    Если задача не ограничивается стандартными средствами и можно что-то своё ддописать к IDE, то проще всего глянуть как в GExpert раотает тот же поиск по регвыражениям, он тоже позиционирует курсор.
  • Dib@zol © (04.12.07 12:21) [5]
    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.



    Вота вам. Эта прога, будучи запущена, вводит символ "с" в окно редактора кода. Точно так же можно проставить и курсор. Делайте выводы.
  • Игорь Шевченко © (04.12.07 12:23) [6]
    Dib@zol ©   (04.12.07 12:21) [5]

    Если у тебя есть фонтан, заткни его, дай отдохнуть и фонтану
  • Юрий Зотов © (04.12.07 12:48) [7]
    > Игорь Шевченко

    1. Спозиционировать курсор можно через интерфейсы редактора IDE, которые доступны через переменную BorlandIDEServices.

    2. Это можно сделать и автоматически при открытии файла, если написать соответствующий эксперт IDE (что-то типа IOTAProject, точнее по памяти не скажу, надо копнуть исходники ToolsAPI.pas).

    3. А вот как передать эксперту нужные параметры - это вопрос. Можно через временный файл. Можно добавить в меню Delphi свой пункт, при щелчке по которому эксперт выведет диалог запроса параметров. Но чтоб через параметры командной строки самой Delphi - такого не встречал.
  • Юрий Зотов © (04.12.07 12:49) [8]
    >  Можно добавить в меню Delphi свой пункт, при щелчке по которому
    > эксперт выведет диалог запроса параметров.

    А можно и без пункта меню - когда эксперт перехватывает открытие файла, он сам и выводит диалог запроса параметров.
  • Dib@zol © (04.12.07 12:52) [9]
    Не, ну я предлагаю как вариант. Вот код для имитации нажатия курсорных клавиш "Вниз" и "Вправо":

    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, то нетрудно вычислить сколько раз нужно сымитировать нажатие чтобы установить курсор в нужное Вам место, координаты которого можно передавать проге в качестве параметров.

    Зыж моё дело предложить, ваше дело отказаться.
  • Юрий Зотов © (04.12.07 12:57) [10]
    > Dib@zol ©   (04.12.07 12:52) [9]

    Андрей, вот поверь, что Игорь знает все эти примочки не хуже тебя. Но это неправильное решение, понимаешь?
  • Dib@zol © (04.12.07 13:00) [11]
    А я знаю. Просто этот способ гораздо легче, нежели через всякие эксперты, не так ли? Зачем убиваться, если прогу делаешь для себя? Я ещё понимаю, если б на продажу! Но для себя-то? Тратить полдня на изучение километровых хелпов, потом ещё полдня кодить... не понимаю.
  • Игорь Шевченко © (04.12.07 13:11) [12]
    Юрий Зотов ©   (04.12.07 12:48) [7]


    > Но чтоб через параметры командной строки самой Delphi -
    > такого не встречал.


    То, что через параметры командной строки среды - этого я не могу, уже help посмотрел, не увидел.
    Но если у меня будет написана некая прослойка, пусть даже встроенная в IDE (хотя очень не хочется, потому как может быть Turbo Delphi Explorer в который ничего не встроишь), то передав ей нужные параметры я наверное смогу сделать то, что хочется.

    Вопрос - с какого слова, кроме BorlandIDEServices начинать поиск ?
  • Юрий Зотов © (04.12.07 13:13) [13]
    > Dib@zol ©   (04.12.07 13:00) [11]

    А потом в IDE появляется еще одна панель - и все твои труды оказываются напрасными...
    :о)

    Как известно, любая сложная проблема всегда имеет как минимум одно простое, легкое для понимания неправильное решение...
    :о)
  • Игорь Шевченко © (04.12.07 13:18) [14]
    Зачем мне это надо - написан некий анализатор исходного кода по неким правилам. Анализатор является консольной программой (и это хорошо), результаты выдает в виде строк в стандартный вывод
    имя_файла номер_строки сообщение

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

    Если легкого способа не получится, идея отомрет, потому как в принципе и редактора FAR-а достаточно...
  • Юрий Зотов © (04.12.07 13:21) [15]
    > Игорь Шевченко ©   (04.12.07 13:11) [12]

    См. в файле ToolsAPI.pas интерфейсы, начинающиеся с IOTA. Их там довольно много, но все не нужны. Особо обрати внимание на IOTAEditorServices, IOTAIDENotifier, IOTAActionServices, IOTAModuleServices.

    А это посмотри для затравки:
    http://www.gigabyte.iatp.org.ua/articles/experts.html

    Вообще в Сети немало материалов по разработке экспертов IDE, найдешь легко.
  • Kolan © (05.12.07 09:08) [16]
    Так чем дело кончилось?
  • icWasya © (05.12.07 10:55) [17]
    В файле Project1.dsk есть строки

    [View0]
    Module=Unit1.pas
    CursorX=10
    CursorY=115
    TopLine=108
    LeftCol=1

    при запуске Delphi отркоется редактор файла Unit1
    и курсор будет на строке 115 в позиции 10
  • Игорь Шевченко © (05.12.07 12:53) [18]
    icWasya ©   (05.12.07 10:55) [17]

    Это хорошо, если среда еще не запущена, а если в ней уже открыто N файлов да еще из разных проектов и требуется открыть еще один и установиться там. Собственно сам механизм я могу выдрать из GExperts, там, слава Аллаху, этих примеров механизмов, как звезд на небе, а вот как обеспечить взаимодействие отдельной программы со средой, пусть даже со встроенным экспертом, я пока затрудняюсь понять.

    Проблема еще и в том, что файлов много - потенциально несколько тысяч...
  • Ins © (07.12.07 11:22) [19]
    Если я правильно понял вопрос, то решение вижу так:
    1. Нужно создать эксперт и установить его в среду.
    2. Эксперт при старте создает message-only окошко с уникальным типом или именем.
    3. Окошко, при приходе определенного типа сообщения, запрашивает определенный сервис у среды, обращаясь к BorlandIDEServices (нужно посмотреть какой именно, с ходу сказать затрудняюсь), который создает окно в редакторе, загружает туда файл и устанавливает позицию куда требуется. Это явно делается просто, нужно только найти какой сервис за это отвечает, изучите ToolsAPI.pas и гляньте сторонние эксперты.
    4. Консольное приложение ищет это окошко и посылает ему WM_COPYDATA, например, в котором передает имя файла и позицию, где нужно установить курсор. Можно также в приложении проверять, запущена ли среда, и если нет - запускать ее.
 
Конференция "Компоненты" » Спозиционировать редактор IDE на определенную позицию извне ?
Есть новые Нет новых   [134428   +41][b:0][p:0.001]