Помощь - Поиск - Пользователи - Календарь
Полная версия: Система по продаже билетов.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
dmx
Привет всем! Помогите пожалуйста сделать так, что бы при выборе пункта "ENTER INFO TO DB" (см. прикрепленный файл) можно было вводить информацию о рейсах в базу данных. В прикрепленном файле меню создавалось при помощи Turbo Professional. Назначение программы - продажа билетов на самолеты.

Заранее благодарен.

Вот, что у меня имеется:

type
TReys = record
NR:integer;
PO,PP:string[30];
DateO,DateP:string[10];
TimeO,TimeP:string[5];
KolM:byte;
CenaB:string[7];
end;

TFReys = file of TReys;


procedure VvodR (var R:TReys);
begin
write('Nomer reysa: '); readln(R.NR);
write('Punkt otpravlenija: '); readln(R.PO);
write('Date otpravlenija: '); readln(R.DateO);
write('Vremja otpravlenija: '); readln(R.TimeO);
write('Punkt pribitija: '); readln(R.PP);
write('Date pribitija: '); readln(R.DateP);
write('Vremja pribitija: '); readln(R.TimeP);
write('Kolichestvo mest (biletov): '); readln(R.KolM);
write('Cena bileta: '); readln(R.CenaB);
end;

procedure RReys;
var F:TFReys;
R:TReys;

begin
assign(F,'Reys.dat');
{$I-}
Reset(F);
if IOResult<>0 then
Rewrite(F);
{$I+}
VvodR®;
Seek(F,FileSize(F));
write(F,R);
Close(F);
end;
volvo
Что именно не получается? Подключить приведенный выше код с помощью
{$I имя файла}
к programma.pas, и изменить процедуру P1 вот так:
Procedure P1;
begin
RReys;
end;

?
dmx
Пасиб большое! Все работает!
dmx
Вот продолжаю модернизировать свою программку... В общем теперь при выборе пункта меню 3, а именно "BUY A TICKET" программа выдает из базы данных № рейса и конечный пункт. Так вот вывести на экран всю информацию, которую содержит запись в одну строчку врядли получится. Как можно сделать так, чтобы эти записи можно было пролистывать стрелочками "вверх"/"вниз"? Соответственно по нажатию "ENTER" на выбранной записи программа отображала бы полную информацию о данной записи. Просто нужно как-то это оформить в виде таблицы. Заранее благодарен. (текст программы в прикрепленном файле)
volvo
Я бы делал что-то типа меню. То есть описывал бы вот такую структуру:
Type
menuRec = record
s: string;
offset: longint;
end;

создал бы массив (или список, как тебе удобнее, для неизвестного количества элементов - лучше, конечно, список) элементов этого типа, и при чтении из файла добавлял бы в S ту минимальную информацию, что ты выводишь на экран сейчас, а в поле offset - смещение от начала файла записи, содержащей ПОЛНУЮ информацию.

Тогда можно выводить краткое описание, по нажатию ArrowUp/ArrowDown перемещаться по элементам (реализации меню уже выкладывались на форуме), а при нажатии Enter - считать из файла полную информацию (offset же есть), и отображать ее на экране...
alpha
Цитата
реализации меню уже выкладывались на форуме

не нашел я их.
просто не понятно как в моем случае организовать твою идею с меню...


Цитата
ту минимальную информацию, что ты выводишь на экран сейчас

а что значит "сейчас"?

P. S. Сорри, под другим ником зашел - от старого пароль забыл!
volvo
Цитата(alpha @ 1.05.2006 16:00)
а что значит "сейчас"?
А то, что у тебя делается здесь:
  while not Eof(F) do
begin
read(F, R);
Writeln(R.NR: 10, R.PP: 20); { <--- Вот это - краткая информация, так? }
end;


Вот тебе работающий набросок меню:
uses crt;

type
TStr = string[30];
PStrArray = ^TStrArray;
TStrArray = array[0 .. pred(maxint div sizeof(TStr))] of TStr;

var
menuArr: PStrArray;

const
{ здесь используй переменную, хранящую количество записей в файле }
SizeOfFile = 50;

{ Меню будет отображаться между 5-ой и 20-ой строками экрана }
WinStartY = 5;
WinFinishY = 20;

function IntToStr(n: integer): string;
var
S: string[11];
begin
Str(n, S);
IntToStr := S;
end;

function min(A, B: integer): integer;
begin
min := A;
if B < a then min := B;
end;

function menu(arr: PStrArray): integer;
var
scrolled, currMenu: integer;
ch: char;

selection: boolean;

procedure Refresh;
var i: integer;
begin
for i := 1 to min(WinFinishY - WinStartY, SizeOfFile) do begin
if selection then
if i = currmenu then textbackground(red) else textbackground(black)
else textbackground(black);

gotoxy(10, winstartY + i);
write('':2, arr^[Pred(scrolled + i)]:30, '':2);
end;
end;
procedure Show;
begin
selection := true;
refresh;
end;
procedure Hide;
begin
selection := false;
refresh;
end;


begin
scrolled := 0; currMenu := 1;
show;

repeat
ch := readkey;
case ch of
#0:
case readkey of
#72: { up }
begin
Hide;
if currMenu > 1 then dec(currMenu)
else if scrolled > 0 then dec(scrolled);
Show;
end;
#80: { dn }
begin
Hide;
if currmenu < WinFinishY - WinStartY then inc(currMenu)
else if currmenu + scrolled < sizeoffile then inc(scrolled);
Show;
end;
end;
#13: ;
end;
until ch = #13;
menu := pred(currMenu + scrolled);
end;

var
i, m: integer;

begin
GetMem(menuArr, sizeoffile * sizeof(tstr));

{
Вместо след. цикла можешь проходить по файлу,
читать данные и формировать из них
краткое описание (до 30 символов длиной)
}
for i := 0 to pred(sizeoffile) do begin
menuArr^[i] := 'string #' + inttostr(i + 1);
end;

m := menu(menuArr);
gotoxy(1, 23);

{
Ну, а здесь - соответсвенно "лезешь" в файл данных через Seek(f, m),
читаешь полную информацию и отображаешь там, где тебе удобно
}
writeln('show the record #', m:2, ' data');

FreeMem(menuArr, sizeoffile * sizeof(tstr));
end.

Это - только набросок, его можно еще улучшать и улучшать. Приведен только для примера...

Но сначала я бы рекомендовал тебе ничего не изменяя прогнать именно эту программку...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.