Помощь - Поиск - Пользователи - Календарь
Полная версия: Система по продаже билетов.
Форум «Всё о Паскале» > 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(r);
  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.

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

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