Помощь - Поиск - Пользователи - Календарь
Полная версия: движение по стрелкам
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
biba
Есть ведомость ( текстовой файл). Причем все записи не вмещаются на экране. Движение должно быть по стрелкам. Т.е. как я поняла ведомость должна "прокручиваться". Вот как двигаться по стрелкам я не знаю blink.gif
Я знаю, что должны использоваться какие-то коды клавиш или еще что-то там, но как это в программу втиснуть я даже и представить не могу. sad.gif

З.Ы. А append может только одну запись добавлять в файл или несколько?
APAL
Коды любых клавиш можешь получить с помощью небольшой проги:

Код
Uses Crt;
var ch : Char;
Begin
 Repeat
   Ch:=ReadKey;
   If Ch=#0 then {двух-байтный код?}
   Begin
     Write('*');
     Ch:=ReadKey;
   End;
   Writeln(Ch,Ord(Ch));
 Until Ch=#27; {выход по ESC}
End.


Append - только открывает файл на запись, перемещая указатель записи в конец файла.
Romtek
Немного добавлю...
Код
Uses Crt;
const
     Enter = #13; Tab = #9; BS = #8;
     Esc   = #27; Space = #32; SH_Tab = #15;
     Rt = #77; Lf = #75;
     Up = #72; Dn = #80;
     PgUp = #73; PgDn = #81;
     Ins = #82; Del = #83; Home = #71; EndK = #79;
     F1 = #59; F2 = #60; F3 = #61; F4 = #62; F5 = #63;
     F6 = #64; F7 = #65; F8 = #66; F9 = #67; F10 = #68;
     F11 = #133; F12= #134;
     ALT_Q = #16; ALT_W = #17; ALT_E = #18; ALT_R = #19;
     ALT_T = #20; ALT_Y = #21; ALT_U = #22; ALT_I = #23;
     ALT_O = #24; ALT_P = #25; ALT_A = #30; ALT_S = #31;
     ALT_D = #32; ALT_F = #33; ALT_G = #34; ALT_H = #35;
     ALT_J = #36; ALT_K = #37; ALT_L = #38; ALT_Z = #44;
     ALT_X = #45; ALT_C = #46; ALT_V = #47; ALT_B = #48;
     ALT_N = #49; ALT_M = #50; ALT_SP = #2;
var ch : Char;
Begin
Repeat
  Ch:=ReadKey;
  If Ch=#0 then {двух-байтный код? Нужно считать ещё раз}
     Ch:=ReadKey;    
  Case Ch of
      Up {верх} :  inc (line);
      Dn {вниз} :  dec (line);
  End;
Until Ch=Esc; {выход по Esc}
End.
BlackShadow
Принцип примерно такой:
1). Создаёшь массив, в который построчно записываешь ведомость. Т. е. то, что должно быть в ведомости на 5-ой строке хранится в пятой строке массива.
2). Заводишь переменную типа TopLine.
3). Выводишь 25 или там 50 строк начиная с TopLine'овой.
4). Ждёшь реакции юзьверя. Если это стрелка вверх или вниз, то соответственно уменьшаешь или увеличиваешь значение TopLine.

Вот и всё вроде... Только не забудь проверку вставить, чтобы этот самый TopLine не улетел в минус или в плюс-бесконечность smile.gif
biba
Я написала прогу, но она не работает sad.gif Выводит тока первые 20 записей и работает тока на Esc, а стрелки нет
Код

  procedure SCREENVED1 (var VED1:text);
  var I:integer; stroka:string; ch:char;
  begin
  clrscr;
  assign (VED1,'vedomost'); reset (VED1); for I:=1 to 20 do begin gotoxy(1,3+i);
  readln (VED1,stroka); write (stroka:45); writeln; end;
  repeat ch:=readkey; if ch=#0 then ch:=readkey;
  if ch=#72 then i:=i-1 {вверх};if ch=#80 then i:=i+1; {вниз}
  until ch=#27; end;

Может в программе ошибка, тока где? blink.gif
APAL
А где массив????
И как это
Код
if ch=#72 then i:=i-1 {вверх};if ch=#80 then i:=i+1; {вниз}
сказывается на отображение информации?
APAL
Здесь я выкладывал свою програмку. Там в проседуре "F1" используется прокрутка текста в окне (прога как раз и прокручивает данные в окне) - можешь посмотреть для примера.
Скачать можно тут:
http://pascal.net.ru/forum/index.php?act=A...e=post&id=20640
biba
Цитата(APAL @ 24.08.04 10:44)
А где массив????
И как это
Код
if ch=#72 then i:=i-1 {вверх};if ch=#80 then i:=i+1; {вниз}
сказывается на отображение информации?

Как это "сказывается на отображение информации" я не знаю. У меня была программа "прокрутки" я половину оттуда переписала, половину из другой программы unsure.gif
APAL из вашей программы я не поняла вообще ничего huh.gif sad.gif
А зачем нужен массив??? Ведь первые 20 записей выводятся без массива.
APAL
Ладно оставим мою програмку...
Цитата
А зачем нужен массив??? Ведь первые 20 записей выводятся без массива.

Да, первые записи выводятся.... и последующие можно вывести, но если ты попытаешься прокрутить текст на начало или в конец, то будут существенные тормоза, связанные с постоянным обращением к файлу данных.
Массив нужен в качестве буффера (можно использовать и динамическую память) обмена информацией между файлом и экраном.

Т.е. алгоритм такой:
Имеется буффер, скажем на 300-500 строк.
В начале работы, считываем из файла строки и заполняем буффер. Во время прокрутки текста обращаемся за данными к буфферу (обращение к памяти намного быстрее чем к файлу).
В случае, когда данные выходят за пределы буффера - производим его перезаполнение. (Можно в качестве начальной точки заполнения использовать "ТЕКУЩИЙ УКАЗАТЕЛЬ СТРОКИ В ФАЙЛЕ" - ("ОБЪЕМ БУФФЕРА"/2). Тогда у нас в буффере будет запас на просмотр и "вниз" и "вверх")

Главное в этом механизме не запутаться с текущмим указателями: в файле, в буффере, на экране.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.