Untitled

 avatar
unknown
plain_text
a month ago
7.2 kB
2
Indexable
unit MainForm;

interface

uses
  System.SysUtils, System.Classes, Vcl.Forms, Vcl.Controls, Vcl.StdCtrls,
  Vcl.Dialogs, Data.DB, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.SQLite,
  FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, FireDAC.VCLUI.Wait,
  FireDAC.Comp.Client, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
  FireDAC.DApt, FireDAC.Comp.DataSet, Vcl.Grids, Vcl.DBGrids, Vcl.Menus,
  Vcl.ExtCtrls, VclTee.TeeGDIPlus, VCLTee.TeEngine, VCLTee.Series,
  VCLTee.TeeProcs, VCLTee.Chart, Vcl.ComCtrls;

type
  TMainFrm = class(TForm)
    FDConnection1: TFDConnection;
    // Таблицы базы данных
    tblFlights: TFDTable;
    tblAircraft: TFDTable;
    tblPassengers: TFDTable;
    
    // Источники данных
    dsFlights: TDataSource;
    dsAircraft: TDataSource;
    dsPassengers: TDataSource;
    
    // Компоненты интерфейса
    MainMenu1: TMainMenu;
    FileMenu: TMenuItem;
    EditMenu: TMenuItem;
    ViewMenu: TMenuItem;
    ExitItem: TMenuItem;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    DBGrid3: TDBGrid;
    Chart1: TChart;
    BubbleSeries1: TBubbleSeries;
    Panel1: TPanel;
    FilterEdit: TEdit;
    FilterBtn: TButton;
    ClearFilterBtn: TButton;
    RefreshBtn: TButton;
    
    procedure FormCreate(Sender: TObject);
    procedure FilterBtnClick(Sender: TObject);
    procedure ClearFilterBtnClick(Sender: TObject);
    procedure RefreshBtnClick(Sender: TObject);
    procedure ExitItemClick(Sender: TObject);
    
  private
    procedure CreateDatabase;
    procedure CreateTables;
    procedure ConfigureComponents;
    procedure UpdateChart;
  public
    { Public declarations }
  end;

var
  MainFrm: TMainFrm;

implementation

{$R *.dfm}

procedure TMainFrm.FormCreate(Sender: TObject);
begin
  CreateDatabase;
  CreateTables;
  ConfigureComponents;
  UpdateChart;
end;

procedure TMainFrm.CreateDatabase;
begin
  FDConnection1.Params.Clear;
  FDConnection1.Params.Add('Database=sheremetyevo.db');
  FDConnection1.Params.Add('DriverID=SQLite');
  
  if not FileExists('sheremetyevo.db') then
  begin
    FDConnection1.ExecSQL(
      'CREATE TABLE Aircraft (' +
      'AircraftID INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'Model VARCHAR(50),' +
      'Capacity INTEGER,' +
      'ManufactureYear INTEGER)');
      
    FDConnection1.ExecSQL(
      'CREATE TABLE Flights (' +
      'FlightID INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'FlightNumber VARCHAR(20),' +
      'AircraftID INTEGER,' +
      'DepartureTime DATETIME,' +
      'ArrivalTime DATETIME,' +
      'Destination VARCHAR(50),' +
      'FOREIGN KEY (AircraftID) REFERENCES Aircraft(AircraftID))');
      
    FDConnection1.ExecSQL(
      'CREATE TABLE Passengers (' +
      'PassengerID INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'FlightID INTEGER,' +
      'FirstName VARCHAR(50),' +
      'LastName VARCHAR(50),' +
      'PassportNumber VARCHAR(20),' +
      'SeatNumber VARCHAR(10),' +
      'FOREIGN KEY (FlightID) REFERENCES Flights(FlightID))');
      
    // Добавление тестовых данных
    FDConnection1.ExecSQL(
      'INSERT INTO Aircraft (Model, Capacity, ManufactureYear) VALUES ' +
      '("Boeing 737", 180, 2015),' +
      '("Airbus A320", 150, 2018),' +
      '("Boeing 777", 350, 2016)');
      
    FDConnection1.ExecSQL(
      'INSERT INTO Flights (FlightNumber, AircraftID, DepartureTime, ArrivalTime, Destination) VALUES ' +
      '("SU1845", 1, "2025-01-16 10:00", "2025-01-16 12:00", "Paris"),' +
      '("SU2311", 2, "2025-01-16 11:30", "2025-01-16 14:30", "Berlin"),' +
      '("SU1532", 3, "2025-01-16 13:00", "2025-01-16 19:00", "New York")');
  end;
