Задача о замени оборудования


 

 

 

2011

 

Содержание

Введение

3

Постановка задачи и описание модели

4

Контрольный пример

6

Разработка алгоритма

 

Разработка блок схем

 

Код программы

 

Оформление пояснительной записки

 

 

ВВЕДЕНИЕ

 

Во всем мире существует множество предприятий, которые используют для производства своей продукции машинное оборудование. Поэтому при его внедрении нужно составлять оптимальный план использования и замены оборудования. Задачи по замене оборудования рассматриваются как многоэтапный процесс, который характерен для динамического программирования, так как каждый последующий шаг основывается на предыдущем.

Многие предприятия сохраняют  или заменяют оборудование по своему усмотрению, не применяя методы динамического программирования. Применять эти методы целесообразно, так как это позволяет наиболее четко максимизировать прибыль или минимизировать затраты на обновление парка машин.

Задача о замене оборудования состоит  в определении оптимальных сроков замены старого оборудования. Старение оборудования включает  его физический и моральный износ, в результате чего увеличиваются производственные затраты, растут затраты на обслуживание и ремонт, снижается производительность труда. Критерием оптимальности является либо прибыль от эксплуатации оборудования, либо суммарные затраты на эксплуатацию в течение планируемого периода.

 

    1. Постановка задачи и описание модели

 

Рассматривается плановый период из нескольких лет, в начале которого имеется  одна машина фиксированного возраста. В процессе работы машина дает ежегодный доход, требует эксплуатационных затрат и имеет остаточную стоимость, причем все перечисленные характеристики зависят от возраста машины. В любой год машину можно сохранить или продать по остаточной стоимости и купить новую по известной цене (которая может меняться со временем). Задача состоит в следующем: для каждого года в плановом периоде надо решить – сохранять имеющуюся на этот период машину или продать ее и купить новую с тем, чтобы суммарная прибыль за весь плановый период была максимальной.

Переход системы S из одного состояния в другое за 1 год в зависимости от принятого решения можно изобразить графически (рис. 1).

 

Рис.1 – Переход системы S из состояния «новое» состояние за 1 год

 

Введем в рассмотрение функцию – величину суммарного дохода (прибыли) за последние n лет планового периода при условии, что в начале этого периода из n лет имеется машина возраста t.

Функции , , …, , учитывающие вклад последующих шагов в общий эффект, называются функциями Беллмана – по фамилии американского математика Р. Беллмана, создателя метода динамического программирования. С помощью этих функций ведется анализ задач динамического программирования. Очевидно, если мы сумеем вычислить и найти политику замен, то это и будет решение задачи.

 

Введем условные обозначения:

 

t

Возраст машины: t = 0, 1, 2, … (t = 0 – соответствует использованию новой машины, t = 1 – соответствует использованию машины возраста 1 год и так далее);

Z(t)

Стоимость продукции, производимой за 1 год на машине возраста t;

U(t)

Эксплутационные затраты за 1 год  на машину возраста t;

S(t)

Остаточная стоимость машины возраста t;

T

Текущее время в плановом периоде;

P(T)

Цена новой машины в году t;

Начальный возраст машины;

N

Длина планового периода.


 

Предположим, что к началу последнего года планового периода  n = 1 у нас имеется машина возраста t. В нашем распоряжении две возможности. Рассмотрим их.

Возможность первая: сохранить машину и, следовательно, получить за последний год доход

Z(t) – U(t).

Возможность вторая: продать имеющуюся машину и купить новую, что обеспечит в последний год доход

S(t) – P + Z(0) – U(0).

Рассмотрим все возможные решения  в «Первом году» для машины возраста t и для каждого состояния системы найдем оптимальную политику в оставшейся части из n последних лет. Так можно получить политику на весь период из n + 1 последних лет, лучшая из которых и будет условно оптимальной для всего периода.

В случае сохранения машины доход  за рассматриваемый период определяется выражением:

В случае замены машины аналогичной  имеем:

Для принятия решения необходимо вычислить функцию Беллмана, которая имеет вид:

  (1.1)

 

    1. Описание алгоритма решения

 

