.
.
.{Arabic and Roman are TEdit components (objects), 
  Arabic.text and Roman.text are the actual text values  } 
const
romans:array[1..7] of char =('I','V','X','L','C','D','M'); {All the characters we'll use}

procedure Tform1.ShowRoman;
{Routine to convert and display a number}
var
s,s2:string;
  i, baseindex:integer;
  n1,n2,n3:char;
begin
s2:='';
{make sure number is OK}
if (length(Arabic.text)=0)
 or (strtoint(Arabic.text)<=0)
or (strtoint(Arabic.text)>3999)
  then begin beep; showmessage('Numbers must be between 1 and 3999'); end
else
begin
s:=Arabic.text;
for i:=1 to length(s) do
begin
{Baseindex picks the right starting spot in the base index array}
{expression was found by trial and error after making a table like this

            Length of #    Position in #      Index value wanted
            ------------  --------------      -----------------
             length(s)          i               BaseIndex
            ------------  ---------------     ------------------
               1                1                   1
               2                2                   1
               2                1                   3
               3                3                   1
               3                2                   3
               3                1                   5
               4                4                   1
               4                3                   3
               4                2                   5
               4                1                   7
               }

Baseindex:=2*(length(s)-i)+1;
{n1, n2, and n3 are the 3 characters we might need}
n1:=romans[baseindex];
      n2:=romans[baseindex+1];
      n3:=romans[baseindex+2];
case s[i] of
'1': s2:=s2+n1;  {I,X,C,M}
'2': s2:=s2+n1+n1; {II,XX,CC,MM}
'3': s2:=s2+n1+n1+n1;  {III,XXX,CCC,MMM}
'4': s2:=s2+n1+n2;     {IV,XL,CD}
'5': s2:=s2+n2;        {V,L,D}
'6': s2:=s2+n2+n1;     {VI,LX,DC}
'7': s2:=s2+n2+n1+n1;  {VII,LXX,DCC}
'8': s2:=s2+n2+n1+n1+n1; {VIII,LXXX,DCCC}
'9': s2:=s2+n1+n3;       {IX,XC,CM}
end; {case}
{Note - no output for 0}
end;
end;
 Roman.text:=s2; {Put the string back into display field}
end;


procedure TForm1.ArabicKeyPress(Sender: TObject; var Key: Char);
{We come here everytime the user presses a character key}
begin  {keep out invalid data}
If not (key in ['0'..'9']) then begin key:=#00; beep; end;
end;

procedure TForm1.ArabicChange(Sender: TObject);
{We come here everytime the Arabic text box changes}
begin
  showroman; {display new roman # for every change}
end;

end.