Вызов командной строки с помощью Лазаруса
Модератор: Модераторы
Вызов командной строки с помощью Лазаруса
Передо мной возникла следующая задача: требуется, чтобы по нажатию кнопки, лазарус открывал командную строку и нужную директорию там. А вообще надо с помощью pdflatex'а скомпилировать данный файл(путь к нему вводится в том же окне как переменная стринг) через командную строку, что должно происходить после нажатия кнопки в лазарусе. Извиняюсь если криво объяснил.
Написал такое вот чудо(привожу только часть кода):
var AProcess: TProcess;
AProcess := TProcess.Create(nil);
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.CommandLine:= 'cmd.exe';
AProcess.Execute;
AProcess.Free;
печаль в том, что хоть я пишу AProcess.CommandLine:= 'cmd.exe'; , что AProcess.CommandLine:= 'cmd.exe C: cd\lazarus'; разницы при запуске никакой. Где ошибка? как мне открыть вот такой путь например? (а потом желательно, открыв такую папку запустить в ней ещё программу, как написать здесь ещё и этьо не представляю)
господа, прошу помощи! извиняюсь, если коряво объяснил суть проблемы
Написал такое вот чудо(привожу только часть кода):
var AProcess: TProcess;
AProcess := TProcess.Create(nil);
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.CommandLine:= 'cmd.exe';
AProcess.Execute;
AProcess.Free;
печаль в том, что хоть я пишу AProcess.CommandLine:= 'cmd.exe'; , что AProcess.CommandLine:= 'cmd.exe C: cd\lazarus'; разницы при запуске никакой. Где ошибка? как мне открыть вот такой путь например? (а потом желательно, открыв такую папку запустить в ней ещё программу, как написать здесь ещё и этьо не представляю)
господа, прошу помощи! извиняюсь, если коряво объяснил суть проблемы
Process1.Active:=false;
Process1.ShowWindow:=swoShow;
Process1.Executable:='cmd';
Process1.Parameters.Clear;
Process1.Parameters.Add('/k');
Process1.Parameters.Add('notepad.exe');
Process1.Execute;
В новом лазарусе параметры записываются по другому
А тип переменной Process1 по прежнему TProcess?
И за "новый" лазарус версия 0.9.30.4 сойдёт?
И за "новый" лазарус версия 0.9.30.4 сойдёт?
Это пример для TProcess Lazarus 0.9.30.4
Спасибо.. я пока убрал параметры, и попытался вашим методом просто запустить командную строку. Но лазарус пишет следующее: "Проект Project1.exe вызвал класс исключения 'External: SIGSEGV' " что это значит?
Возможно процессу некуда писать, попробуйте [poWaitOnExit,poUsePipes]
и куда это вписывать теперь? всё в те же параметры? или в Options?
Добавлено спустя 48 минут 18 секунд:
А вообще, жутко был бы признателен, если вы бы сюда поместили вариант программы, позволяющей открыть командную строку, и в ней данную папку. Или хотя бы объяснить, как это делается.. или во 2м сообщении это и было?
Добавлено спустя 48 минут 18 секунд:
А вообще, жутко был бы признателен, если вы бы сюда поместили вариант программы, позволяющей открыть командную строку, и в ней данную папку. Или хотя бы объяснить, как это делается.. или во 2м сообщении это и было?
Sinill57 писал(а):А вообще, жутко был бы признателен, если вы бы сюда поместили вариант программы, позволяющей открыть командную строку, и в ней данную папку
Код: Выделить всё
AProcess := TProcess.Create(nil);
try
AProcess.ShowWindow := swoShow;
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Executable := 'cmd';
SetCurrentDir('C:\lazarus');
AProcess.Execute;
finally
AProcess.Free;
end;
Кр-р-расота! Спасибо-спасибо-спасибо! Теперь для полного счастья понять бы, как теперь, выбрав путь, написать имя программы а за тем имя файла.
Как-то так:
K:\practics>
K:\practics> pdflatex First.tex
и запустить это.
Буду очень признателен!
Как-то так:
K:\practics>
K:\practics> pdflatex First.tex
и запустить это.
Буду очень признателен!
Не выйдет, нет связи с процессом для записи. Но можно написать свой терминал с Memo
В связи с новыми факторами, переформулирую так: как теперь мне что-либо напечатать в эту открывшуюся командную строку с помощью лазаруса?
Добавлено спустя 3 минуты 31 секунду:
Ой, не увидел ваш ответ. а эта штука Memo как работает? Вроде как это просто окошко, куда можно вписать текст, разбивая его на строки, да? Недавно, ища ответ на мой вопрос, наткнулся вот на это: https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/examples/process/processdemomainform.pas
тут вроде и мемо есть, это то, что мне и нужно?
Добавлено спустя 3 минуты 31 секунду:
Ой, не увидел ваш ответ. а эта штука Memo как работает? Вроде как это просто окошко, куда можно вписать текст, разбивая его на строки, да? Недавно, ища ответ на мой вопрос, наткнулся вот на это: https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/examples/process/processdemomainform.pas
тут вроде и мемо есть, это то, что мне и нужно?
Sinill57 писал(а):требуется, чтобы по нажатию кнопки, лазарус открывал командную строку и нужную директорию там. А вообще надо с помощью pdflatex'а скомпилировать данный файл(путь к нему вводится в том же окне как переменная стринг) через командную строку, что должно происходить после нажатия кнопки в лазарусе.
ИМХО запихать всё это в батник и исполнить.
Точно.. а сам про них и не вспомнил
Но ведь чтобы запустить батник надо использовать другую команду, верно? Но вот какую?
Но ведь чтобы запустить батник надо использовать другую команду, верно? Но вот какую?
С помощью TProcess и запустить батник.
Подскажите, можно как-то выполнить команду следующего вида?
xcopy \server*.* %userprofile%data /y /d
а также
xcopy \server*.* "C:Documents and SettingsАдминистраторdata" /y /d
Чем это возможно сделать? WinExec, ShellExecute, AProcess?
Тут даже вопрос скорее не как запустить эту команду, а как собрать строку для ее выполнения.
Например следущая команда работает, и работает корректно.
AProcess.CommandLine := 'ping ya.ru';
Как правильно склеивать строки для выполнения через AProcess.Execute?
'xcopy'+" "+'\server*.*'+"userprofile" и т.п.
или в место + нужно использовать &
есть команда которая передает профиль текущего пользователя в место %userprofile% ?
Добавлено спустя 17 часов 44 минуты 14 секунд:
Как запустить команду разобрался.
Теперь проблема другая, а именно в кодировке. Если в пути есть русские символы то будут крякозябли, в место например xcopy \\server\*.* с:\папка /y /d
Как правильно побороть? Как передать xcopy с кодировкой 866? pchar и смена кодировки в редакторе lazarus на 866 не помогает...
xcopy \server*.* %userprofile%data /y /d
а также
xcopy \server*.* "C:Documents and SettingsАдминистраторdata" /y /d
Чем это возможно сделать? WinExec, ShellExecute, AProcess?
Тут даже вопрос скорее не как запустить эту команду, а как собрать строку для ее выполнения.
Например следущая команда работает, и работает корректно.
AProcess.CommandLine := 'ping ya.ru';
Как правильно склеивать строки для выполнения через AProcess.Execute?
'xcopy'+" "+'\server*.*'+"userprofile" и т.п.
или в место + нужно использовать &
есть команда которая передает профиль текущего пользователя в место %userprofile% ?
Добавлено спустя 17 часов 44 минуты 14 секунд:
Как запустить команду разобрался.
Теперь проблема другая, а именно в кодировке. Если в пути есть русские символы то будут крякозябли, в место например xcopy \\server\*.* с:\папка /y /d
Как правильно побороть? Как передать xcopy с кодировкой 866? pchar и смена кодировки в редакторе lazarus на 866 не помогает...
