Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ События в pascal

Автор: STAN 1.12.2007 19:11

Здравствуйте!
Не подскажете как решить такую проблему:
Необходимо вывести на экран 2 массива строк
и при выделении одной строки в первом массиве и другой во втором поменять их местами.
Например сделать как бы 2 менюшки и выделять строки ENTERом.

Нужно сделать это собятиями.
Смотрел Turbovision, но там похожих окон не нашел.
Главное как выбирать их и выделять чтобы это было событием.

Наверное выделяешь какой-нибудь клавишой=> помечаем
вторую выбираешь=> помечаем и 2 помеченные меняем.

Автор: Гость 1.12.2007 22:01

Может как-нибудь по-другому сделать...?
Может кто делал или в Internete видел что-то похожее, киньте ссылочку

Автор: STAN 1.12.2007 23:39

Посмотрел ещё об TURBO Vision, но нашел только описания.
Например TListBox для вывода списка
А реализации что-то нигде...
Помогите пожалуйста.

Автор: STAN 2.12.2007 1:10

Вот накидал быстренько меню, правда идея не моя..
Куда добавить обработчик события и что в нём писать?
Где писать with event(...) do ?
И нужно второй массив добавить.

uses graph,crt,drivers;
type Ta=array[1..10] of string;

Event=record
what:word;
case word of
evNothing:();
evKeyDown: (
case integer of
0: (keycode:word);
1: (charCode:char; ScanCode:byte));
end;

var
key:char;
g:string;
x,y,selected,row: integer;
A,mt,st:Ta;
pos1,pos2,pos3:byte;
u1,u:boolean;
S:string;
gm,gd:integer;

i,players: integer;label 11;

Procedure Menu(x1,y1:Word;n:byte;A:Ta;u,u1:boolean;S:string;Var pos1:byte);
Var i:byte;
x,y:Word;
Key:char;
Begin
if u=true then begin
ClearDevice;
end;
setfillstyle(1,0);

settextstyle(0,0,0);
if u1=true then begin
Outtextxy(x1,y1+3,S);
Rectangle(x1-1,y1-1,x1+121,y1+11*(n+1));
y1:=y1+11;
end;
Setbkcolor(0);
Setcolor(15);
if u1=false then begin
Rectangle(x1-1,y1-1,x1+121,y1+11*n);
end;
x:=x1;
y:=y1;
SetFillStyle(1,0);
Bar(x,y,x+120,y+10);
SetFillStyle(1,0);
y:=y+11;
for i:=2 to n do begin
Bar(x,y,x+120,y+10);
y:=y+11;
end;
x:=x1;
y:=y1;
Outtextxy(x,y+3,A[1]);
y:=y+11;
Setcolor(15);
for i:=2 to n do begin
Outtextxy(x,y+3,A[i]);
y:=y+11;
end;
pos1:=1;
x:=x1;
y:=y1;
Repeat
key:=readkey;
if Ord(key)=0 then begin
SetFillStyle(1,0);
Bar(x,y,x+120,y+10);
SetFillStyle(1,8);
Setcolor(15);
Outtextxy(x,y+3,A[pos1]);
key:=readkey;
if Ord(Key)=72 then begin
if pos1=1 then begin
pos1:=n;
y:=y+11*(n-1);
Bar(x,y,x+120,y+10);
Setcolor(14);
Outtextxy(x,y+3,A[pos1]);
end
else begin
pos1:=pos1-1;
y:=y-11;
Bar(x,y,x+120,y+10);
Setcolor(14);
Outtextxy(x,y+3,A[pos1]);
end;
end;
if Ord(Key)=80 then begin
if pos1=n then begin
pos1:=1;
y:=y-11*(n-1);
Bar(x,y,x+120,y+10);
Setcolor(14);
Outtextxy(x,y+3,A[pos1]);
end
else begin
pos1:=pos1+1;
y:=y+11;
Bar(x,y,x+120,y+10);
Setcolor(14);
Outtextxy(x,y+3,A[pos1]);
end;
end;
end;

Until Ord(Key)=13;
if u=true then begin
ClearDevice;
end;
end;
Begin
gd:=Detect;
gm:=IBM8514Lo;
Initgraph(gd,gm,'D:\bgi');
pos1:=0;

Repeat
st[1]:=' 1';
st[2]:=' 2';
st[3]:=' 3 ';
st[4]:=' 4';
st[5]:=' 5';
st[6]:=' exit ';
u:=true;
u1:=false;
S:=' ';
menu(250,150,6,st,u,u1,s,pos2);
case pos2 of
1:;
2:;
3:;
4:;
5:;
6: exit;
end;
Until ord(key)=27;
end.
Например, нажимаем 'с' на элементе, появляется второй массив, нажимаем 'c' там и они
меняются.
Или хотя бы просто пермещение из 1 во 2ой....
И ещё, дайте пожалуйста коды все клавиш.

Автор: Гость 2.12.2007 2:05

Ну хотя бы появляется массив в меню , нажимаем клавишу и этот элемент перемещается в исходный массив.