Пробуем
var
vvod_pause: integer; { задержка до долгого нажатия } procedure soob(t: string);{ вывод сообщения }
var n,m,r,n1: integer;
begin
n:= getStringWidth(t);m:= getStringHeight(t);{ n - ширина m - высота строки текста }
setColor(145,135,255);fillrect((getWidth - n) / 2-5,(getHeight - m) / 2-5,n+10,m+10);{ очищаем прямоугольник под текст }
setColor(140,10,35); if n<=getWidth then drawText(t, (getWidth - n) / 2,(getHeight - m) / 2); { центруем и печатаем если целиком помещается на экране }
else begin r:=n-getWidth; for n1:=0 to r do begin { вычисляем сколько пикселей не влезло }
setColor(145,135,255);fillrect((getWidth - n) / 2-3,(getHeight - m) / 2-3,n+6,m+6); { если не очистить просто смажется }
setColor(140,10,35);drawText(t,0-n1,(getHeight - m) / 2);repaint; delay(10);{ центруем и печатаем }
if n1=0 then delay(2000);end;end; { задержка что б прочесть начало строки }
repaint;delay(1000);setColor(145,135,255);fillrect((getWidth - n) / 2-5,(getHeight - m) / 2-5,n+10,m+10);
end;
procedure vvod1(key:integer);
begin
if key=KE_KEY0 then soob(' 0 долгое нажатие ');
end;
procedure vvod;
var
{com:command;} { если будут проверятся и команды меню }
pause,key:integer;
fv:boolean; { флаг нажатия }
begin
{com:= getClickedCommand;
if com = ok then ...} { обработка команд меню }
key:=getKeyClicked;
if getKeyPressed<>KE_NONE then fv:=true;
while fv do begin
pause:=pause+1; delay(100);
if getKeyPressed=KE_NONE then fv:=false;
if pause>=vvod_pause then begin vvod1(key); key:=0; fv:=false; end; {key:=0 - иначе и короткое и длинное сразу }
end;
if key=KE_KEY0 then soob('0 короткое нажатие ');
end;
begin
vvod_pause:=5;
soob('жми 0 для проверки ');delay(1000);
while true do begin
soob(' ничего не нажато ');
vvod;
end; end.