Входные данные:

 

        1. N – длина планового периода;
        2. Z(N) – стоимость продукции, производимой в t – м году на машине возраста t;
        3. U(N) – эксплуатационные затраты за один год на машину возраста t;
        4. S(N) – остаточная стоимость машины возраста t;
        5. P(N) – цена новой машины в t-м году.

 

Выполнение операций:

        1. проверка корректности входных данных
          1. все входные данные не должны быть отрицательными
          2. Z(N) – строго убывает
          3. U(N) – строго возрастает
        2. вычисление и запись в таблицу 2.2;
        3. вычисление где n = 1, N – 1, t = 0, N – 1

 

Выходные данные:

    1. таблица решения(матрица f), где черным цветом обозначена политика сохранения машины и красным – замена.

 

Дополнительные переменные

 

Save = f(1, t) + f(i, t+1) – промежуточный результат, характерезующая сохранение оборудования;

Zam = s(t) – p(t) +f(1,0)+f(i,1) – промежуточный результат, характерезующая замену оборудования.

 

Функция проверки входных данных

 

Test_data

 

 

 

 

 

 

    1. Контрольный пример

 

Пусть функции Z(t), U(t) заданы табл.3 2.1.

Дано:

Длина планового периода N равна 10 годам,

 

Таблица 2.1

t

0

1

2

3

4

5

6

7

8

9

10

Z(t)

20

20

20

19

19

18

18

17

17

16

15

U(t)

10

11

12

12

13

13

14

14

15

15

15


 

Ограничимся машиной возраста меньше 10 лет. Для простоты решения нужно принять:

    1. Остаточная стоимость машины равна 0 (S(t) = 0);
    2. Цена новой машины со временем не меняется и равна 10 условным единицам (P(t) = P = 0);
    3. Длина планового периода равно 10 (N = 10)

 

Используя формулы  и (1.1), можно вычислить значения функций Беллмана при различных n и t. Значения функций будут вписываться в таблицу 2.2.

 

Таблица 2.2

 

                 t

0

1

2

3

4

5

6

7

8

9

10

10

9

8

7

6

5

4

3

2

1

0

19

17

15

13

11

9

9

9

9

9

9

27

24

21

18

17

17

17

17

17

17

17

34

30

26

24

24

24

24

24

24

24

24

40

35

32

31

30

30

30

30

30

30

30

45

41

39

37

36

35

35

35

35

35

35

51

48

45

43

41

41

41

41

41

41

41

58

54

51

48

48

48

48

48

48

48

48

64

60

56

55

54

54

54

54

54

54

54

70

65

63

61

60

60

60

60

60

60

60


 

Решение:

 

(0) = Z(0) – U(0) = 20 – 10 = 10

(1) = Z(1) – U(1) = 20 – 11 = 9

(2) = Z(2) – U(2) = 20 – 12 = 8

(3) = Z(3) – U(3) = 19 – 12 = 7

(4) = Z(4) – U(4) = 19 – 13 = 6

(5) = Z(5) – U(5) = 18 – 13 = 5

(6) = Z(6) – U(6) = 18 – 14 = 4

(7) = Z(7) – U(7) = 17 – 14 = 3

(8) = Z(8) – U(8) = 17 – 15 = 2

(9) = Z(9) – U(9) = 16 – 15 = 1

(10) = Z(10) – U(10) = 15 – 15 = 0

 

Из вычислений выше видно, что машина возраста 10 лет не выгодна, потому что она не приносит доходов.

Так как  тогда формула (1.1) примет вид:

 

 

 сохранение оборудования

 сохранение оборудования

 сохранение оборудования

 сохранение оборудования

 сохранение оборудования

 сохранение оборудования

 замена оборудования

 замена оборудования

 замена оборудования

 замена оборудования

 замена оборудования

 

Аналогично выполняются следующие  шаги с 3 по 10 ( по ).

 

Утойчивость программы

 

 

Имя проекта  вводится любые символы кроме: «.»; «/»; «,»; «[»; «]»;«{»; «}».

Длина планового  периода это целое число от 2 до 99.

 

 

Z(t), U(t), S(t), P(T), P, S – положительное число дробного типа;

Z(t) – числа строго убывают;

