Einzelnen Beitrag anzeigen

Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 

Console input handler

  Alt 12. Feb 2006, 16:39
Hi!

Hab mir gedacht, dass diese Units vielleicht einigen nützlich sein könnten, wenn ihr ein Programm schreiben möchtet, das Shell-ähnliche Funktionalitäten benötigt. Bei diesen Units handelt es sich um eine Sammlung von Objekten, die - sofern man Sie richtig verknüpft - einem eine Menge Arbeit abnehmen können. Hier erstmal der Code der Demo (damit ihr seht, wie wenig man eigentlich schreiben muss, um diese Funktionalität zu haben), die bereits "exit", "echo", "about" und "cd" (im Sinne von irgendwohin wechseln - muss hier kein Verzeichnis sein) unterstützt - den Downlaodlink findet ihr weiter unten.

Delphi-Quellcode:
program console;

{$APPTYPE CONSOLE}

uses
  coninp_h in 'coninp_h.pas',
  coninph2 in 'coninph2.pas',
  coninp_p in 'coninp_p.pas',
  console_h in 'console_h.pas',
  SysUtils;

var
  console_handler: TPrintableConsoleHandler;
  parser: TAdvancedConsoleInputParser;
  input_handler: TConsoleInputHandler;

  input: String;

begin

  WriteLn('Console input handler demo - (c) by Dust Signs Andreas Unterweger 2006');
  WriteLn('======================================================================');
  WriteLn;

  parser := TAdvancedConsoleInputParser.Create;
  input_handler := TConsoleInputHandler.Create;
  console_handler := TPrintableConsoleHandler.Create(parser, input_handler, 'nowhere');

  input_handler.RegisterCommandHandler(EchoCommandHandler); //Register command handlers
  input_handler.RegisterCommandHandler(ExitCommandHandler);
  input_handler.RegisterCommandHandler(AboutCommandHandler);
  input_handler.RegisterCommandHandler(StateCommandHandler);
  input_handler.RegisterCommandHandler(ReverseEchoCommandHandler);

  while true do begin //Endless loop
    ReadLn(input);
    if not console_handler.Execute(input) then
      break; //Break if Execute returns false (HR_REQUIRES_EXIT)
    end;

  FreeAndNil(console_handler);
  FreeAndNil(input_handler);
  FreeAndNil(parser);

end.
Das Prinzip ist eigentlich sehr einfach: der TConsoleInputHandler parst die Eingabe und prüft anhand sogen. CommandHandler (Objekte, die über Überprüfungs- und Ausführfunktionen verfügen (vgl. dazu auch coninph2.pas)), ob er den geparsten Befehl ausführen kann. Kann er das, wird der Befehl ausgeführt und gibt einen Status zurück, der ausgewertet werden kann. Die TConsoleInputHeader-Klasse wie auch der Parser sind an einigen Stellen ableitbar, d.h. in Form von Kindklassen erweiterbar. Weitere Informationen findet ihr in der ausführlichen Dokumentation unten im Download. Ich werde hier nicht alle Units posten - das wäre zu unübersichtlich.

Downloadseite: http://www.users.fh-sbg.ac.at/~aunte...nput%20Handler
Direktdownload: http://www.users.fh-sbg.ac.at/~aunte...rce/ds_cih.zip (Quellcode, Demo und Doku; 51 KB)

Dust Signs

PS. Crossposting DF

//EDIT: Neue Version
//EDIT: Dokumentation fertig => Beschreibung aktualisiert und anstatt den Anhängen Downloadlinks angegeben
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat