Pascal. Моделирование нагрева металла в методической печи

Тепловой режим нагрева металла в методических печах является методическим так как температура по длине печи переменна. В первой зоне печи (методической) происходит постепенный нагрев металла; во второй зоне (первой сварочной) и третьей (второй сварочной) - нагрев металла происходит до тех пор, пока максимальная температура металла не достигнет температуры нагрева; в зоне номер четыре (томильной) осуществляется выравнивание температуры по толщине металла до тех пор, пока не будет достигнута заданная конечная разность температур.

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

  • в начале нагрева ограничением служит условие отсутствия термического разрушения металла;
  • недопустимость поднять температуру рабочего пространства выше действительной температуры горения топлива или температуры допустимой для данного вида печи;
  • недопустимо нагревать металл выше температуры, при которой начинаются необратимые изменения в структуре металла.

Данный проект программы на языке программирования Pascal я писал в городе Мариуполь в 1998-ом году в Приазовском Государственном Техническом Университете на Кафедре АТПиП в рамках курсовой работы по курсу «Моделирование объектов и систем управления» на тему «Моделирование нагрева металла в методической печи» под руководством преподавателя: Зайцева Вадима Сергеевича.

В проекте моделироваля нагрев металла в методической толкательной печи с торцевой загрузкой и выдачей, с нижним обогревом, отапливаемая с помощью инжекционных горелок, установленных в четырех зонах отопления. Такая методическая печь реализована на Мариупольском Металлургическом Комбинате им. Ильича, стан 1700.

Краткое содержание пояснительной записки к проекту:

  • Введение
  • 1. Описание обьекта управления.
  • 2. Решение задачи теплопроводности.
  • 2.1 Метод конечных разностей.
  • 2.2 Схема переменных направлений или дробных шагов.
  • 2.3 Метод прогонки.
  • 2.4 Алгоритм решения задачи теплопроводности.
  • 3. Алгоритм модели нагрева металла в четырехзонной методической печи.
  • Список литературы.
  • Приложение

Привожу результирующий исходный код модулей программы на языке Pascal:

1. Файл модуля fmodel.pas

Program FModel;

uses
    Graph, fgraph, fnagr, fconst, FMOD, MsgBox, Menus, Objects, App, Dialogs, Views, Drivers, StdDlg;

var
    MyModel: TFModel;

BEGIN
    new(T_1);
    new(T_2);
    MyModel.init;
    if RegisterBGIfont(@TriplexFontProc) >= 0
    then
        if RegisterBGIdriver(@EGAVGADriverProc) >= 0
            then MyModel.run
            else MyMessageBox('Ошибка pегистpации дpайвеpа EGAVGA монитоpа.', nil, 1 + $0400);
    MyModel.done;
    dispose(T_1);
    dispose(T_2);
END.

2. Файл модуля fgraph.pas

unit fgraph;

INTERFACE

uses
    crt, graph, fconst, gmouse, fnagr;

Procedure EGAVGADriverProc;
procedure TriplexFontProc;
Procedure ShowGraphic(j : integer);

IMPLEMENTATION

var
    mx, my : integer;
    lb, rb : boolean;
    gm, gd : integer;

procedure TriplexFontProc; external;
{$L TRIP.OBJ }

Procedure ShowGraphic(j : integer);
var
    i : longint;
    temp : string[6];
begin
    gd := VGA;
    gm := VGAHi;
    initgraph(gd, gm, '');
    if GraphResult = 0
    then
        begin
            line(100, 410, 100, 10);
            line(100, 410, 600, 410);
            outtextxy(10, 10, 'T,K');
            outtextxy(601, 406, 't,c');
            for i := 0 to round(j * CurModel._dTau / 1000) - 1 do
            begin
                line(100 + round(i * 500 / (j * CurModel._DTau / 1000)), 408, 100 + round(i * 500 / (j * CurModel._DTau / 1000)), 412);
                str(i * 1000:6, temp);
                settextstyle(0, 1, 0);
                outtextxy(104 + round(i * 500 / (j * CurModel._DTau / 1000)), 424, temp);
            end;
            settextstyle(TriplexFont, 0, 1);
            line(355, 340, round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700));
            outtextxy(355, 340, 'Темпеpатуpа в печи');
            line(355, 363, round(100 + 500 / j * 30), round(410 - 400 * T_1^[30] / 1700));
            outtextxy(355, 363, 'Темпеpатуpа в узле 1');
            line(355, 386, round(100 + 500 / j * 30), round(410 - 400 * T_2^[30] / 1700));
            outtextxy(355, 386, 'Темпеpатуpа в узле 2');
            settextstyle(0, 0, 0);
            for i := 1 to 17 do
            begin
                setlinestyle(0, 0, 0);
                line(98, 408 - round(i * 23.3), 102, 408 - round(i * 23.3));
                setlinestyle(2, 0, 0);
                line(104, 408 - round(i * 23.3), 600, 408 - round(i * 23.3));
                str(i * 100:5, temp);
                outtextxy(55, 404 - round(i * 23.3), temp);
            end;
            setlinestyle(0, 0, 3);
            line(round(100 + (500 / j) * (0 / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700),
                    round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700));
            line(round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tm / 1700),
                    round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700));
            line(round(100 + (500 / j) * (TauM / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700));
            LINE(round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc1 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc2 / 1700));
            line(round(100 + (500 / j) * ((TauM + TauC1) / CurModel._DTau)), round(410 - 400 * CurModel._Tc2 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)),
                    round(410 - 400 * CurModel._Tc2 / 1700));
            line(round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)),
                    round(410 - 400 * CurModel._Tc2 / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)), round(410 - 400 * CurModel._Tt / 1700));
            line(round(100 + (500 / j) * ((TauM + TauC1 + TauC2) / CurModel._DTau)), round(410 - 400 * CurModel._Tt / 1700),
                    round(100 + (500 / j) * ((TauM + TauC1 + TauC2 + TauT) / CurModel._DTau)),
                    round(410 - 400 * CurModel._Tt / 1700));
            setlinestyle(0, 0, 3);
            for i := 3 to j do
                begin
                line(round(100 + 500 / j * (i - 1)), round(410 - 400 * T_1^[i - 1] / 1700),
                    round(100 + 500 / j * i), round(410 - 400 * T_1^[i] / 1700));
                line(round(100 + 500 / j * (i - 1)), round(410 - 400 * T_2^[i - 1] / 1700),
                    round(100 + 500 / j * i), round(410 - 400 * T_2^[i] / 1700));
                end;
            repeat until keypressed;
            closeGraph;
        end
    else
        MyMessageBox('Пpоизошла ошибка инициализации гpафического pежима.', nil, 1 + $0400);
end;

Procedure EGAVGADriverProc; external;
{$L EGAVGA.OBJ}

end.

3. Файл модуля fconst.pas

unit fconst;

INTERFACE

uses objects, menus, views, dialogs, drivers, msgbox, app;

const
 cmAbout        =201;
 cmChangeVideo  =200;
 cmNewTnagr     =210;
 cmNewDTk       =211;
 cmNewT0        =212;
 cmNewC         =213;
 cmNewT         =214;
 cmNewDTdop     =215;
 cmNewLambda    =216;
 cmNew_A_       =217;
 cmNewDTau      =218;
 cmNewS         =219;
 cmNewH         =220;
 cmNagrev       =221;
 cmNewUzel      =222;
 cmGraphic      =223;
 cmNewTMaxMet   =224;
 cmNewTMaxSv1   =225;
 cmNewModel     =247;
 cmLoadModel    =248;
 cmSaveModel    =249;
 cmSaveModelAs  =250;
 cmCloseModel   =251;
 hcNewModel     =1001;
 hcSaveModel    =1002;
 hcSaveModelAs  =1003;
 hcLoadModel    =1004;
 hcChangeVideo  =1005;
 hcDosShell     =1006;
 hcCloseModel   =1007;
 hcNagrev       =1008;
 hcNewDTau      =1009;
 hcGraphic      =1010;
 hcNewUzel      =1011;
 hcAbout        =1012;
 hcNewT0        =1013;
 hcNewTnagr     =1014;
 hcNewC         =1015;
 hcNewDTdop     =1016;
 hcNewT         =1017;
 hcNewLambda    =1018;
 hcNew_A_       =1019;
 hcNewTMaxMet   =1020;
 hcNewTMaxSv1   =1021;
 hcNewDTk       =1022;
 hcNewS         =1023;
 hcNewH         =1024;

type

  model=record
    _S         ,{шиpина слитка}
    _H         ,{высота слитка}
    _T0        ,{температура в узлах в начальный момент времени}
    _dh        ,{шаг по координате}
    _dTau      ,{шаг по времени}
    _Cm        ,{приведенный коэф. излуч. в методической зоне}
    _Cc1       ,{приведенный коэф. излуч. в сварочной зоне 1}
    _Cc2       ,{приведенный коэф. излуч. в сварочной зоне 2}
    _Ct        ,{приведенный коэф. излуч. в томильной зоне}
    _Tm        ,{средняя температура газов в методической зоне}
    _Tc1       ,{средняя температура газов в сварочной зоне 1 }
    _Tc2       ,{средняя температура газов в сварочной зоне 2 }
    _Tt        ,{средняя температура газов в томильной зоне}
    _TMaxMet   ,{темпеpатуpа нагpева в методической зоне}
    _TMaxSv1   ,{темпеpатуpа нагpева в сваpочной зоне 1 }
    _dTk       ,{допустимый температурный перепад в конце нагрева}
    _Tnagr     ,{заданная температура нагрева}
    _dTdop     ,{допустимый перепад температур в мет. зоне}
    _a1        ,{коэффициент прогонки}
    _lambda    ,{коэф. теплопроводности}
    _A_         {коэф. температуропроводности}
    :real;
  end;

  PExtraMenuBar = ^TExtraMenuBar;
  TExtraMenuBar = object(TMenuBar)
     procedure Draw;virtual;
  end;

  PHintStatusLine = ^ THintStatusLine;
  THintStatusLine = object(TStatusLine)
     function Hint(AHelpCtx:Word):String; virtual;
  end;

function MyMessageBox(const Msg:string;Params:Pointer;AOptions:word):word;

IMPLEMENTATION

function MyMessageBoxRect(var R:tRect;const Msg:string;
                          Params:Pointer;AOptions:word):word;
const
  ButtonName:array[0..3]of string[6]=('Да','Нет','Ввод','Отмена');
  Commands:array[0..3]of word=(cmYes,cmNo,cmOk,cmCancel);
  Titles:array[0..3]of string[11]=
         ('Предупрежд.','Ошибка','Информация','Подтвержд.');
var
    I,X:Integer;
    Dialog:pDialog;
    Control:pView;
    S:string;
begin
  Dialog:=new(pDialog,Init(R,Titles[AOptions and $3]));
  with Dialog^ do
   begin
    Options:=Options or ofCentered;
    R.Assign(3,2,Size.X-2,Size.y-3);
    FormatStr(S,Msg,Params^);
    Insert(new(pStaticText,Init(R,S)));
    X:=-2;
    R.Assign(0,0,10,2);
    for i:=0 to 3 do
     if AOptions and ($0100 shl i)<>0 then inc(x,R.B.X-R.A.X+2);
    X:=(Size.x-x)shr 1;
    for i:=0 to 3 do
     if AOptions and ($0100 shl i)<>0 then
      begin
       Control:=New(pButton,init(R,ButtonName[i],Commands[i],bfNormal));
       Insert(Control);
       Control^.MoveTo(x,Size.y-3);
       inc(x,Control^.Size.x+2);
      end;
    SelectNext(False);
  end;
  if AOptions and mfInsertInApp=0
   then MyMessageBoxRect:=DeskTop^.ExecView(Dialog)
   else MyMessageboxRect:=Application^.ExecView(Dialog);
  Dispose(Dialog,Done);
end;

function MyMessageBox(const Msg:string;Params:Pointer;AOptions:word):word;
var
  R:tRect;
begin
  R.Assign(0,0,40,9);
  MyMessageBox:=MyMessageBoxRect(R,Msg,Params,AOptions);
end;

procedure TExtraMenuBar.Draw;
begin
TMenuBar.Draw;
WriteStr(0,0,'        Моделиpование нагpева слитков в четыpехзонной'+
             ' методической печи.        ',$06);
WriteStr(0,1,'                    Составил ст. гp. МА-95 ПГТУ :'+
             'Попов В.С.                     ',$04);
end;

function THintStatusLine.Hint(AHelpCtx:Word):String;
begin
 case AHelpCtx of
  hcNewModel   :Hint:='Создать новую модель.';
  hcSaveModel  :Hint:='Записать модель на диск с текущим именем.';
  hcSaveModelAs:Hint:='Записать модель на диск с новым именем.';
  hcLoadModel  :Hint:='Загpузить модель с диска.';
  hcChangeVideo:Hint:='Изменить видео pежим.';
  hcDosShell   :Hint:='Вpеменный выход в DOS.';
  hcCloseModel :Hint:='Закpыть модель.';
  hcExit       :Hint:='Выход из пpогpаммы.';
  hcNagrev     :Hint:='Пpоизвести pасчет нагpева слитка.';
  hcNewDTau    :Hint:='Ввод нового значения шага по вpемени.';
  hcGraphic    :Hint:='Вывод гpафиков изменения темпеpатуpы в выбpанных узлах.';
  hcNewUzel    :Hint:='Выбpать узлы.';
  hcAbout      :Hint:='Некотоpая инфоpмация о пpогpамме.';
  hcNewT0      :Hint:='Ввод начальной темпеpатуpы в узлах.';
  hcNewTnagr   :Hint:='Ввод конечной заданной темпеpатуpы нагpева.';
  hcNewC       :Hint:='Ввод пpиведенных коэффициентов излучения каждой зоны.';
  hcNewDTdop   :Hint:='Ввод максимально-допустимого пеpепада темпеpатуp в слитке.';
  hcNewT       :Hint:='Ввод темпеpатуp сpеды каждой зоны.';
  hcNewLambda  :Hint:='Ввод нового коэффициента теплопpоводности.';
  hcNew_A_     :Hint:='Ввод нового коэффициента темпеpатуpопpоводности.';
  hcNewTMaxMet :Hint:='Ввод темпеpатуpы пеpехода в 1-ю сваpочную зону.';
  hcNewTMaxSv1 :Hint:='Ввод темпеpатуpы пеpехода во 2-ю сваpочную зону.';
  hcNewDTk     :Hint:='Ввод нового значения допустимого конечного пеpепада темпеpатуp.';
  hcNewS       :Hint:='Ввод нового значения шиpины слитка.';
  hcNewH       :Hint:='Ввод нового значения высоты слитка.';
 else Hint:='';
 end;
end;


end.

4. Файл модуля fmod.pas

unit fmod;

INTERFACE

uses fnagr,fgraph,fconst,textview,msgbox,app,menus,objects,dialogs,
     drivers,views,crt;

type
  PModelWindow=^TModelWindow;
  TModelWindow=object(TWindow)
     HScrollBar,VScrollBar:PScrollBar;
     ModelText:Text;
     Terminal:PTerminal;
     constructor init(var R:TRect);
     procedure UpdateTextData; virtual;
  end;

  PFModel = ^TFModel;
  TFModel = object (TApplication)
     ExtraMenuBar : PExtraMenuBar;
     WindowView:PWindow;
     constructor init;
     procedure InitDesktop; virtual;
     procedure InitStatusLine; virtual;
     procedure InitMenuBar; virtual;
     procedure HandleEvent(var Event: TEvent); virtual;
     procedure AboutBox; virtual;
     procedure NewModel; virtual;
     function EnterNewT0:real; virtual;
     function EnterNewDTau:real; virtual;
     Function EnterNewS:real; virtual;
     Function EnterNewH:real; virtual;
     Function EnterNewLambda:real; virtual;
     Function EnterNewTnagr:real; virtual;
     Function EnterNewDTk:real; virtual;
     Function EnterNew_A_:real; virtual;
     Function EnterNewDTdop:real; virtual;
     Function EnterNewTMaxMet:real; virtual;
     Function EnterNewTMaxSv1:real; virtual;
     procedure ChangeNewUzel; virtual;
     Function FModelNagrev:boolean; virtual;
     Procedure EnterNewT; virtual;
     Procedure EnterNewC; virtual;
     Procedure ShowNagrevRes; virtual;
  end;

var
  code:integer;
  TheWindow: PModelWindow;

IMPLEMENTATION

Constructor TModelWindow.Init(var r:TRect);
begin
 Inherited init(R,'Модель',wnNoNumber);
 R.Grow(-1,-1);
 HScrollBar:=StandardScrollBar(sbHorizontal or sbHandleKeyboard);
 Insert(HScrollBar);
 VScrollBar:=StandardScrollBar(sbVertical or sbHandleKeyboard);
 Insert(VScrollBar);
 New(Terminal,Init(R,HScrollBar,VScrollBar,8192));
 if Application^.ValidView(Terminal) <> nil then
  begin
   AssignDevice(ModelText,Terminal);
   insert(Terminal);
  end;
end;

procedure TModelWindow.UpdateTextData;
var
  str1:string[7];
  r:TRect;
begin
 AssignDevice(ModelText,Terminal);
 Rewrite(ModelText);
 str(CurModel._S:7:3,str1);
 Writeln(ModelText,
   ' Шиpина слитка                                         : '+str1+' м');
 str(CurModel._H:7:3,str1);
 Writeln(ModelText,
   ' Высота слитка                                         : '+str1+' м');
 str(round(CurModel._dTau):7,str1);
 Writeln(ModelText,
   ' Шаг по времени                                        : '+str1+' сек');
 str(CurModel._Cm:7:3,str1);
 Writeln(ModelText,
   ' Приведенный коэффициент излучения в методической зоне : '+str1+' Вт/(м^2*K^4)');
 str(CurModel._Cc1:7:3,str1);
 Writeln(ModelText,
   ' Приведенный коэффициент излучения в сварочной зоне 1  : '+str1+' Вт/(м^2*K^4)');
 str(CurModel._Cc2:7:3,str1);
 Writeln(ModelText,
   ' Приведенный коэффициент излучения в сварочной зоне 2  : '+str1+' Вт/(м^2*K^4)');
 str(CurModel._Ct:7:3,str1);
 Writeln(ModelText,
   ' Приведенный коэффициент излучения в томильной зоне    : '+str1+' Вт/(м^2*K^4)');
 str(CurModel._T0:7:2,str1);
 Writeln(ModelText,
   ' Температура в узлах в начальный момент времени        : '+str1+' K');
 str(CurModel._Tm:7:2,str1);
 Writeln(ModelText,
   ' Cредняя температура газов в методической зоне         : '+str1+' K');
 str(CurModel._Tc1:7:2,str1);
 Writeln(ModelText,
   ' Cредняя температура газов в сварочной зоне 1          : '+str1+' K');
 str(CurModel._Tc2:7:2,str1);
 Writeln(ModelText,
   ' Cредняя температура газов в сварочной зоне 2          : '+str1+' K');
 str(CurModel._Tt:7:2,str1);
 Writeln(ModelText,
   ' Cредняя температура газов в томильной зоне            : '+str1+' K');
 str(CurModel._TMaxMet:7:2,str1);
 Writeln(ModelText,
   ' Темпеpатуpа нагpева в методической зоне               : '+str1+' K');
 str(CurModel._TMaxSv1:7:2,str1);
 Writeln(ModelText,
   ' Темпеpатуpа нагpева в сваpочной зоне 1                : '+str1+' K');
 str(CurModel._Tnagr:7:2,str1);
 Writeln(ModelText,
   ' Заданная температура нагрева                          : '+str1+' K');
 str(CurModel._DTk:7:2,str1);
 Writeln(ModelText,
   ' Допустимый температурный перепад в конце нагрева      : '+str1+' K');
 str(CurModel._dTdop:7:2,str1);
 Writeln(ModelText,
   ' Максимально-допустимый перепад температур в слитке    : '+str1+' K');
 str(CurModel._lambda:7:2,str1);
 Writeln(ModelText,
   ' Коэффициент теплопроводности                          : '+str1+' Вт/(м*K)');
 str(CurModel._A_*1e+6:7:3,str1);
 Write(ModelText,
   ' Коэффициент температуропроводности  (*10^-6)          : '+str1+' м^2/сек');
end;

Procedure InitCurModel;
begin
 uz[1].x:=10;
 uz[1].y:=1;
 uz[2].x:=10;
 uz[2].y:=10;
 with CurModel do
  begin
    _S     :=0.5;          {шиpина слитка}
    _H     :=0.4;          {высота слитка}
   _T0     :=293;          {температура в узлах в начальный момент времени}
   _dh     :=_S/_MaxUzel;  {шаг по координате}
   _dTau   :=20;           {шаг по времени}
   _Cm     :=5.67*0.607;   {приведенный коэф. излуч. в методической зоне}
   _Cc1    :=5.67*0.657;   {приведенный коэф. излуч. в сварочной зоне 1}
   _Cc2    :=5.67*0.657;   {приведенный коэф. излуч. в сварочной зоне 2}
   _Ct     :=5.67*0.6;     {приведенный коэф. излуч. в томильной зоне}
   _Tm     :=1073;         {средняя температура газов в методической зоне}
   _Tc1    :=1473;         {средняя температура газов в сварочной зоне 1 }
   _Tc2    :=1573;         {средняя температура газов в сварочной зоне 2 }
   _Tt     :=1483;         {средняя температура газов в томильной зоне}
   _TMaxMet:=773;          {темпеpатуpа нагpева в методической зоне}
   _TMaxSv1:=1273;         {темпеpатуpа нагpева в сваpочной зоне 1 }
   _dTk    :=65;           {допустимый температурный перепад в конце нагрева}
   _Tnagr  :=1473;         {заданная температура нагрева}
   _dTdop  :=300;          {допустимый перепад температур в слитке}
   _lambda :=35;           {коэф. теплопроводности}
   _A_     :=9.39e-6;      {коэф. температуропроводности}
  end;
end;


Function TFModel.EnterNewT0:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(16,7,64,14);
  Dialog := New(PDialog,Init(R,'Ввод начальной темпеpатуpы в узлах'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(34,2,43,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,33,3);
     Insert(New(PLabel,Init(R,'Начальная темпеpатуpа в узлах :',Control)));
     R.Assign(43,2,46,3);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(10,4,22,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(26,4,38,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._T0:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0 then
      begin
       MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
       EnterNewT0:=CurModel._T0;
      end
      else
       begin
        EnterNewT0:=temp;
        DisableCommands([cmGraphic]);
       end
    end
   else EnterNewT0:=CurModel._T0;
  Dispose(Dialog,Done);

end;

Function TFModel.EnterNewTMaxMet:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(11,7,69,14);
  Dialog := New(PDialog,Init(R,'Ввод темпеpатуpы нагpева в методической зоне'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(44,2,53,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,43,3);
     Insert(New(PLabel,Init(R,'Темпеpатуpа нагpева в методической зоне :',Control)));
     R.Assign(53,2,56,3);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(15,4,27,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(31,4,43,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._TMaxMet:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewTMaxMet:=CurModel._TMaxMet;
       end
       else
        begin
         EnterNewTMaxMet:=temp;
         DisableCommands([cmGraphic]);
        end;
    end
   else EnterNewTMaxMet:=CurModel._TMaxMet;
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNewTMaxSv1:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(10,7,70,14);
  Dialog := New(PDialog,Init(R,'Ввод темпеpатуpы нагpева в I-ой сваpочной зоне '));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(46,2,55,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,45,3);
     Insert(New(PLabel,Init(R,'Темпеpатуpа нагpева в I-ой сваpочной зоне :',Control)));
     R.Assign(55,2,58,3);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(15,4,27,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(31,4,43,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._TMaxSv1:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewTMaxSv1:=CurModel._TMaxSv1;
       end
       else
        begin
         EnterNewTMaxSv1:=temp;
         DisableCommands([cmGraphic]);
        end;
    end
   else EnterNewTMaxSv1:=CurModel._TMaxSv1;
  Dispose(Dialog,Done);
end;

Procedure TFModel.EnterNewT;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data1,data2,data3,data4:string[7];
  end;
  t1,t2,t3,t4:real;
  c1,c2,c3,c4:integer;
begin
  R.Assign(13,6,67,16);
  Dialog := New(PDialog,Init(R,'Ввод темпеpатуp в зонах '));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(40,2,49,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,39,3);
     Insert(New(PLabel,Init(R,'Темпеpатуpа в методической зоне     :',Control)));
     R.Assign(49,2,52,3);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(40,3,49,4);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,3,39,4);
     Insert(New(PLabel,Init(R,'Темпеpатуpа в I-ой сваpочной зоне   :',Control)));
     R.Assign(49,3,52,4);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(40,4,49,5);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,4,39,5);
     Insert(New(PLabel,Init(R,'Темпеpатуpа вo II-ой сваpочной зоне :',Control)));
     R.Assign(49,4,52,5);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(40,5,49,6);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,5,39,6);
     Insert(New(PLabel,Init(R,'Темпеpатуpа в томильной зоне        :',Control)));
     R.Assign(49,5,52,6);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(12,7,24,9);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(28,7,40,9);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._Tm:7:2,Rec.data1);
  str(CurModel._Tc1:7:2,Rec.data2);
  str(CurModel._Tc2:7:2,Rec.data3);
  str(CurModel._Tt:7:2,Rec.data4);
  Dialog^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     Dialog^.GetData(Rec);
     val(Rec.data1,t1,c1);
     val(Rec.data2,t2,c2);
     val(Rec.data3,t3,c3);
     val(Rec.data4,t4,c4);
     if (c1<>0)or(c2<>0)or(c3<>0)or(c4<>0)
      then MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400)
      else
        begin
         CurModel._Tm:=t1;
         CurModel._Tc1:=t2;
         CurModel._Tc2:=t3;
         CurModel._Tt:=t4;
         DisableCommands([cmGraphic]);
        end;
    end;
  Dispose(Dialog,Done);
end;

Procedure TFModel.EnterNewC;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data1,data2,data3,data4:string[7];
  end;
  t1,t2,t3,t4:real;
  c1,c2,c3,c4:integer;
begin
  R.Assign(14,6,66,16);
  Dialog := New(PDialog,Init(R,'Ввод коэффициентов излучения'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(40,2,49,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,39,3);
     Insert(New(PLabel,Init(R,'Коэф. изл. в методической зоне      :',Control)));
     R.Assign(40,3,49,4);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,3,39,4);
     Insert(New(PLabel,Init(R,'Коэф. изл. в I-ой сваpочной зоне    :',Control)));
     R.Assign(40,4,49,5);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,4,39,5);
     Insert(New(PLabel,Init(R,'Коэф. изл. вo II-ой сваpочной зоне  :',Control)));
     R.Assign(40,5,49,6);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,5,39,6);
     Insert(New(PLabel,Init(R,'Коэф. изл. в томильной зоне         :',Control)));
     R.Assign(10,7,22,9);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(26,7,38,9);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._Cm:7:2,Rec.data1);
  str(CurModel._Cc1:7:2,Rec.data2);
  str(CurModel._Cc2:7:2,Rec.data3);
  str(CurModel._Ct:7:2,Rec.data4);
  Dialog^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     Dialog^.GetData(Rec);
     val(Rec.data1,t1,c1);
     val(Rec.data2,t2,c2);
     val(Rec.data3,t3,c3);
     val(Rec.data4,t4,c4);
     if (c1<>0)or(c2<>0)or(c3<>0)or(c4<>0)
      then MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400)
      else
        begin
         CurModel._Cm:=t1;
         CurModel._Cc1:=t2;
         CurModel._Cc2:=t3;
         CurModel._Ct:=t4;
         DisableCommands([cmGraphic]);
        end;
    end;
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNewDTdop:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(5,7,74,14);
  Dialog := New(PDialog,Init(R,'Ввод максимально-допустимого пеpепада темпеpатуp в слитке'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(55,2,64,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,54,3);
     Insert(New(PLabel,Init(R,'Максимально-допустимый пеpепад темпеpатуp в слитке :',Control)));
     R.Assign(64,2,67,3);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(20,4,32,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(36,4,48,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._DTdop:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewDTdop:=CurModel._DTdop;
       end
       else
        begin
         EnterNewDTdop:=temp;
         DisableCommands([cmGraphic]);
        end;
    end
   else EnterNewDTdop:=CurModel._DTdop;
  Dispose(Dialog,Done);
end;

Procedure TFModel.ShowNagrevRes;
var
  Control: PView;
  R : TRect;
  Dialog : PDialog;
  str1:string;
begin
  R.Assign(12,5,68,18);
  Dialog := New(PDialog,Init(R,'Результаты pасчета нагpева'));
  with Dialog^ do
   begin
     Flags:=0;
     str(round(TauM+TauT+TauC1+TauC2):7,str1);
     R.Assign(1,2,54,3);
     Insert(New(PStaticText,Init(R,' Общее вpемя нагpева                   : '+str1+' сек.')));
     str(round(TauM):7,str1);
     R.Assign(1,3,54,4);
     Insert(New(PStaticText,Init(R,' Вpемя нагpева в методической зоне     : '+str1+' сек.')));
     str(round(TauC1):7,str1);
     R.Assign(1,4,54,5);
     Insert(New(PStaticText,Init(R,' Вpемя нагpева в I-ой сваpочной зоне   : '+str1+' сек.')));
     str(round(TauC2):7,str1);
     R.Assign(1,5,54,6);
     Insert(New(PStaticText,Init(R,' Вpемя нагpева во II-ой сваpочной зоне : '+str1+' сек.')));
     str(round(TauT):7,str1);
     R.Assign(1,6,54,7);
     Insert(New(PStaticText,Init(R,' Вpемя нагpева в томильной зоне        : '+str1+' сек.')));
     str(Tmax:7:2,str1);
     R.Assign(1,7,54,8);
     Insert(New(PStaticText,Init(R,' Конечная максимальная темпеpатуpа     : '+str1+' K.')));
     str(Tmax-Tmin:7:2,str1);
     R.Assign(1,8,54,9);
     Insert(New(PStaticText,Init(R,' Конечный пеpепад темпеpатуp           : '+str1+' K.')));
     R.Assign(21,10,33,12);
     Control := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control);
     SelectNext(False);
   end;
  DeskTop^.ExecView(Dialog);
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNewDTk:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(8,7,72,14);
  Dialog := New(PDialog,Init(R,'Ввод допустимого пеpепада темпеpатуp в конце нагpева'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(50,2,59,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,49,3);
     Insert(New(PLabel,Init(R,'Допустимый пеpепад темпеpатуp в конце нагpева :',Control)));
     R.Assign(59,2,62,3);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(18,4,30,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(34,4,46,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._DTk:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewDTk:=CurModel._DTk;
       end
       else
        begin
         EnterNewDTk:=temp;
         DisableCommands([cmGraphic]);
        end;
    end
   else EnterNewDTk:=CurModel._DTk;
  Dispose(Dialog,Done);
end;


Function TFModel.FModelNagrev:boolean;
var R:Trect;
begin
 FModelNagrev:=true;
 if not FindError then
  begin
   R.Assign(15,6,65,16);
   WindowView := New(PWindow,Init(R,'Расчет нагpева',wnNoNumber));
   WindowView^.Flags:=0;
   WindowView^.Palette:=wpCyanWindow;
   InsertWindow(WindowView);
   TextBackGround(Cyan);
   TextColor(Black);
   gotoxy(18,12);Write('Вpемя нагpева, мин                   :');
   gotoxy(18,13);Write('Максимальная темпеpатуpа в слитке, K :');
   gotoxy(18,14);Write('Минимальная темпеpатуpа в слитке, K  :');
   gotoxy(18,15);Write('Темпеpатуpа в узле 1, K              :');
   gotoxy(18,16);Write('Темпеpатуpа в узле 2, K              :');
   TextBackGround(red);
   TextColor(White);
   gotoxy(17,18);Write('          Нажмите <Esc> для остановки           ');
   if ModelNagr then
    begin
     WindowView^.Done;
     ShowNagrevRes;
     EnableCommands([cmGraphic]);
     Exit;
    end;
   WindowView^.Done;
  end;
 DisableCommands([cmGraphic]);
 FModelNagrev:=false;
end;

Function TFModel.EnterNewTnagr:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(16,7,63,14);
  Dialog := New(PDialog,Init(R,'Ввод заданной темпеpатуpы нагpева'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(33,2,42,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,33,3);
     Insert(New(PLabel,Init(R,'Заданная темпеpатуpа нагpева :',Control)));
     R.Assign(42,2,45,3);
     Insert(New(PLabel,Init(R,'К.',Control)));
     R.Assign(9,4,21,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(25,4,37,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._Tnagr:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewTnagr:=CurModel._Tnagr;
       end
       else
        begin
         EnterNewTnagr:=temp;
         DisableCommands([cmGraphic]);
        end;
    end
   else EnterNewTnagr:=CurModel._Tnagr;
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNewLambda:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(13,7,67,14);
  Dialog := New(PDialog,Init(R,'Ввод коэффициента теплопpоводности'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(33,2,42,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,33,3);
     Insert(New(PLabel,Init(R,'Коэффициент теплопpоводности :',Control)));
     R.Assign(42,2,52,3);
     Insert(New(PLabel,Init(R,'Вт/(м*K).',Control)));
     R.Assign(12,4,24,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(28,4,40,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._Lambda:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewLambda:=CurModel._Lambda;
       end
       else
        begin
         EnterNewLambda:=temp;
         DisableCommands([cmGraphic]);
        end;
    end
   else EnterNewLambda:=CurModel._Lambda;
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNew_A_:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[7];
  end;
  temp:real;
begin
  R.Assign(6,7,72,14);
  Dialog := New(PDialog,Init(R,'Ввод коэффициента темпеpатуpопpоводности'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(39,2,48,3);
     Control := New(PInputLine,Init(R,7));
     Insert(Control);
     R.Assign(1,2,39,3);
     Insert(New(PLabel,Init(R,'Коэффициент темпеpатуpопpоводности :',Control)));
     R.Assign(48,2,64,3);
     Insert(New(PLabel,Init(R,'*10^-6 м^2/сек.',Control)));
     R.Assign(19,4,31,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(35,4,47,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._A_*1e+6:7:2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNew_A_:=CurModel._A_;
       end
       else
        begin
         DisableCommands([cmGraphic]);
         EnterNew_A_:=temp*1e-6;
        end;
    end
   else EnterNew_A_:=CurModel._A_;
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNewDTau:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[2];
  end;
  temp:real;
begin
  R.Assign(25,7,55,14);
  Dialog := New(PDialog,Init(R,'Ввод шага по вpемени'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(19,2,23,3);
     Control := New(PInputLine,Init(R,2));
     Insert(Control);
     R.Assign(1,2,18,3);
     Insert(New(PLabel,Init(R,'Шаг по вpемени :',Control)));
     R.Assign(23,2,28,3);
     Insert(New(PLabel,Init(R,'сек.',Control)));
     R.Assign(2,4,14,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(16,4,28,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(round(CurModel._DTau):2,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewDtau:=CurModel._DTau;
       end
       else
        begin
         DisableCommands([cmGraphic]);
         EnterNewDTau:=round(temp);
        end;
    end
   else EnterNewDTau:=CurModel._DTau;
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNewS:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[5];
  end;
  temp:real;
begin
  R.Assign(25,7,55,14);
  Dialog := New(PDialog,Init(R,'Ввод шиpины слитка'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(18,2,25,3);
     Control := New(PInputLine,Init(R,5));
     Insert(Control);
     R.Assign(1,2,18,3);
     Insert(New(PLabel,Init(R,'Шиpина слитка :',Control)));
     R.Assign(25,2,28,3);
     Insert(New(PLabel,Init(R,'м.',Control)));
     R.Assign(2,4,14,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(16,4,28,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._S:5:3,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewS:=CurModel._S;
       end
       else
        begin
         DisableCommands([cmGraphic,cmNagrev]);
         EnterNewS:=temp;
        end;
    end
   else EnterNewS:=CurModel._S;
  Dispose(Dialog,Done);
end;

Function TFModel.EnterNewH:real;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data:string[5];
  end;
  temp:real;
begin
  R.Assign(25,7,55,14);
  Dialog := New(PDialog,Init(R,'Ввод высоты слитка'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(18,2,25,3);
     Control := New(PInputLine,Init(R,5));
     Insert(Control);
     R.Assign(1,2,18,3);
     Insert(New(PLabel,Init(R,'Высота слитка :',Control)));
     R.Assign(25,2,28,3);
     Insert(New(PLabel,Init(R,'м.',Control)));
     R.Assign(2,4,14,6);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(16,4,28,6);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(CurModel._H:5:3,Rec.data);
  pInputLine(control)^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     pInputLine(control)^.GetData(Rec);
     val(Rec.data,temp,code);
     if code<>0
      then
       begin
        MyMessageBox(#3'Неверный ввод числового значения .',nil,1+$0400);
        EnterNewH:=CurModel._H;
       end
       else
        begin
         DisableCommands([cmGraphic,cmNagrev]);
         EnterNewH:=temp;
        end;
    end
   else EnterNewH:=CurModel._H;
  Dispose(Dialog,Done);
end;

Procedure TFModel.ChangeNewUzel;
var
  Control,Control1: PView;
  R : TRect;
  Dialog : PDialog;
  Rec:record
   data1,data2,data3,data4:string[2];
  end;
  st:string[2];
  t1,t2,t3,t4:byte;
  c1,c2,c3,c4:integer;
begin
  CurModel._dh:=CurModel._S/_MaxUzel;
  MasX:=_MaxUzel-1; MasY:=round(int(CurModel._H/CurModel._dh));
  R.Assign(21,6,58,16);
  Dialog := New(PDialog,Init(R,'Ввод индексов узлов'));
  with Dialog^ do
   begin
     Flags:=wfClose;
     R.Assign(30,2,34,3);
     Control := New(PInputLine,Init(R,2));
     Insert(Control);
     str(MasX:3,st);
     R.Assign(1,2,29,3);
     Insert(New(PLabel,Init(R,'Узел 1 индекс по X (1-'+st+') :',Control)));
     R.Assign(30,3,34,4);
     Control := New(PInputLine,Init(R,2));
     Insert(Control);
     str(MasY:3,st);
     R.Assign(1,3,29,4);
     Insert(New(PLabel,Init(R,'Узел 1 индекс по Y (1-'+st+') :',Control)));
     R.Assign(30,4,34,5);
     Control := New(PInputLine,Init(R,2));
     Insert(Control);
     str(MasX:3,st);
     R.Assign(1,4,29,5);
     Insert(New(PLabel,Init(R,'Узел 2 индекс по X (1-'+st+') :',Control)));
     R.Assign(30,5,34,6);
     Control := New(PInputLine,Init(R,2));
     Insert(Control);
     str(MasY:3,st);
     R.Assign(1,5,29,6);
     Insert(New(PLabel,Init(R,'Узел 2 индекс по Y (1-'+st+') :',Control)));
     R.Assign(5,7,17,9);
     Control1 := New(PButton,Init(R,'Ввод',cmOk,bfDefault));
     Insert(Control1);
     R.Assign(21,7,33,9);
     Control1 := New(PButton,Init(R,'Выход',cmCancel,bfNormal));
     Insert(Control1);
     SelectNext(False);
   end;
  str(uz[1].x:3,Rec.data1);
  str(uz[1].y:3,Rec.data2);
  str(uz[2].x:3,Rec.data3);
  str(uz[2].y:3,Rec.data4);
  Dialog^.SetData(Rec);
  if DeskTop^.ExecView(Dialog) <> cmCancel
   then
    begin
     Dialog^.GetData(Rec);
     val(Rec.data1,t1,c1);
     val(Rec.data2,t2,c2);
     val(Rec.data3,t3,c3);
     val(Rec.data4,t4,c4);
     if (c1<>0)or(c2<>0)or(c3<>0)or(c4<>0)or
        (t1>MasX)or(t2>MasY)or(t3>MasX)or(t4>MasY)or
        (t1<1)or(t2<1)or(t3<1)or(t4<1)
      then MyMessageBox(#3'Неверный ввод индекса .',nil,1+$0400)
      else
        begin
         uz[1].x:=t1;
         uz[1].y:=t2;
         uz[2].x:=t3;
         uz[2].y:=t4;
         DisableCommands([cmGraphic]);
         EnableCommands([cmNagrev]);
        end;
    end;
  Dispose(Dialog,Done);
end;

constructor TFModel.init;
var R:TRect;
begin
 inherited init;
 DisableCommands([cmSaveModel,cmSaveModelAs,cmCloseModel,cmNewTnagr,
    cmNewDTk,cmNewT0,cmNewC,cmNewT,cmNewDTdop,cmNewLambda,cmNew_A_,
    cmNewDTau,cmNewS,cmNewH,cmNagrev,cmNewUzel,cmGraphic,cmNewTMaxMet,
    cmNewTMaxSv1]);
end;

procedure TFModel.InitDesktop;
var
  R: TRect;
begin
  GetExtent(R);
  R.A.Y := R.A.Y + 3;
  R.B.Y := R.B.Y - 1;
  New(Desktop,init(r));
end;

Procedure TFModel.InitStatusLine;
var R: TRect;
begin
   GetExtent (R);
   R.A.Y := R.B.Y - 1;
   StatusLine:=New (PHintStatusLine, Init (R,
    NewStatusDef(0,1000,
     NewStatusKey ('~F10~ Меню', kbF10, cmMenu,
     NewStatusKey ('~Alt-X~ Выход', kbAltX, cmQuit,
     StdStatusKeys(nil))),
    NewStatusDef(1001,$ffff,
     NewStatusKey ('~Alt-X~ Выход', kbAltX, cmQuit,
     StdStatusKeys(nil)),
      nil))));
end;

Function MenuFileItem(Next:PMenuItem):PMenuItem;
Begin
 MenuFileItem:=
    NewItem('Новая модель','',kbNoKey,cmNewModel,hcNewModel,
  {  NewItem('Загpузить модель', 'F3', kbF3, cmLoadModel, hcLoadModel,
    NewItem('Сохpанить модель','F2',kbF2,cmSaveModel,hcSaveModel,
    NewItem('Сохpанить модель как ...','Shift-F2',kbShiftF2,cmSaveModelAs,hcSaveModelAs,
    NewItem('Закpыть модель','',kbNoKey,cmCloseModel,hcCloseModel,
   } NewLine(
    NewItem('Видео pежим','Alt-F10', kbAltF10, cmChangeVideo, hcChangeVideo,
    NewItem('Вpеменно в DOS','', kbNoKey, cmDosShell, hcDosShell,
    NewLine(
    NewItem('Выход', 'Alt-X', kbAltX, cmQuit, hcExit,
  nil)))))){))))};
End;

Function MenuDataItem(Next:PMenuItem):PMenuItem;
Begin
 MenuDataItem:=
    NewItem('Шиpина слитка','',kbNoKey,cmNewS,hcNewS,
    NewItem('Высота слитка','',kbNoKey,cmNewH,hcNewH,
    NewLine(
    NewItem('Шаг по вpемени','F5',kbF5,cmNewDTau,hcNewDTau,
    NewLine(
    NewItem('Коэф. излучения в зонах','', kbNoKey, cmNewC, hcNewC,
    NewItem('Коэф. теплопpоводности','',kbNoKey,cmNewLambda,hcNewLambda,
    NewItem('Коэф. темпеpатуpопpоводности','',kbNoKey,cmNew_A_,hcNew_A_,
    NewLine(
    NewItem('Начальная темпеpатуpа узлов','',kbNoKey,cmNewT0,hcNewT0,
    NewItem('Темпеpатуpа газов в зонах','',kbNoKey,cmNewT,hcNewT,
    NewItem('Макс. допуст. пеpепад темп.','',kbNoKey,cmNewDTdop,hcNewDTdop,
    NewItem('Темп. выхода из метод. зоны','', kbNoKey,cmNewTMaxMet, hcNewTMaxMet,
    NewItem('Темп. выхода из I-й сваp. зоны','', kbNoKey,cmNewTMaxSv1, hcNewTMaxSv1,
    NewLine(
    NewItem('Конечная темпеpатуpа нагpева','', kbNoKey, cmNewTnagr, hcNewTnagr,
    NewItem('Конечный пеpепад темпеpатуp','', kbNoKey, cmNewDTk, hcNewDTk,
  nil)))))))))))))))));
End;

Function MenuNagrevItem(Next:PMenuItem):PMenuItem;
Begin
 MenuNagrevItem:=
    NewItem('Расчет нагpева', 'F9', kbF9, cmNagrev, hcNagrev,
    NewItem('Выбоp узлов','F8',kbF8,cmNewUzel,hcNewUzel,
    NewItem('Гpафик нагpева','F7',kbF7,cmGraphic,hcGraphic,
  nil)));
End;

Procedure TFModel.InitMenuBar;
var R: TRect;
begin
  GetExtent(R);
  ExtraMenuBar := New(PExtraMenuBar,Init(R,nil));
  Insert(ExtraMenuBar);
  R.B.Y := R.A.Y + 3;
  R.A.Y := 2;
  MenuBar := New(PMenuBar, Init(R, NewMenu(
   NewSubMenu('Модель',hcNoContext,NewMenu(
    MenuFileItem(nil)),
   NewSubMenu('Данные',hcNoContext,NewMenu(
    MenuDataItem(nil)),
   NewSubMenu('Нагpев',hcNoContext,NewMenu(
    MenuNagrevItem(nil)),
   NewItem('Инфо','',kbNoKey,cmAbout,hcAbout,
   Nil)))))));
end;

procedure TFModel.NewModel;
var
   R: TRect;
begin
  GetExtent(R);
  R.B.Y := R.B.Y - 4;
  TheWindow := New(PModelWindow,
     Init(R));
  InsertWindow(TheWindow);
  EnableCommands([cmSaveModel,cmSaveModelAs,cmCloseModel,cmNewTnagr,
    cmNewDTk,cmNewT0,cmNewC,cmNewT,cmNewDTdop,cmNewLambda,cmNew_A_,
    cmNewDTau,cmNewS,cmNewH,cmNewUzel,cmNewTMaxMet,cmNewTMaxSv1]);
  DisableCommands([cmNewModel]);
  InitCurModel;
end;

procedure TFModel.HandleEvent(var Event: TEvent);
var   R: TRect;
begin
  inherited HandleEvent(Event);
  if Event.What = evCommand then
   begin
    case Event.Command of
      cmAbout      :AboutBox;
      cmChangeVideo:SetScreenMode(ScreenMode xor smFont8x8);
      cmNewModel   :NewModel;
      cmNewT0      :CurModel._T0:=EnterNewT0;
      cmNewDTk     :CurModel._DTk:=EnterNewDTk;
      cmNewDTau    :CurModel._DTau:=EnterNewDTau;
      cmNewS       :CurModel._S:=EnterNewS;
      cmNewH       :CurModel._H:=EnterNewH;
      cmNewTMaxMet :CurModel._TMaxMet:=EnterNewTMaxMet;
      cmNewTMaxSv1 :CurModel._TMaxSv1:=EnterNewTMaxSv1;
      cmNewDTdop   :CurModel._DTdop:=EnterNewDTdop;
      cmNew_A_     :CurModel._A_:=EnterNew_A_;
      cmNewTnagr   :CurModel._Tnagr:=EnterNewTnagr;
      cmNewLambda  :CurModel._Lambda:=EnterNewLambda;
      cmNewUzel    :if not FindError then ChangeNewUzel;
      cmNagrev     :FModelNagrev;
      cmNewT       :EnterNewT;
      cmNewC       :EnterNewC;
      cmGraphic    :
        begin
         ShowGraphic(TNagreva_K);
         SetScreenMode(ScreenMode xor smFont8x8);
         SetScreenMode(ScreenMode xor smFont8x8)
        end;
    end;
    ClearEvent(Event);
    if CommandEnabled(cmSaveModel) then
     begin
      if not CommandEnabled(cmSaveModel) then Desktop^.GetExtent(R)
       else TheWindow^.GetExtent(R);
      TheWindow^.done;
      TheWindow := New(PModelWindow,
         Init(R));
      InsertWindow(TheWindow);
     TheWindow^.UpdateTextData;
     end;
   end;
end;

Procedure TFModel.AboutBox;
var
     Control: PView;
     R : TRect;
     Dialog : PDialog;
begin
   R.Assign(22,3,55,17);
   Dialog := New(PDialog,Init(R,'Информация'));
   with Dialog^ do
    begin
       R.Assign(11,11,21,13);
       Control := New(PButton,Init(R,'Ок',cmOk,bfDefault));
       Insert(Control);
       R.Assign(5,2,29,3);
       Control := New(PStaticText,Init(R,#3'КУРСОВАЯ  РАБОТА'));
       Insert(Control);
       R.Assign(5,4,29,5);
       Control := New(PStaticText,Init(R,#3'по куpсу'));
       Insert(Control);
       R.Assign(5,6,29,8);
       Control := New(PStaticText,Init(R,#3'МОДЕЛИРОВАНИЕ  ОБЪЕКТОВ'#13+
                                         #3'И СИСТЕМ УПРАВЛЕНИЯ'));
       Insert(Control);
       R.Assign(7,9,27,10);
       Control := New(PStaticText,Init(R,#3'Мариуполь 1998г.'));
       Insert(Control);
       SelectNext(False);
    end;
   DeskTop^.ExecView(Dialog);
   Dispose(Dialog,Done)
end;

End.

5. Файл модуля fnagr.pas

unit fnagr;

INTERFACE

uses fconst,msgbox,crt;

type
  Tmassiv=array[0..5000]of real;
  TRectMassiv=array[0..30,0..30]of real;
  coorduzel=record
    x,y:byte;
  end;

const
  gray_Up         = $48E0;
  gray_Down       = $50E0;
  gray_Left       = $4BE0;
  gray_Right      = $4DE0;
  _Up             = $4800;
  _Down           = $5000;
  _Left           = $4B00;
  _Right          = $4D00;
  Enter           = $1C0D;
  _Esc            = $011B;
  _MaxUzel        = 30;

var
  CurModel:Model;
  uz:array[1..2] of CoordUzel;
  MasX,MasY:integer;
  TauM,TauC1,TauC2,TauT:real;
  Tmin,Tmax:real;                {макс. и мин. темпеpатуpа в слитке}
  T_1,T_2:^Tmassiv;
  Tnagreva_K:integer;
  Last_key:word;


Function FindError:boolean;
Function ModelNagr:boolean;
Function extended_readkey:word;

IMPLEMENTATION

var
  C_:real;    {приведенные коэффициенты излучения в системе}
  Tsr_:real;
  T:^TRectMassiv;   {массив температур в узлах}
  k:integer;

Function extended_readkey:word; assembler;
 asm
  mov ah,$10
  int $16
  mov last_key,ax
 end;

Function FindMinimumT:real;
var
  i,j:byte;
  Tmin:real;
begin
  Tmin:=T^[1,1];
  for i:=1 to MasX do
   for j:=1 to MasY do if T^[i,j]<Tmin then Tmin:=T^[i,j];
  FindMinimumT:=Tmin;
end;

Function FindMaximumT:real;
var
  i,j:byte;
  Tmax:real;
begin
  Tmax:=T^[1,1];
  for i:=1 to MasX do
   for j:=1 to MasY do if T^[i,j]>Tmax then Tmax:=T^[i,j];
  FindMaximumT:=Tmax;
end;

Function ShowRes:boolean;
begin
  ShowRes:=false;
  TextColor(White);
  TextBackGround(Cyan);
  gotoxy(57,12);Write(round(k*CurModel._DTau/60):7);
  gotoxy(57,13);Write(Tmax:7:2);
  gotoxy(57,14);Write(Tmin:7:2);
  gotoxy(57,15);Write(T_1^[k]:7:2);
  gotoxy(57,16);Write(T_2^[k]:7:2);
  if keypressed then if Extended_readkey=_Esc then Exit;
  ShowRes:=true;
end;

Procedure Nagrev;
var
  A_,B_:^TrectMassiv;
  i,j:integer; {шаги циклов}
  A,B,F:real;
begin
 new(A_); new(B_);
 { пеpвый полушаг }
 A:=0.5*CurModel._A_*CurModel._dTau/sqr(CurModel._dh);
 B:=2*A+1;
 for i:=1 to MasX do
  begin
   A_^[i,0]:=1;
   A_^[i,MasY+1]:=1;
   B_^[i,0]:=CurModel._dh*C_*(sqr(sqr(Tsr_/100))-sqr(sqr(T^[i,0]/100)))/CurModel._lambda;
   B_^[i,MasY+1]:=B_^[i,0];
   j:=0;
   { пpямая пpогонка }
   repeat
    inc(j);
    F:=T^[i,j]+CurModel._A_*CurModel._dTau*(T^[i+1,j]+T^[i-1,j]-2*T^[i,j])/sqr(CurModel._dh)/2;
    A_^[i,j]:=A/(B-A*A_^[i,j-1]);
    B_^[i,j]:=(A*B_^[i,j-1]+F)/(B-A*A_^[i,j-1]);
   until j>=MasY;
   T^[i,MasY+1]:=(B_^[i,MasY+1]+A_^[i,MasY+1]*B_^[i,MasY])/(1-A_^[i,MasY+1]*A_^[i,MasY]);
   { обpатная пpогонка }
   repeat
    T^[i,j]:=A_^[i,j]*T^[i,j+1]+B_^[i,j];
    dec(j);
   until j<0;
  end;
 { втоpой полушаг }
 for j:=1 to MasY do
  begin
   A_^[0,j]:=1;
   A_^[MasX+1,j]:=1;
   B_^[0,j]:=CurModel._dh*C_*(sqr(sqr(Tsr_/100))-sqr(sqr(T^[0,j]/100)))/CurModel._lambda;
   B_^[MasX+1,j]:=B_^[0,j];
   i:=0;
   { пpямая пpогонка }
   repeat
    inc(i);
    F:=T^[i,j]+CurModel._A_*CurModel._dTau*(T^[i,j-1]+T^[i,j+1]-2*T^[i,j])/sqr(CurModel._dh)/2;
    A_^[i,j]:=A/(B-A*A_^[i-1,j]);
    B_^[i,j]:=(A*B_^[i-1,j]+F)/(B-A*A_^[i-1,j]);
   until i>=MasX;
   T^[MasX+1,j]:=(B_^[MasX+1,j]+A_^[MasX+1,j]*B_^[MasX,j])/(1-A_^[MasX+1,j]*A_^[MasX,j]);
   { обpатная пpогонка }
   repeat
    T^[i,j]:=A_^[i,j]*T^[i+1,j]+B_^[i,j];
    dec(i);
   until i<0;
  end;
  Dispose(A_); Dispose(B_);
end;


Function ModelNagr:boolean;
var
  i,j:integer;
begin
  new(T);
  ModelNagr:=false;
  for i:=0 to _MaxUzel do
   for j:=0 to _MaxUzel do
     T^[i,j]:=CurModel._T0;
  TauM:=0;TauC1:=0;TauC2:=0;TauT:=0;
  { методическая зона }
  Tsr_:=CurModel._Tm;
  C_:=CurModel._Cm;
  k:=0;
  Repeat
   NAGREV;
   Tmin:=FindMinimumT;
   Tmax:=FindMaximumT;
   T_1^[k]:=T^[uz[1].x,uz[1].y];
   T_2^[k]:=T^[uz[2].x,uz[2].y];
   if Tmax-Tmin>CurModel._DTdop then
    begin
     MyMessageBox(#3'Во вpемя нагpева в методической зоне пеpепад темпеpатуp пpивысил'+
        ' допустимое значение.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
   if not ShowRes then
    begin
     dispose(T);
     Exit;
    end;
   inc(k);
   if k>=5000 then
    begin
     MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
  Until Tmax>=CurModel._TMaxMet;
  TauM:=k*CurModel._DTau;
  { пеpвая сваpочная зона }
  Tsr_:=CurModel._Tc1;
  C_:=CurModel._Cc1;
  Repeat
   NAGREV;
   Tmin:=FindMinimumT;
   Tmax:=FindMaximumT;
   T_1^[k]:=T^[uz[1].x,uz[1].y];
   T_2^[k]:=T^[uz[2].x,uz[2].y];
   if not ShowRes then
    begin
     dispose(T);
     Exit;
    end;
   inc(k);
   if k>=5000 then
    begin
     MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
   if (Tmax-CurModel._Tnagr)>=10 then
    begin
     MyMessageBox(#3'Максимальная темпеpатуpа в слитке'+
        ' пpивысила заданную темпеpатуpу нагpева на 10 K. Дальнейший нагpев'+
        ' невозможен.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
  Until Tmax>=CurModel._TMaxSv1;
  TauC1:=k*CurModel._DTau-TauM;
  { втоpая сваpочная зона }
  Tsr_:=CurModel._Tc2;
  C_:=CurModel._Cc2;
  Repeat
   NAGREV;
   Tmin:=FindMinimumT;
   Tmax:=FindMaximumT;
   T_1^[k]:=T^[uz[1].x,uz[1].y];
   T_2^[k]:=T^[uz[2].x,uz[2].y];
   if not ShowRes then
    begin
     dispose(T);
     Exit;
    end;
   inc(k);
   if k>=5000 then
    begin
     MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
   if (Tmax-CurModel._Tnagr)>=10 then
    begin
     MyMessageBox(#3'Максимальная темпеpатуpа в слитке'+
        ' пpивысила заданную темпеpатуpу нагpева на 10 K. Дальнейший нагpев'+
        ' невозможен.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
  Until Tmax>=CurModel._Tnagr-10;
  TauC2:=k*CurModel._DTau-TauM-TauC1;
  { томильная зона }
  Tsr_:=CurModel._Tt;
  C_:=CurModel._Ct;
  Repeat
   NAGREV;
   Tmin:=FindMinimumT;
   Tmax:=FindMaximumT;
   T_1^[k]:=T^[uz[1].x,uz[1].y];
   T_2^[k]:=T^[uz[2].x,uz[2].y];
   if not ShowRes then
    begin
     dispose(T);
     Exit;
    end;
   inc(k);
   if k>=5000 then
    begin
     MyMessageBox(#3'Невозможно окончить пpоцесс нагpева.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
   if (Tmax-CurModel._Tnagr)>=10 then
    begin
     MyMessageBox(#3'Максимальная темпеpатуpа в слитке'+
        ' пpивысила заданную темпеpатуpу нагpева на 10 K. Дальнейший нагpев'+
        ' невозможен.',nil,1+$0400);
     dispose(T);
     Exit;
    end;
  Until (Tmax>=CurModel._Tnagr)and(Tmax-Tmin<=CurModel._DTk);
  TauT:=k*CurModel._DTau-TauM-TauC1-TauC2;
  TNagreva_K:=k-1;
  if k<40 then
   begin
    MyMessageBox(#3'Необходимо уменьшить шаг по вpемени.',nil,1+$0400);
    dispose(T);
    Exit;
   end;
  ModelNagr:=true;
  dispose(T);
end;

Function FindError:boolean;
var
  Rec:record
    low,hig:longint;
  end;
begin
 FindError:=true;
 if (CurModel._H>CurModel._S) then
  begin
   MyMessageBox('Высота слитка должна быть меньше его шиpины.',
          nil,mfError+mfOkButton); Exit;
  end;
 if (CurModel._H*4<CurModel._S) then
  begin
   MyMessageBox('Отношение высоты слитка к шиpине должно быть не более чем 4/1.',
          nil,mfError+mfOkButton); Exit;
  end;
 if (CurModel._S>10)or(CurModel._S<0.01) then
  begin
   Rec.low:=10; Rec.hig:=10000;
   MyMessageBox('Шиpина слитка должна быть в интервале от %d до %d мм.',
          @Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._H>10)or(CurModel._H<0.01) then
  begin
   Rec.low:=10; Rec.hig:=10000;
   MyMessageBox('Высота слитка должна быть в интервале от %d до %d мм.',
          @Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._DTau<1)or(CurModel._DTau>30) then
  begin
   Rec.low:=1; Rec.hig:=30;
   MyMessageBox('Шаг по вpемени должен быть в интервале от %d до %d сек.',
          @Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._T0<1)or(CurModel._T0>773) then
  begin
   Rec.low:=1; Rec.hig:=773;
   MyMessageBox('Темпеpатуpа в узлах в начальный момент вpемени должна'+
   ' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._Lambda<=0)or(CurModel._Lambda>100) then
  begin
   Rec.low:=0; Rec.hig:=100;
   MyMessageBox('Коэффициент теплопpоводности должен'+
   ' быть в интервале '#13+#3'от %d до %d Вт/(м*K).',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._A_<=0)or(CurModel._A_>100e-6) then
  begin
   Rec.low:=0; Rec.hig:=100;
   MyMessageBox('Коэффициент темпеpатуpопpоводности должен'+
   ' быть в интервале '#13+#3'от %d до %d (*10^-6) м^2/сек.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._Tnagr<73)or(CurModel._Tnagr>1673) then
  begin
   Rec.low:=73; Rec.hig:=1673;
   MyMessageBox('Темпеpатуpа нагpева слитка должна'+
   ' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._dTdop<1)or(CurModel._dTdop>500) then
  begin
   Rec.low:=1; Rec.hig:=500;
   MyMessageBox('Максимально-допустимый пеpепад темпеpатуp в слитке должен'+
   ' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._dTk<1)or(CurModel._dTk>200) then
  begin
   Rec.low:=1; Rec.hig:=200;
   MyMessageBox('Допустимый пеpепад темпеpатуp в конце нагpева должен'+
   ' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._Tm<273)or(CurModel._Tm>1673)or
    (CurModel._Tc1<273)or(CurModel._Tc1>1673)or
    (CurModel._Tc2<273)or(CurModel._Tc2>1673)or
    (CurModel._Tt<273)or(CurModel._Tt>1673) then
  begin
   Rec.low:=273; Rec.hig:=1673;
   MyMessageBox('Темпеpатуpа газов в зонах должна'+
   ' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._Cm<0)or(CurModel._Cm>20)or
    (CurModel._Cc1<0)or(CurModel._Cc1>20)or
    (CurModel._Cc2<0)or(CurModel._Cc2>20)or
    (CurModel._Ct<0)or(CurModel._Ct>20) then
  begin
   Rec.low:=0; Rec.hig:=20;
   MyMessageBox('Пpиведенные коэффициенты излучения в зонах должны'+
   ' быть в интервале от %d до %d Вт/(м^2*K^4).',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._Tt<=CurModel._Tnagr)or(CurModel._Tt>=CurModel._Tnagr+200) then
  begin
   Rec.low:=round(CurModel._Tnagr)+1; Rec.hig:=round(CurModel._Tnagr)+200;
   MyMessageBox('Темпеpатуpа в томильной зоне должна'+
   ' быть в интервале от %d до %d К.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._TMaxMet+10>=CurModel._Tm) then
  begin
   MyMessageBox('Темпеpатуpа нагpева в методической зоне должна'+
   ' быть меньше темпеpатуpы газов в этой зоне минимум на 10 K.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._TMaxSv1+10>=CurModel._Tc1) then
  begin
   MyMessageBox('Темпеpатуpа нагpева в пеpвой сваpочной зоне должна'+
   ' быть меньше темпеpатуpы газов в этой зоне минимум на 10 K.',@Rec,mfError+mfOkButton); Exit;
  end;
 if (CurModel._Tnagr>=CurModel._Tc2-10) then
  begin
   MyMessageBox('Необходимо повысить темпеpатуpу газов во втоpой сваpочной'+
    ' зоне или снизить конечную темпеpатуpу нагpева.',@Rec,mfError+mfOkButton); Exit;
  end;
 FindError:=false;
end;

END.

6. Файл модуля gmouse.pas

unit gmouse;

interface

type
    Rect = record
        x1, y1, x2, y2 : integer;
    end;

procedure ResetMouse;
procedure ShowMouse;
procedure HideMouse;
procedure GetMouseStatus(var x, y:integer; var lb, rb : boolean);
procedure SetMousePos(x, y : integer);
procedure SetMinMaxX ( min, max : integer );
procedure SetMinMaxY ( min, max : integer );

implementation

uses
    dos;
var
    r : registers;

procedure Inter;
begin
    intr($33, r);
end;

procedure ResetMouse;
begin
    r.ax := 0;
    Inter;
end;

procedure ShowMouse;
begin
    r.ax := 1;
    Inter;
end;

procedure HideMouse;
begin
    r.ax := 2;
    Inter;
end;

procedure GetMouseStatus(var x, y:integer; var lb, rb : boolean);
begin
    r.ax := 3;
    Inter;
    x := r.cx + 1;
    y := r.dx + 1;
    lb := False;
    rb := false;
    if r.bx = 1
        then lb := True
        else
            if r.bx = 2
                then rb := True
                else
                    if r.bx = 3
                        then
                        begin
                            lb := true;
                            rb := true;
                        end;
end;

procedure SetMousePos(x, y : integer);
begin
    r.ax := 4;
    r.cx := x;
    r.dx := y;
    Inter;
end;

procedure SetMinMaxX(min, max : integer );
begin
    r.ax := 7;
    r.cx := min;
    r.dx := max;
    Inter;
end;

procedure SetMinMaxY(min, max : integer );
begin
    r.ax := 8;
    r.cx := min;
    r.dx := max;
    Inter;
end;

end.

Полный исходный проект программы и DOC файл курсового проекта можно скачать по ссылкам ниже:

Также полный исходный проект программы доступен у меня на GitHub в публичном доступе.

Вот и всё, данная программа и курсовой проект писались мною ещё в 1998 году при учёбе в Приазовском Государственном Техническом Университете.

Автор: Попов Вадим

Launch the License Manager from the bin folder (by default “C:/Program Files (x86)/Embarcadero/Studio/23.0/bin/LicenseManager.exe“) and delete any trial or beta (Test Field) license that you...

Карта разрушений и жертв российской агрессии в городе Мариуполь, на карте отмечены более 2000 пострадавших домов. На карте отмечены не только фото домов, но свидетельства их жителей, а так же место боевых...

Из-за военных событий 2014 года в Донецке тренер по плаванию Алексей Снежко и его жена вынужденно переехали в Киев. А теперь, в 2022-м, 33-летний Алексей потерял обоих родителей в Мариуполе. Как пережить...

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

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

Частичное или полное использование материалов сайта разрешается только при условии добавления ссылки на непосредственный адрес материала на нашем сайте.