U(t) – числа строго возрастают.

 

Заключение

 

В ходе выполнения курсовой работы было рассмотрено динамическое программирование – это область математического программирования, включающая совокупность приемов и средств для нахождения оптимального решения, а также оптимизации каждого шага в системе и выработке стратегии управления, то есть процесс управления можно представить как многошаговый процесс.

К классу задач динамического программирования относится множество различных задач. В данной курсовой работе был расссмотрен раздел «Задачи о замене оборудования» и реализован программный продукт для нахождения оптимального плана замены оборудования.

В роли инструмента для разработки программного продукта была использована среда Delphi.

 

Список используемой литературы

 

  1. Вентцель Е.С. Элементы динамического программирования.- М.: Наука, 1964.
  2. Карманов В.Г. Математическое программирование. –М.: Наука, 1986.
  3. Терехов Л.Л. Экономико-математические методы.- М.: Статистика, 1972.

 

Приложения

 

 

Листинг программы

 

Главный модуль. Этот модуль выполняет  функции:

  • в нем описан основной интерфейс пользователя
  • управление проектами (добавление, изменение, открытие)
  • ввод данных

 

unit Main;

unit Main;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Menus, StdCtrls, Grids, ExtCtrls, Buttons, ComCtrls, ToolWin, ImgList;

 

