Автор: biba 20.08.2004 22:03
Есть ведомость ( текстовой файл). Причем все записи не вмещаются на экране. Движение должно быть по стрелкам. Т.е. как я поняла ведомость должна "прокручиваться". Вот как двигаться по стрелкам я не знаю
Я знаю, что должны использоваться какие-то коды клавиш или еще что-то там, но как это в программу втиснуть я даже и представить не могу.
З.Ы. А append может только одну запись добавлять в файл или несколько?
Автор: APAL 21.08.2004 13:37
Коды любых клавиш можешь получить с помощью небольшой проги:
Код
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 21.08.2004 17:37
Немного добавлю...
Код
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 23.08.2004 15:10
Принцип примерно такой:
1). Создаёшь массив, в который построчно записываешь ведомость. Т. е. то, что должно быть в ведомости на 5-ой строке хранится в пятой строке массива.
2). Заводишь переменную типа TopLine.
3). Выводишь 25 или там 50 строк начиная с TopLine'овой.
4). Ждёшь реакции юзьверя. Если это стрелка вверх или вниз, то соответственно уменьшаешь или увеличиваешь значение TopLine.
Вот и всё вроде... Только не забудь проверку вставить, чтобы этот самый TopLine не улетел в минус или в плюс-бесконечность
Автор: biba 24.08.2004 14:01
Я написала прогу, но она не работает Выводит тока первые 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;
Может в программе ошибка, тока где?
Автор: APAL 24.08.2004 14:44
А где массив????
И как это
Код
if ch=#72 then i:=i-1 {вверх};if ch=#80 then i:=i+1; {вниз}
сказывается на отображение информации?
Автор: APAL 24.08.2004 14:53
http://pascal.net.ru/forum/index.php?showtopic=2411 я выкладывал свою програмку. Там в проседуре "F1" используется прокрутка текста в окне (прога как раз и прокручивает данные в окне) - можешь посмотреть для примера.
Скачать можно тут:
http://pascal.net.ru/forum/index.php?act=Attach&type=post&id=20640
Автор: biba 24.08.2004 15:27
Цитата(APAL @ 24.08.04 10:44)
А где массив????
И как это
Код
if ch=#72 then i:=i-1 {вверх};if ch=#80 then i:=i+1; {вниз}
сказывается на отображение информации?
Как это "сказывается на отображение информации" я не знаю. У меня была программа "прокрутки" я половину оттуда переписала, половину из другой программы
APAL из вашей программы я не поняла вообще ничего
А зачем нужен массив??? Ведь первые 20 записей выводятся без массива.
Автор: APAL 24.08.2004 16:13
Ладно оставим мою програмку...
Цитата
А зачем нужен массив??? Ведь первые 20 записей выводятся без массива.
Да, первые записи выводятся.... и последующие можно вывести, но если ты попытаешься прокрутить текст на начало или в конец, то будут существенные тормоза, связанные с постоянным обращением к файлу данных.
Массив нужен в качестве буффера (можно использовать и динамическую память) обмена информацией между файлом и экраном.
Т.е. алгоритм такой:
Имеется буффер, скажем на 300-500 строк.
В начале работы, считываем из файла строки и заполняем буффер. Во время прокрутки текста обращаемся за данными к буфферу (обращение к памяти намного быстрее чем к файлу).
В случае, когда данные выходят за пределы буффера - производим его перезаполнение. (Можно в качестве начальной точки заполнения использовать "ТЕКУЩИЙ УКАЗАТЕЛЬ СТРОКИ В ФАЙЛЕ" - ("ОБЪЕМ БУФФЕРА"/2). Тогда у нас в буффере будет запас на просмотр и "вниз" и "вверх")
Главное в этом механизме не запутаться с текущмим указателями: в файле, в буффере, на экране.
Эскизы прикрепленных изображений