unit MainReader;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TfMain = class(TForm)
    gb: TGroupBox;
    eName: TLabeledEdit;
    dtBirthday: TDateTimePicker;
    lBirthday: TLabel;
    ePhone: TLabeledEdit;
    eAddress: TLabeledEdit;
    eWeight: TLabeledEdit;
    eHeight: TLabeledEdit;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  PPeopleInfo = ^TPeopleInfo;
  TPeopleInfo = record
    Name : string[100];
    Weight : real;
    Height : real;
    Birthday : TDate;
    Phone : string[50];
    Address : string[200];
  end;

var
  fMain: TfMain;
  PF : file of TPeopleInfo;
  MainDir : string;
  PIPtr : PPeopleInfo;
  PI : TPeopleInfo;

  FFileHandle : THandle;       // ідентифікатор відкритого файлу
  FMapHandle  : THandle;       // ідентифікатор об'єкта відображення файлу
  FFileSize   : Integer;       // Розмір файлу
  FData       : PByte;         // Вказівник на дані файла при відображенні

const PFName = 'PeopleData.pdata';

implementation

{$R *.dfm}

procedure TfMain.FormCreate(Sender: TObject);
begin
  MainDir := ExtractFilePath(Application.ExeName);
  if not FileExists(MainDir + PFName) then begin
    MessageDlg('Файл ' + MainDir + PFName + ' не знайдено!', mtWarning, [mbCancel], 0);
    eName.Enabled := false;
    lBirthday.Enabled := false;
    ePhone.Enabled := false;
    eAddress.Enabled := false;
    eWeight.Enabled := false;
    eHeight.Enabled := false;
    Exit;
  end;
  Timer.Enabled := true;

  FFileHandle := CreateFile(PChar(MainDir + PFName), GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if FFileHandle = INVALID_HANDLE_VALUE then raise Exception.Create('Файл не відкрито');

  try
    FFileSize := GetFileSize(FFileHandle, nil);
    // Отримуємо ідентифікатор об'єкта відображення файлу
    FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, FFileSize, nil);
    if FMapHandle = 0 then raise Exception.Create('Не вдалось створити відображення файлу');
  finally
    // Вивільняємо ідентифікатор файла
    CloseHandle(FFileHandle);
  end;

  try
    // Подаємо об'єкт відображення у вікні перегляду.
    // Ця функція поверне вказівник на дані файлу
    FData := MapViewOfFile(FMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, FFileSize);
    if FData = nil then raise Exception.Create('Не вдалось відобразити вікно перегляду файла');
  finally
    // Вивільняємо ідентифікатор об'єкта відображення файлу
    CloseHandle(FMapHandle);
  end;
end;

procedure TfMain.FormDestroy(Sender: TObject);
begin
  // Вивільняємо відображення файлу
  UnMapViewOfFile(FData);
end;

procedure TfMain.TimerTimer(Sender: TObject);
begin
  // Тут слід помістити код для роботи із даними файлу, відображеного у пам'ять
  PIPtr := PPeopleInfo(FData);
  eName.Text := PIPtr^.Name;
  dtBirthday.Date := PIPtr^.Birthday;
  ePhone.Text := PIPtr^.Phone;
  eAddress.Text := PIPtr^.Address;
  eWeight.Text := FormatFloat('0.0', PIPtr^.Weight);
  eHeight.Text := FormatFloat('0.0', PIPtr^.Height);
end;

end.