type

  TForm_Main = class(TForm)

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N_New: TMenuItem;

    P_In_data: TPanel;//панель входных данных

    SG_Tabl_input: TStringGrid;

    ED_S: TLabeledEdit;

    Ed_P: TLabeledEdit;

    N_Save: TMenuItem;

    N_load: TMenuItem;

    N_open_otchet: TMenuItem;

    N3: TMenuItem;

    ImageList1: TImageList;

    OD_file: TOpenDialog;

    N2: TMenuItem;

    Panel1: TPanel;

    BitBtn1: TBitBtn;

    BitBtn2: TBitBtn;

    Panel2: TPanel;

    RE_Help: TRichEdit;

    N_SetColor: TMenuItem;

    ColorDialog1: TColorDialog;

    N_Font: TMenuItem;

    FontDialog1: TFontDialog;

    Label1: TLabel;

    Label2: TLabel;

    BitBtn3: TBitBtn;

    N_exit: TMenuItem;

    N4: TMenuItem;

    BitBtn4: TBitBtn;

    BitBtn5: TBitBtn;

    BitBtn6: TBitBtn;//таблица входных данных

    procedure ED_SKeyPress(Sender: TObject; var Key: Char);

    procedure N_SaveClick(Sender: TObject);

    procedure N_loadClick(Sender: TObject);

    function B_ZapolnClick(Sender: TObject):boolean;

    procedure BitBtn1Click(Sender: TObject);

    procedure NewProjectClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure ToolButton3Click(Sender: TObject);

    procedure N_NewClick(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure BitBtn2Click(Sender: TObject);

    procedure SG_Tabl_inputKeyPress(Sender: TObject; var Key: Char);

    procedure N_SetColorClick(Sender: TObject);

    procedure N_FontClick(Sender: TObject);

    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

    procedure BitBtn3Click(Sender: TObject);

    procedure N_exitClick(Sender: TObject);

    procedure N4Click(Sender: TObject);

    procedure BitBtn4Click(Sender: TObject);

    procedure BitBtn5Click(Sender: TObject);

    procedure BitBtn6Click(Sender: TObject);

  private

 

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form_Main: TForm_Main;

  ProgramWay: string;

 

procedure EnterData(FromFile: boolean;

                      n: integer = 0;

                      P: boolean = false;

                      S: boolean = false;

                      sNam: string ='');

 

procedure OpenProject (PFile: string);

procedure ResizeProject (n: integer; P: boolean; S: boolean);

 

implementation

 

{$R *.dfm}

 

uses

  variable, Enter_setting, view_result, UnitOpenProject, functions, Help;

 

var

  Mash : Tcar;

  DirProject, NameProject : string;

 

procedure OpenProject (PFile: string);

begin

  NameProject := PFile;

    if Mash <> nil then

  begin

    //MessageBox(

    //ShowMessage('Вы действительно хотите открыть новый проект');

    //exit;

  end;

  mash := Tcar.create;

 

  if mash.LoadFromFile(NameProject) then

  begin              

    EnterData(true);

  end

  else

  begin

    Mash.Destroy;

    Mash := nil;

  end;

end;

 

procedure SetPanel;

var

  i : integer;

begin

  with Form_Main do

  begin

    P_In_data.Visible := true;

    SG_Tabl_input.ColCount := Mash.n + 2;

    SG_Tabl_input.RowCount := 3;

    Ed_p.Visible := false;

    Ed_s.Visible := false;

    Panel2.Visible := false;

 

    for i := 1 to Mash.n + 1 do

      SG_Tabl_input.Cells[i, 0]:= IntToStr(i - 1);

    SG_Tabl_input.Cells[0, 1]:='Z(t)';

    SG_Tabl_input.Cells[0, 2]:='U(t)';

 

    if Mash.PConst then

      Ed_p.Visible := true

    else

    begin

      SG_Tabl_input.RowCount := SG_Tabl_input.RowCount + 1;

      SG_Tabl_input.Cells[0,SG_Tabl_input.RowCount-1]:='P(t)';

    end;

 

    if Mash.SConst then

      Ed_s.Visible := true

    else

    begin

      SG_Tabl_input.RowCount := SG_Tabl_input.RowCount + 1;

      SG_Tabl_input.Cells[0,SG_Tabl_input.RowCount-1]:='S(t)';

    end;

 

    SG_Tabl_input.Height := SG_Tabl_input.DefaultRowHeight *

        (SG_Tabl_input.RowCount + 1);

  end;

 

end;

 

procedure ResizeProject (n: integer; P: boolean; S: boolean);

begin

    Mash := Tcar.create(n, P, S);

    setPanel;

end;

 

procedure EnterData(FromFile: boolean;

                      n: integer = 0;

                      P: boolean = false;

                      S: boolean = false;

                      sNam: string = '');

var

  i: integer;

begin

  if FromFile then

  begin

    setPanel;

    with Form_Main do

    begin

      for I := 0 to mash.n do

      begin

        SG_Tabl_input.Cells[i+1,1] := FloatToStr(Mash.z[i]);

        SG_Tabl_input.Cells[i+1,2] := FloatToStr(Mash.u[i]);

      end;//for I := 0 to mash.n do

 

      if Mash.PConst then

        Ed_p.Text := FloatToStr(Mash.p[0])

      else

      for I := 0 to mash.n do

        SG_Tabl_input.Cells[i+1,3] := FloatToStr(Mash.p[i]);

 

      if Mash.SConst then

        Ed_S.Text := FloatToStr(Mash.s[0])

      else

        for I := 0 to mash.n do

          if Mash.PConst then

            SG_Tabl_input.Cells[i+1,3] := FloatToStr(Mash.s[i])

          else

            SG_Tabl_input.Cells[i+1,4] := FloatToStr(Mash.s[i]);

    end;//with Form_Main do

 

  end

  else

  begin

    Mash := Tcar.create(n, P, S);

    setPanel;

    NameProject := dirProject + sNam;

  end;

 

end;

 

procedure TForm_Main.BitBtn1Click(Sender: TObject);

begin

  OpenFileProject;

end;

 

procedure TForm_Main.BitBtn2Click(Sender: TObject);

begin

   NewProjectClick(Sender);

end;

 

procedure TForm_Main.BitBtn3Click(Sender: TObject);

begin

  close;

end;

 

procedure TForm_Main.BitBtn4Click(Sender: TObject);

begin

  //изменить настройки проекта

  SetProject(NameFile(NameProject), Mash.n, Mash.PConst, Mash.SConst);

end;

 

procedure TForm_Main.BitBtn5Click(Sender: TObject);

begin

  if mash = nil then

  begin

    ShowMessage('Вы не создали или не открыли проект');

    exit;

  end;

  mash := TCar.create(SG_Tabl_input.ColCount - 2, ed_p.Visible, ed_s.Visible);

  if B_ZapolnClick(sender) then

  begin

    mash.decision;

    mash.SaveToHTML(NameProject);

    OpenOtchet(NameProject);

  end;

 

end;

 

procedure TForm_Main.BitBtn6Click(Sender: TObject);

begin

  close;

end;

 

function TForm_Main.B_ZapolnClick(Sender: TObject):boolean;

var

  i, j: Integer;

begin

  for i := 1 to SG_Tabl_input.RowCount - 1 do

  begin

    for j := 1 to SG_Tabl_input.ColCount - 1 do

      if SG_Tabl_input.Cells[j, i] = '' then

      begin

        result := false;

        showMessage('Не заполнены все поля');

        exit;

      end;

  end;

 

  for i := 1 to SG_Tabl_input.ColCount - 1 do

  begin

    mash.z[i - 1] := StrToFloat(SG_Tabl_input.Cells[i, 1]);

    Mash.u[i - 1] := StrToFloat(SG_Tabl_input.Cells[i, 2]);

  end;

 

  if mash.PConst then

    mash.p[0] := StrToFloat(Ed_p.Text)

  else

  for i := 1 to SG_Tabl_input.ColCount - 1 do

  begin

    mash.P[i - 1] := StrToFloat(SG_Tabl_input.Cells[i, 3]);

  end;

 

  if mash.SConst then

    mash.s[0] := StrToFloat(Ed_s.Text)

  else

    if mash.PConst then

      for I := 1 to SG_Tabl_input.ColCount - 1 do

        mash.s[i - 1] := StrToFloat(SG_Tabl_input.Cells[i, 3])

    else

      for I := 1 to SG_Tabl_input.ColCount - 1 do

        mash.s[i - 1] := StrToFloat(SG_Tabl_input.Cells[i, 4]);

 

  if Mash.test_data then

    result := true

    //ShowMessage('данные верны')

  else

  begin

    ShowMessage('данные не верны');

    result := false;

  end;

end;

 

procedure TForm_Main.ED_SKeyPress(Sender: TObject; var Key: Char);

begin

  if ((#46 = key) or ('.' = key)) and (pos(',', ED_S.Text) > 0) then

    key := #0;

  if #46 = key then

    key := ',';

  if not(('0' <= key) and (key <= '9') or (key = #8) or (',' = key)) then

    key := #0;

end;

 

procedure TForm_Main.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

var

  varin : variant;

begin

  if mash <> nil then

  begin

    varin := messageBox(Handle,'Сохранить  проект перед выходом?','Выход',

        mb_YesNoCancel or mb_iconquestion);

    if varin = mrYes then

      N_SaveClick(Sender);

    if varin = mrNo then

      CanClose := true;

    if varin = mrCancel then

      CanClose := false;

  end;

 

end;

 

procedure TForm_Main.FormCreate(Sender: TObject);

begin

  NameProject := '';

  ProgramWay := DirInit(ParamStr(0));

  DirProject := ProgramWay + ProjectFolder;

  mash := nil;

  panel2.Top := (Form_Main.Height div 2) - (panel2.Height div 2);

  panel2.Left := (Width div 2) + (panel2.Width div 2) - 150;

  RE_Help.Lines.LoadFromFile('files\help_data.rtf');

end;

 

 

procedure TForm_Main.N_exitClick(Sender: TObject);

begin

  Close;

end;

 

procedure TForm_Main.N_FontClick(Sender: TObject);

begin

  if Fontdialog1.Execute then

    Font := Fontdialog1.Font;

end;

 

procedure TForm_Main.N_loadClick(Sender: TObject);

{загрузка данных из файла}

begin

  if Mash <> nil then

  begin

    //MessageBox(

    //ShowMessage('Вы  действительно хотите открыть новый проект');

    //exit;

  end;

  mash := Tcar.create;

 

  if OD_file.Execute then

  begin

    ShowMessage(DeleteExtension(OD_file.FileName));

    NameProject := DeleteExtension(OD_file.FileName);

    DirProject := DirInit(Od_file.FileName);

  end

  else

    exit;

 

  if mash.LoadFromFile(NameProject) then

  begin

    EnterData(true);

  end

  else

  begin

    freeandnil(Mash);//освобождение

  end;

end;

 

procedure TForm_Main.N_NewClick(Sender: TObject);

{создать проект}

begin

  newElem;

end;

 

procedure TForm_Main.N_SaveClick(Sender: TObject);

{сохранение данных}

begin

  if mash = nil then

    ShowMessage('Не создан проект')

  else

    if B_ZapolnClick(sender) then

      Mash.SaveToFile( NameProject);

end;

 

procedure TForm_Main.N_SetColorClick(Sender: TObject);

begin

  if ColorDialog1.Execute then

    color := ColorDialog1.Color;

end;

 

procedure TForm_Main.SG_Tabl_inputKeyPress(Sender: TObject; var Key: Char);

var

  I, flag: Integer;

  str: string;

begin

  ED_SKeyPress(sender, key);

  if key = '.' then

    key := ',';

  if key = ',' then

  begin

    str := SG_Tabl_input.Cells[SG_Tabl_input.Col,SG_Tabl_input.Row];

    flag := 0;

    for I := 0 to length(str) do

      if str[i] = ',' then

        inc(flag);

    if flag > 0 then

      key := #0;  

  end;            

end;

 

procedure TForm_Main.ToolButton3Click(Sender: TObject);

begin

  OpenFileProject;

end;

 

procedure TForm_Main.N2Click(Sender: TObject);

//окно открытия проекта

begin

  FormOpenProjects.ShowModal;

end;

 

procedure TForm_Main.N4Click(Sender: TObject);

//открытие справки

begin

  help.Form1.ShowModal;

end;

 

procedure TForm_Main.NewProjectClick(Sender: TObject);

//Создание нового  проекта

begin

  if mash <> nil then

  begin

    Mash := nil;

    P_In_data.Visible := false;

  end;

  newElem;

end;

 

end.

 

 

 

Модуль создания и изменение  параметров проекта. Модуль выполняет функцию, ввод настроек проекта (длину планового периода, имя проекта, изменяется или нет остаточная стоимость и цена новой машины).

 

 

unit Enter_setting;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, functions, ComCtrls;

 

type

  TForm_enter = class(TForm)

    Ed_n: TEdit;

    But_set: TButton;

    CheckSconst: TCheckBox;

    CheckPconst: TCheckBox;

    Ed_patch: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    UpDown1: TUpDown;

    B_resize: TButton;

    procedure But_setClick(Sender: TObject);

    procedure Ed_nKeyPress(Sender: TObject; var Key: Char);

    procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);

    procedure FormActivate(Sender: TObject);

    procedure Ed_patchKeyPress(Sender: TObject; var Key: Char);

    procedure B_resizeClick(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form_enter: TForm_enter;

 

procedure SetProject(s:string; n:integer; pCon,sCon:boolean);

procedure newElem;

 

implementation

{$R *.dfm}

 

uses

  Main;

 

procedure newElem;

begin

  Form_enter.Ed_Patch.Enabled := true;

  Form_enter.ShowModal;

end;

 

procedure SetProject(s:string; n:integer; pCon,sCon:boolean);

begin                 

  Form_enter.Ed_Patch.Enabled := false;

  Form_enter.Ed_Patch.Text := s;

  Form_enter.But_set.Visible := false;

  Form_enter.B_resize.Visible := true;

  Form_enter.Ed_n.Text := IntToStr(n);

  Form_enter.UpDown1.Position := n;

  Form_enter.CheckPconst.Checked := pCon;

  Form_enter.CheckSconst.Checked := sCon;

  Form_enter.ShowModal;

end;

 

procedure TForm_enter.B_resizeClick(Sender: TObject);

var

  n: integer;

begin

  Form_enter.But_set.Visible := true;

  Form_enter.B_resize.Visible := false;

  n := StrToInt(Ed_n.Text);

   if n > 0 then

  begin

    ResizeProject (n, CheckPconst.Checked, CheckSconst.Checked);

    Form_enter.Ed_Patch.Enabled := true;

    close;

  end

  else

    ShowMessage('вы  не правильно ввели' +

     'длину  плановуого периода');

end;

 

procedure TForm_enter.But_setClick(Sender: TObject);

var

  n, i: integer;

begin

  if Trim(Ed_patch.Text) = '' then

  begin

    ShowMessage('Вы  не ввели имя проекта'+ #10 + #13 +

    ' Пожалуйста  введите имя');

    Ed_patch.SetFocus;

    exit;

  end;

  n := StrToInt(Ed_n.Text);

  if n > 0 then

  begin

    for i:=0 to main.Form_Main.SG_Tabl_input.RowCount do

      main.Form_Main.SG_Tabl_input.Rows[i].Clear;

    EnterData(false, n, CheckPconst.Checked, CheckSconst.Checked,

        Ed_Patch.Text);

  end

  else

    ShowMessage('вы не правильно ввели' +

     'длину плановуого периода');

  close;

end;

 

procedure TForm_enter.Ed_nKeyPress(Sender: TObject; var Key: Char);

begin

  if not(('0' <= key) and (key <= '9') or (key = #8)) then

    key := #0;

end;

 

procedure TForm_enter.Ed_patchKeyPress(Sender: TObject; var Key: Char);

begin

  if key = '.' then

    key := #0;

end;

 

procedure TForm_enter.FormActivate(Sender: TObject);

begin

  UpDown1.Position := StrToInt(ED_n.Text);

end;

 

procedure TForm_enter.UpDown1Click(Sender: TObject; Button: TUDBtnType);

begin

  ED_n.Text := IntToStr(UpDown1.Position);

end;

 

end.

 

 

Модуль открытия нового проекта. Этот модуль выводит пользователю все  существующие проекты франящиеся в  папке с программой для выбора пользователя проекта для открытия

 

unit UnitOpenProject;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Buttons;

 

type

  TFormOpenProjects = class(TForm)

    LB_File: TListBox;

    B_open: TButton;

    BitBtn1: TBitBtn;

    B_new: TButton;

    procedure FormActivate(Sender: TObject);

    procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;

      var Resize: Boolean);

    procedure LB_FileDblClick(Sender: TObject);

    procedure B_openClick(Sender: TObject);

    procedure B_newClick(Sender: TObject);

    procedure BitBtn1Click(Sender: TObject);

    procedure LB_FileKeyPress(Sender: TObject; var Key: Char);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  FormOpenProjects: TFormOpenProjects;

 

procedure OpenFileProject ();

 

implementation

 

{$R *.dfm}

 

uses

  Functions, variable, main;

 

var

  dir : string;

 

 

procedure OpenFileProject ();

begin

  FormOpenProjects.ShowModal;

  FormOpenProjects.B_new.Visible := false;

  FormOpenProjects.LB_File.Visible := true;

  FormOpenProjects.B_open.Visible := false;

  //FormOpenProjects.Visible := true;

end;

 

procedure ListFileDir(Path: string; FileList: TStrings);

var

   SR: TSearchRec;

begin

   if FindFirst(Path + '*.bin', faAnyFile, SR) = 0 then

   begin

     repeat

       if (SR.Attr <> faDirectory) then

       begin

         FileList.Add(copy(SR.Name,0,pos('.',SR.Name) - 1));

       end;

     until FindNext(SR) <> 0;

     FindClose(SR);

   end;

end;

 

 

procedure TFormOpenProjects.BitBtn1Click(Sender: TObject);

begin

  //main.Form_Main.Destroy;

  close;

end;

 

procedure TFormOpenProjects.B_newClick(Sender: TObject);

begin

  Form_Main.N_NewClick(sender);

  close;

end;

 

procedure TFormOpenProjects.B_openClick(Sender: TObject);

begin

  LB_file.Visible := true;

  B_new.Visible := false

end;

 

procedure TFormOpenProjects.FormActivate(Sender: TObject);

begin

  LB_File.Clear;

  dir := DirInit(ParamStr(0))+ProjectFolder;

  ListFileDir(Dir, LB_File.Items);

end;

 

procedure TFormOpenProjects.FormCanResize(Sender: TObject; var NewWidth,

  NewHeight: Integer; var Resize: Boolean);

begin

  resize := false;

end;

 

procedure TFormOpenProjects.LB_FileDblClick(Sender: TObject);

begin

  if LB_File.ItemIndex = -1 then