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.