Announcement

Collapse
No announcement yet.

console read ohne Enter

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • console read ohne Enter

    Hallo,
    Ich bin nun schon fast 2 Wochen am suchen und testen. Ich hoffe mir kann jemand hier helfen.

    Problem:
    Ich starte ein DOS-programm. Dieses Dos-programm unterstützt scriptsprachen wie c-shell, perl, java. Das heißt das Programm generiert Ausgaben auf die stdout. die von den scripts gelesen werden können.
    Nun möchte ich aus diesem Programm ein eigenes consolenprogramm starten
    Befehle and das DosProg schicken und die Antworten verarbeiten.

    Wenn ich mit Delphi read(StrVar) diese Ausgabe lesen will wird immer auf ein "Enter" gewartet.

    Gibt es eine Möglichkeit ( so wie im alten pascal) diese Ausgabe ohne ein CR abzufragen.

    Code:
     while not eof do
       begin
        Read(c);
       end;
    Befehle an die dos-application kann man einfach mit
    writeln(@%#%@PAUSE Hello World);
    senden.

    Dieser Befehl erzeugt z.b. 3 Ausgaben
    Status=0
    READANS='OK'
    PAUSANS=''

    Also eine Zahl und zwei Strings welche ich weiter verarbeiten möchte.

    Ich hoffe es ist einigermaßen verständlich
    MfG

  • #2
    Hallo,
    Habs mittlerweile selber hinbekommen.

    Wenn es interessiert hier die Lösung:

    Erst mal die Handles für die Stdin und Stdout holen
    var
    FHin,
    FHout : THandleStream;

    FHin := THandleStream.create(GetStdHandle(STD_INPUT_HANDLE ));
    FHout:= THandleStream.create(GetStdHandle(STD_OUTPUT_HANDL E));


    dann den Conolenmodus so ändern das nicht mehr auf ein Zeilenende gewartet wird,

    SetConsoleMode(GetStdhandl(STD_INPUT_HANDLE),ENABL E_WINDOW_INPUT and (not ENABLE_LINE_INPUT ));

    Daten in die Console schreiben mit

    var lmc : String;

    Lmc:= 'TestString'+#10
    FHout.Write(pointer(lmc)^,length(lmc));

    Daten von der Console lesen:

    Code:
    function TTrilogy.StdInReadln: String;
      var s  : String;
          ch : Char;
    begin
        s:='';
        ch:='#';
          while (ch <> #10)  do
          begin
            FHin.Read(ch,1);
           // Application.ProcessMessages;
            if ch <> #10 then 
              s:=s+ch;
          end;
        result:= s;
      end;
    Im Moment scheint das zu funktionieren.

    Noch zum Hintgergrund:

    Meine Consolenanwendung wird von dem Externen (dos)-Programm über einen Hotkey aufgerufen.
    MfG
    Zuletzt editiert von DerDelphianer; 02.04.2007, 19:44.

    Comment

    Working...
    X