AkelPad to Pascal

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 20
Joined: Wed Mar 07, 2012 10:27 am

AkelPad to Pascal

Post by booleg »

Можно ли как то сделать, что бы по нажатию какой либо кнопки текст из Акелпада передавался в Borland Pascal? Как вариант: сахранялся в Акелпаде и сразу же запускался паскаль с открытием этого файла.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

booleg
Для передачи файла на обработку компилятору см. Log плагин.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

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

Offline
Posts: 20
Joined: Wed Mar 07, 2012 10:27 am

Post 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 только для диска.
Как это сделать и реально ли вообще это сделать я не знаю. :(

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Надо в скрипт добавить примерно такую функцию:

Code: Select all

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

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

Offline
Posts: 20
Joined: Wed Mar 07, 2012 10:27 am

Post by booleg »

параметр dir что должен из себя представлять?

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

хм, путь к папке.
В нашем случае вызвать можно как setCurrentDir(getFileDir(filePathName)).

Offline
Posts: 20
Joined: Wed Mar 07, 2012 10:27 am

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