| View previous topic :: View next topic |
| Author |
Message |
booleg
Joined: 07 Mar 2012 Posts: 20
|
Posted: Thu Oct 18, 2012 1:00 pm Post subject: AkelPad to Pascal |
|
|
| Можно ли как то сделать, что бы по нажатию какой либо кнопки текст из Акелпада передавался в Borland Pascal? Как вариант: сахранялся в Акелпаде и сразу же запускался паскаль с открытием этого файла. |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4649
|
Posted: Thu Oct 18, 2012 2:11 pm Post subject: |
|
|
booleg
Для передачи файла на обработку компилятору см. Log плагин. |
|
| Back to top |
|
 |
DV
Joined: 16 Nov 2006 Posts: 725 Location: Kyiv, Ukraine
|
Posted: Thu Oct 18, 2012 2:21 pm Post subject: |
|
|
А для автоматизации этого дела можно воспользоваться скриптом RunMe.js:
http://akelpad.sourceforge.net/forum/viewtopic.php?p=13010#13010
Открыв скрипт, нужно будет добавить в определение oCommands что-то вроде
| Code: | "pas" :
"cmd /c Path_To_Pascal_Compiler.exe \"%f\" || pause" , |
Затем назначаем горячую клавишу для вызова RunMe.js - и вуаля.
Обновил RunMe.js.
Что нового:
- расширения файлов сравниваются регистро-независимо;
- добавлен Python и Free Pascal (предполагается, что при установке они зарегистрировались в системе - иначе в файле RunMe.js нужно указать к ним полный путь);
- добавлен внешний вызов Call("Scripts::Main", 1, "RunMe.js", "1"), позволяющий изменить строку запуска - например, добавить какие-то параметры. Изменённая строка запуска сохраняется для последующего использования.
Вот такие вот пироги с котятами  |
|
| Back to top |
|
 |
booleg
Joined: 07 Mar 2012 Posts: 20
|
Posted: Thu Dec 06, 2012 10:18 am Post subject: |
|
|
Рабочий вариант (огромное спасибо DV помощь) получился такой:
в RunMe.js v.1.9 в раздел oCommands добавляем
| Code: | "pas" :
":run_pasfile(\"%f\")" , |
и добавляем функцию
| Code: | function run_pasfile(filePathName)
{
var cmd1 = "fpc.exe \"%f\""; // compile
var cmd2 = "cd \"%d\\\" && rundll32.exe shell32,ShellExec_RunDLL \"%d\\%n.exe\""; // current dir = file dir && run .exe
var cmd = "cmd /c" + cmd1 + " && " + cmd2;
cmd = prepareCommand(cmd, filePathName); // pre-process %f, %n etc.
runCommand(cmd); // run
} |
Получаем скрипт, который компилирует во FreePascal и сразу запускает полученный exe файл. Проверил на WinServer2003(32) и Win7(32) - всё отлично работает! Если у кого то есть возможность протестировать на 64-битной системе - сообщите пожалуйста о результатах.
А теперь добавим в эту бочку мёда маленькую ложечку дёгтя.
Если вы пишете программы, в которых информация вводится с клавиатуры и выводится на экран, то можете спокойно пользоваться этим скриптом всё отлично работает. Если же ввод-вывод идет через файлы, а именно используется конструкция типа
| Code: | | assign(f,'input.txt'); |
где предполагается работа с входным файлом расположенным в той же директории, что и файл программы и не указывается полный путь к этому файлу, то возникают проблемы. Если редактируемый паскалевский файл находится на том же диске, что и Акелпад ( не важно в какой папке) - всё в порядке, а иначе он этот входной файл не находит. В скрипт надо добавить кроме команды смены директории ещё команду смены диска, а для этого видимо нужна соответствующая системная переменная типа %d только для диска.
Как это сделать и реально ли вообще это сделать я не знаю.  |
|
| Back to top |
|
 |
DV
Joined: 16 Nov 2006 Posts: 725 Location: Kyiv, Ukraine
|
Posted: Thu Dec 06, 2012 10:33 am Post subject: |
|
|
Надо в скрипт добавить примерно такую функцию:
| Code: | function setCurrentDir(dir)
{
var oSys = AkelPad.SystemFunction();
oSys.Call("kernel32::SetCurrentDirectory" + _TCHAR, dir);
}
|
и вызывать её где-то перед вызовом runCommand.
setCurrentDir будет функцией общего назначения, её логично разместить рядом с функциями envGetVar и envSetVar. |
|
| Back to top |
|
 |
booleg
Joined: 07 Mar 2012 Posts: 20
|
Posted: Thu Dec 06, 2012 10:44 am Post subject: |
|
|
| параметр dir что должен из себя представлять? |
|
| Back to top |
|
 |
DV
Joined: 16 Nov 2006 Posts: 725 Location: Kyiv, Ukraine
|
Posted: Thu Dec 06, 2012 11:20 am Post subject: |
|
|
хм, путь к папке.
В нашем случае вызвать можно как setCurrentDir(getFileDir(filePathName)). |
|
| Back to top |
|
 |
booleg
Joined: 07 Mar 2012 Posts: 20
|
Posted: Thu Dec 06, 2012 12:07 pm Post subject: |
|
|
Ура!!! Работает!!! Я в качестве параметра пробовал %d ставить оно и не шло.
Саму функцию после envSetVar воткнул, ну а run_pasfile сейчас выглядит так:
| Code: | function run_pasfile(filePathName)
{
var cmd1 = "fpc.exe \"%f\""; // compile
var cmd2 = "cd \"%d\\\" && rundll32.exe shell32,ShellExec_RunDLL \"%d\\%n.exe\""; // current dir = file dir && run .exe
var cmd = "cmd /c" + cmd1 + " && " + cmd2;
cmd = prepareCommand(cmd, filePathName); // pre-process %f, %n etc.
setCurrentDir(getFileDir(filePathName));
runCommand(cmd); // run
} |
Огромное спасибо! Теперь для полного счастья, только подсветки ошибок в лог окошке не хватает. |
|
| Back to top |
|
 |
|