[SOLVED] TProcess.Input.Write + KonsolenProgramm

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

[SOLVED] TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

Hi Leute :)

wie ein paar von euch schon wissen sollten, schreibe ich an einem Programm, das ein Konsole mit bestimmten Argumenten startet, dessen Output ausliest und in einem Memo anzeigt. Bis hier alles schon geschafft ;)

Ich brauche nun eine Möglichkeit, der Konsole irgenwie einen Input zu geben (so als würde man das in ihr eingeben und enter drücken)
und habe mich mal mit:

Code: Alles auswählen

 
procedure TForm_main.Button_sendCommandClick(Sender: TObject);
begin
  if javaProcessRunning then begin
    if javaProcess.Running then begin
       Edit_command.text:=Edit_command.text+#10; //<-- mit und ohne
       javaProcess.Input.Write(Edit_command.text, Length(Edit_command.text));
       Edit_command.clear;
    end;
  end;
end; 
 
... daran versucht.

Nun, leider passiert hier irgendwie einfach garnichts :oops:
Hinweis: Konsole ist mit poUsePipes gestartet und es kommen auch keine Fehlermeldungen.

Habe ich etwas falsch verstanden, oder läuft das bei Konsolen+TProcess ein wenig anders als in der Dokumentation ?

MfG

mark332
Zuletzt geändert von mark332 am So 10. Nov 2013, 00:38, insgesamt 3-mal geändert.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mse »

mark332 hat geschrieben: Ich brauche nun eine Möglichkeit, der Konsole irgenwie einen Input zu geben (so als würde man das in ihr eingeben und enter drücken)
Nur für den Fall, dass du mal experimentieren möchtest oder nachschauen wie es gemacht werden kann, MSEgui hat für diesen Zweck tterminal (tab 'edit'). Setze es in ein twidgetgrid und du hast einen einfachen Terminal-Emulator. Ohne twidgetgrid funktioniert es nicht! twidgetgrid+tterminal wird beispielsweise in MSEgit als git Konsolenfenster verwendet.

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

Versuchen kann ichs mal,

was ich allerdings glaube, ist, dass der Konsole einfach nur das 'Enter' fehlt (habe da was von LineEnding gelesen?!), nur weiß ich gerade nicht, wie ich der Konsole das drücken der Entertaste signalisiere...
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von Michl »

mark332 hat geschrieben:... Konsole einfach nur das 'Enter' fehlt (habe da was von LineEnding gelesen...
ungetestet: probiere mal an deinen String noch #13#10 anzuhängen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

Jup, werde ich heute Nachmittag mal testen ;)
Zuletzt geändert von mark332 am Fr 8. Nov 2013, 13:11, insgesamt 1-mal geändert.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

Danke dir Michl ;)

Code: Alles auswählen

 
procedure TForm_main.Button_sendCommandClick(Sender: TObject);
begin
  if javaProcessRunning then begin
    if javaProcess.Running then begin
       Edit_command.text:=Edit_command.text;
       javaProcess.Input.Write(Edit_command.text, Length(Edit_command.text));
       javaProcess.input.Write(#13#10, Length(#13#10));
       Edit_command.clear;
    end;
  end;
end; 
 
Gibt zumindest eine Rückmeldung:
"Unknown command." ;)
D.h., dass die Konsole einen Command bekommt, diesen aber nicht kennt...
EDIT:
Wenn ich #13#10 direkt hinter den String hänge, passiert wieder garnichts

MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von Michl »

Gemäß diesem Beispiel steht dort:

Code: Alles auswählen

procedure TMultipleProcessDemoForm.SendInput(Process:TProcess;InputMemo:TMemo);
var
  InputStrings: string;
begin
  if Process.Running then begin
    InputStrings := InputMemo.Lines.Text;
    Process.Input.Write(InputStrings[1], length(InputStrings));
  end;
end;
Ungetestet: Müsstest du deinen Code mal entsprechend anpassen und probieren