end;

procedure TMainFrm.CreateTables;
begin
  tblAircraft.TableName := 'Aircraft';
  tblAircraft.Active := True;
  
  tblFlights.TableName := 'Flights';
  tblFlights.Active := True;
  
  tblPassengers.TableName := 'Passengers';
  tblPassengers.Active := True;
end;

procedure TMainFrm.ConfigureComponents;
begin
  // Настройка источников данных
  dsAircraft.DataSet := tblAircraft;
  dsFlights.DataSet := tblFlights;
  dsPassengers.DataSet := tblPassengers;
  
  // Настройка DBGrid
  DBGrid1.DataSource := dsFlights;
  DBGrid2.DataSource := dsAircraft;
  DBGrid3.DataSource := dsPassengers;
  
  // Настройка вкладок
  TabSheet1.Caption := 'Рейсы';
  TabSheet2.Caption := 'Воздушные суда';
  TabSheet3.Caption := 'Пассажиры';
  
  // Настройка меню
  FileMenu.Caption := 'Файл';
  EditMenu.Caption := 'Правка';
  ViewMenu.Caption := 'Вид';
  ExitItem.Caption := 'Выход';
  
  // Настройка кнопок фильтрации
  FilterBtn.Caption := 'Применить фильтр';
  ClearFilterBtn.Caption := 'Очистить фильтр';
  RefreshBtn.Caption := 'Обновить';
  FilterEdit.TextHint := 'Введите текст для фильтрации...';
end;

procedure TMainFrm.FilterBtnClick(Sender: TObject);
var
  FilterText: string;
begin
  FilterText := FilterEdit.Text;
  if FilterText <> '' then
  begin
    case PageControl1.ActivePageIndex of
      0: tblFlights.Filter := Format('FlightNumber LIKE ''%%%s%%'' OR Destination LIKE ''%%%s%%''', 
                                    [FilterText, FilterText]);
      1: tblAircraft.Filter := Format('Model LIKE ''%%%s%%''', [FilterText]);
      2: tblPassengers.Filter := Format('FirstName LIKE ''%%%s%%'' OR LastName LIKE ''%%%s%%''',
                                       [FilterText, FilterText]);
    end;
    
    case PageControl1.ActivePageIndex of
      0: tblFlights.Filtered := True;
      1: tblAircraft.Filtered := True;
      2: tblPassengers.Filtered := True;
    end;
  end;
end;

procedure TMainFrm.ClearFilterBtnClick(Sender: TObject);
begin
  FilterEdit.Clear;
  tblFlights.Filtered := False;
  tblAircraft.Filtered := False;
  tblPassengers.Filtered := False;
end;

procedure TMainFrm.RefreshBtnClick(Sender: TObject);
begin
  tblFlights.Refresh;
  tblAircraft.Refresh;
  tblPassengers.Refresh;
  UpdateChart;
end;

procedure TMainFrm.UpdateChart;
begin
  Chart1.Title.Text.Clear;
  Chart1.Title.Text.Add('Статистика рейсов по направлениям');
  
  BubbleSeries1.Clear;
  tblFlights.First;
  while not tblFlights.Eof do
  begin
    BubbleSeries1.AddBubble(
      tblFlights.FieldByName('FlightID').AsInteger,
      tblFlights.FieldByName('PassengerCount').AsInteger,
      Random(50) + 10,
      tblFlights.FieldByName('FlightNumber').AsString
    );
    tblFlights.Next;
  end;
end;

procedure TMainFrm.ExitItemClick(Sender: TObject);
begin
  Close;
end;

end.
Leave a Comment