Page 1 of 1

AkelPad to Pascal

Posted: Thu Oct 18, 2012 1:00 pm
by booleg
Можно ли как то сделать, что бы по нажатию какой либо кнопки текст из Акелпада передавался в Borland Pascal? Как вариант: сахранялся в Акелпаде и сразу же запускался паскаль с открытием этого файла.

Posted: Thu Oct 18, 2012 2:11 pm
by Instructor
booleg
Для передачи файла на обработку компилятору см. Log плагин.

Posted: Thu Oct 18, 2012 2:21 pm
by DV
А для автоматизации этого дела можно воспользоваться скриптом RunMe.js:
viewtopic.php?p=13010#p13010
Открыв скрипт, нужно будет добавить в определение oCommands что-то вроде

Code: Select all

"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"), позволяющий изменить строку запуска - например, добавить какие-то параметры. Изменённая строка запуска сохраняется для последующего использования.
Вот такие вот пироги с котятами :)

Posted: Thu Dec 06, 2012 10:18 am
by booleg
Рабочий вариант (огромное спасибо DV помощь) получился такой:
в RunMe.js v.1.9 в раздел oCommands добавляем

Code: Select all

"pas" : 
    ":run_pasfile(\"%f\")" , 
и добавляем функцию

Code: Select all

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: Select all

assign(f,'input.txt');
где предполагается работа с входным файлом расположенным в той же директории, что и файл программы и не указывается полный путь к этому файлу, то возникают проблемы. Если редактируемый паскалевский файл находится на том же диске, что и Акелпад ( не важно в какой папке) - всё в порядке, а иначе он этот входной файл не находит. В скрипт надо добавить кроме команды смены директории ещё команду смены диска, а для этого видимо нужна соответствующая системная переменная типа %d только для диска.
Как это сделать и реально ли вообще это сделать я не знаю. :(

Posted: Thu Dec 06, 2012 10:33 am
by DV
Надо в скрипт добавить примерно такую функцию:

Code: Select all

function setCurrentDir(dir)
{
  var oSys = AkelPad.SystemFunction();
  oSys.Call("kernel32::SetCurrentDirectory" + _TCHAR, dir);
}
и вызывать её где-то перед вызовом runCommand.

setCurrentDir будет функцией общего назначения, её логично разместить рядом с функциями envGetVar и envSetVar.

Posted: Thu Dec 06, 2012 10:44 am
by booleg
параметр dir что должен из себя представлять?

Posted: Thu Dec 06, 2012 11:20 am
by DV
хм, путь к папке.
В нашем случае вызвать можно как setCurrentDir(getFileDir(filePathName)).

Posted: Thu Dec 06, 2012 12:07 pm
by booleg
Ура!!! Работает!!! Я в качестве параметра пробовал %d ставить оно и не шло.
Саму функцию после envSetVar воткнул, ну а run_pasfile сейчас выглядит так:

Code: Select all

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
}
Огромное спасибо! Теперь для полного счастья, только подсветки ошибок в лог окошке не хватает.