Code: Alles auswählen

procedure TForm_main.Button_sendCommandClick(Sender: TObject);
var
  InputStrings: string;
begin
  if javaProcessRunning then begin  //ist das nicht mit der nächsten Zeile doppelt gemoppelt?!
    if javaProcess.Running then begin
//       Edit_command.text:=Edit_command.text;  //Was bezweckst du hier?
       InputStrings := Edit_command.text;
       javaProcess.Input.Write(InputStrings[1], Length(length(InputStrings)));
//       javaProcess.input.Write(#13#10, Length(#13#10));
       Edit_command.clear;
    end;
  end;
end; 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

Michl hat geschrieben:Gemäß diesem Beispiel steht dort:

Code: Alles auswählen

procedure TMultipleProcessDemoForm.SendInput(Process:TProcess;InputMemo:TMemo);
var
  InputStrings: string;
begin
  if Process.Running then begin
    InputStrings := InputMemo.Lines.Text;
    Process.Input.Write(InputStrings[1], length(InputStrings));
  end;
end;
Ungetestet: Müsstest du deinen Code mal entsprechend anpassen und probieren

Code: Alles auswählen

procedure TForm_main.Button_sendCommandClick(Sender: TObject);
var
  InputStrings: string;
begin
  if javaProcessRunning then begin  //ist das nicht mit der nächsten Zeile doppelt gemoppelt?!
    if javaProcess.Running then begin
//       Edit_command.text:=Edit_command.text;  //Was bezweckst du hier?
       InputStrings := Edit_command.text;
       javaProcess.Input.Write(InputStrings[1], Length(length(InputStrings)));
//       javaProcess.input.Write(#13#10, Length(#13#10));
       Edit_command.clear;
    end;
  end;
end; 
die Variable javaProcessRunning nutze ich, um eine exeption unterbinden, die bei javaProcess.Running ausgeworfen wird, sollte diese vor dem Create von javaProgress aufgerufen werden...
Edit_command.text:=Edit_command.text; ist wohl ein vergessenes Überbleibsel eines Versuches :$

Ich werde deinen Vorschlag mal testen :)

MfG
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

okey, folgendes geht.

Code: Alles auswählen

 
procedure TForm_main.Button_sendCommandClick(Sender: TObject);
var
  InputStrings: string;
begin
  if javaProcessRunning then begin
    if javaProcess.Running then begin
       Memo_inputrdr.clear;
       Memo_inputrdr.lines.add(Edit_command);
       InputStrings := Memo_inputrdr.Lines.Text;
       javaProcess.Input.Write(InputStrings[1], length(InputStrings));
    end;
  end;
end;
 
Ich werde, wenn nicht eine bessere Lösung auftaucht, das ganze einfach über ein versteckes Memo umleiten ;)

Danke Michl,

MfG

mark332
Zuletzt geändert von mark332 am So 10. Nov 2013, 00:33, insgesamt 1-mal geändert.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von Michl »

mark332 hat geschrieben:Ich werde, wenn nicht eine bessere Lösung auftaucht, das ganze einfach über ein versteckes Memo umleiten
Der Unterschied dürfte, wie selbst am Anfang festgestellt, am Ende des Strings zu suchen sein:

Code: Alles auswählen

       InputStrings := Edit_command.text+#13+#10;
Könnte dann gehen?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

Michl hat geschrieben:
mark332 hat geschrieben:Ich werde, wenn nicht eine bessere Lösung auftaucht, das ganze einfach über ein versteckes Memo umleiten
Der Unterschied dürfte, wie selbst am Anfang festgestellt, am Ende des Strings zu suchen sein:

Code: Alles auswählen

       InputStrings := Edit_command.text+#13+#10;
Könnte dann gehen?!
mal testen ;)
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: TProcess.Input.Write + KonsolenProgramm

Beitrag von mark332 »

jup geht auch :D

Also hier nochmal ein Danke an dich Michl :mrgreen:

Mfg

mark332
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Antworten