Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2001-09

UI-Design for editor on dumb terminal - how?

2 messages · 2 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Michael Vogel

Hi!

I want to write an email-program especially for dumb terminals. That means, that there are no methods for the positioning of the cursor and so on.

The Input can only be done in a line, that means, typing a character and then pressing enter.

I'm now searching for the best method for desiging such an user interface.

This program will be especially written for writing and reading email over packet radio. The delay between input and output over packet radio is between 1 and 10 seconds, thats something I also must consider when designing it.

Is there anything ready in the samples? Does anybody knows a program that I can take to adopt some feature from?

Thanks!

Michael

"42" - Douglas Adams (1952 - 11.05.2001) - http://www.douglasadams.com/
Stefan Becker
to Michael Vogel

Hi,
if you are looking at the linux platform
then oCrt unit is a fare start.

I use it for the window-frames-technics and normal stuff that are handled by the Borlands CRT unit.

I want to write an email-program especially for dumb terminals. That means, that there are no methods for the positioning of the cursor and so on.

Sure there are! The nCrt/oCrt units (again backed by ncurses) will do most anything. Some special keystokes don't work for me on some terminals, but besides that.... it's okay!

Show quoted text 10 lines
The Input can only be done in a line, that means, typing a character and then pressing enter. I'm now searching for the best method for desiging such an user interface. This program will be especially written for writing and reading email over packet radio. The delay between input and output over packet radio is between 1 and 10 seconds, thats something I also must consider when designing it.

Sorry, I don't get what you want to do. If you have Packet-Radio up and running why not simply telnet to your host and use pine for your mail? (I know... life is never that simple :-))

These are part of the routines that I use to get keyboard input from a Terminal. It's written like this because I havn't found another way to correctly read the "pos1" and "Ende" Keys. On the english keybourd they are (Home & End) I think.

IF THERE IS A BETTER WAY... LET ME KNOW!

You see that it is compatable with Borland's CRT unit.

my regards,
Stefan

---------------------------------------------------------------------------
{$IFDEF LINUX}
 uses ocrt;
{$ELSE}
uses crt;
{$ENDIF}
var
inKeyBuff:string[40];
function MyKeyPressed{$IFDEF LINUX}(timeout:word){$ENDIF}:boolean;
 var
 xx:char;
begin
{$IFDEF LINUX}
if oCrt.nKeyPressed(timeout) then
{$ELSE}
if KeyPressed then
{$ENDIF}
begin
 xx:=ReadKey;
 MyKeyPressed:=true;
 insert(xx,InKeyBuff,Length(InKeyBuff)+1);
 if xx=#0 then
 begin
  xx:=ReadKey;
  {$IFDEF LINUX}
  if xx=#27 then xx:=#79; {means the "End-Key"}
  {$ENDIF}
  insert(xx,InKeyBuff,Length(InKeyBuff)+1);
 {$IFDEF LINUX}
 end else {again.. this is a work around to read the}
 begin    {"Pos1" and "Ende" special keys}
  if xx=#27{esc} then
  begin
   if KeyPressed then
   begin
    xx:=ReadKey;
    if xx=#91 {'['} then
    begin {this is a special charater!}
      if KeyPressed then
      begin
      xx:=ReadKey;
       if xx='H' then
       begin {this should be 'Pos1'}
        delete(InKeyBuff,length(InKeyBuff),1);
        insert(#0+#71,InKeyBuff,Length(InKeyBuff)+1);
       end else
       begin
        if xx='F' then
        begin {this should be 'Ende'}
         delete(InKeyBuff,length(InKeyBuff),1);
         insert(#0+#79,InKeyBuff,Length(InKeyBuff)+1);
        end else
        begin
         insert(#27+#91+xx,InKeyBuff,Length(InKeyBuff)+1);
        end;
       end;
     end;
    end else
    begin
     insert(#27+xx,InKeyBuff,Length(InKeyBuff)+1);
    end;
   end;
  end;
 {$ENDIF}
 end;
end;
MyKeyPressed:=(length(InKeyBuff)>0);
end;
function  MyReadKey:char;
begin
 if Length(InKeyBuff)>0 then
 begin
  MyReadKey:=InKeyBuff[1];
  delete(InKeyBuff,1,1);
 end else
 begin
  MyReadKey:=#27;
 end;
end;
const
 SingleWait = 100; {ms - sleep to keep from hogging cpu time}
 ch:char  = ' ';
BEGIN
 repeat
 if MyKeyPressed{$IFDEF LINUX}(SingleWait){$ENDIF} then
 begin
  ch:=MyReadKey;
  case ch of
  #0 : begin
        ch:=MyReadKey;
        WriteLn('Special Key :',ord(ch));
       end;
  #27 : WriteLn('ESC');
   ' ': WriteLn('Space');
  else
   WriteLn('Normal Key :',ch);
  end;
 end;
 until ch=#27;
end.