TProcess: Nur "sichtbaren" output ausgeben

Antworten
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

TProcess: Nur "sichtbaren" output ausgeben

Beitrag von Targion »

Hallo!
Einige Terminal-Anwendungen geben ja z.B. den aktuellen Status eines Vorgangs auf der Konsole aus, löschen diesen dann wieder und ersetzen ihn durch neues. (Beispiel: "gdebi") Wenn ich einen dieser Befehle ausführe habe ich dann am Ende eine einzige Ausgabezeile, der vorherige Inhalt ist ja gelöscht. Wenn ich eine entsprechende Anwendung mit TProcess ausführe und das Ergebnis abfange, bekomme ich jedoch für jeden Zwischenschritt eine Extra-Zeile.
Wie kann ich TProcess anweisen, nur das auszugeben, was ich nach Ausführung des Befehls auch tatsächlich auf der Konsole sehe?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TProcess: Nur "sichtbaren" output ausgeben

Beitrag von Christian »

Gar nicht, du musst schon selbst schaun was für Steuerzeichen darin vorkommen und ggf die vorherige zeile wieder löschen ö.ä.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: TProcess: Nur "sichtbaren" output ausgeben

Beitrag von Targion »

Schade. Ich dachte, es würde einfacher und vorgefertigt gehen. So muss ich für jedes Script eine eigene Funktion schreiben. Danke für die Info.
Zuletzt geändert von Targion am Mo 13. Okt 2008, 20:16, insgesamt 1-mal geändert.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TProcess: Nur "sichtbaren" output ausgeben

Beitrag von Christian »

Daran ist nichts schwieriges, das sind nur n paar zeilen Code mehr schätzungsweise so ... 5 ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TProcess: Nur "sichtbaren" output ausgeben

Beitrag von af0815 »

Christian hat geschrieben:Gar nicht, du musst schon selbst schaun was für Steuerzeichen darin vorkommen und ggf die vorherige zeile wieder löschen ö.ä.

Als Ansatz, mal den Output speichern und mit einem Hexeditor ansehen. Ist es nur ein CR ohne LF, so kann man ganz einfach den (eigenen) Buffer löschen wenn man das CR empfangen hat. Somit hat man nur die letzte Zeile. Ich nehme an, das ist auch von Christian mit den 'so 5 Zeilen' gemeint :-)

Falls es komplexer ist, so kann man das auch im Hexeditor sehen, mit welchen Steuerzeichen gearbeitet wird. Ein kurzer Blick lohnt sich oft, da es manchmal einfacher ist, als es aussieht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TProcess: Nur "sichtbaren" output ausgeben

Beitrag von Christian »

So miente ich es.
http://de.wikipedia.org/wiki/Steuerzeichen

Scheint wirklich nur CR zu sein eventuell noch Substitute.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: TProcess: Nur "sichtbaren" output ausgeben

Beitrag von Targion »

Vielen Dank für die Hilfe! Ich habe das jetzt so gemacht:

Code: Alles auswählen

function CmdFinResult(cmd:String):String;
var t:TProcess;
Buffer: string;
BytesAvailable: DWord;
BytesRead:LongInt;
begin
 Result:='';
 buffer:='';
 t:=tprocess.create(nil);
 t.Options:=[poUsePipes];
 t.CommandLine:=cmd;
 try
  t.Execute;
  while t.Running do begin
      BytesAvailable := t.Output.NumBytesAvailable;
      BytesRead := 0;
      while BytesAvailable>0 do
       begin
        SetLength(Buffer, BytesAvailable);
        BytesRead := t.OutPut.Read(Buffer[1], BytesAvailable);
        if (pos(#13,Buffer)>0)or(pos(#26,Buffer)>0)or(Pos(#10,Buffer)>0)then Result:='';
        Result := Result + copy(Buffer,1, BytesRead);
        BytesAvailable := t.OutPut.NumBytesAvailable;
      end;
  end;
 finally
 t.Free;
 end;
end;

Benutzt jemand von euch schon PackageKit? Wenn man das Programm "pkcon" (benutze ich, weil die DBus-Schnittstelle noch nicht alle nötigen Funktionen bereithält) so aufruft:

Code: Alles auswählen

pkcon search file /usr/share/applications/vlc.desktop
wird zuerst der Status des Paketes gezeigt, dann der Paketname und dann die Paketbeschreibung. Wenn ich den Befehl nun mit TProcess ausführe, fehlt die Beschreibung. Woran kann das liegen? Die Beschreibung landet nicht im Buffer. Kann ein fremdes Programm nachträglich über die Konsole zeichnen?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TProcess: Nur "sichtbaren" output ausgeben

Beitrag von af0815 »

Targion hat geschrieben:... Die Beschreibung landet nicht im Buffer. Kann ein fremdes Programm nachträglich über die Konsole zeichnen?

Die Frage ist nur, ob das pkcon unter der Umgebung wo es in TProsess läuft überhaupt die Beschreibung ausgibt. Stichwort: aktuelle Shellvariablen des Programmes unter TProzess. Ev. kann man die erweiteret Ausgabe mittels eines Kommandozeilenschalter erzwingen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten