3.3. Расчет параметров и построение паспорта прочности несущей способности тюбинговых обделок вертикальных стволов метрополитенов.
Параметры паспорта несущей способности тюбинговой обделки, т.е. координаты точек пересечения линий с осями и , определяются по формулам:
1. Железобетонная тюбинговая обделка:
линия 1 - условие прочности по сжимающим напряжениям в ребре тюбинга:
;
;
линия 2 - условие прочности по растягивающим напряжениям в ребре тюбинга:
;
;
линия 3 - условие положительности нагрузок:
;
линия 4 - условие прочности по сжимающим напряжениям в спинке тюбинга:
;
;
линия 5 - условие прочности по растягивающим напряжениям в спинке тюбинга:
;
;
2. Чугунная тюбинговая обделка:
линия 1 - условие прочности по сжимающим напряжениям в ребре тюбинга:
;
;
линия 2 - условие прочности по растягивающим напряжениям в ребре тюбинга:
;
;
линия 3 - условие положительности нагрузок:
;
линия 4 - условие прочности по сжимающим напряжениям в спинке тюбинга:
;
;
линия 5 - условие прочности по растягивающим напряжениям в спинке тюбинга:
;
;
Примечание: при построении паспортов прочности тюбинговых обделок можно использовать программу для ЭВМ, приведенную в приложении 1.
При несущую способность железобетонных обделок конструкции ВНИИМШС, марка бетона 400 для стволов диаметром 4.5 - 8.0 м можно определить по паспортам прочности приведенным на листах 3 и 4.
При несущую способность чугунных тюбинговых обделок конструкции Шахтспецстрой, чугун марки СЧ 12-28 для стволов диаметром 6.0 - 7.0 м можно определить по паспортам прочности приведенным на листе 4.
3.4. Проверка устойчивости тюбинговых обделок вертикальных стволов метрополитенов.
Проверку устойчивости обделки вертикальных стволов метрополитенов, т.е. способности сопротивляться выпучиванию в сторону ствола, производится исходя из условия:
;
где - коэффициент формы упругой линии кольца обделки при потере устойчивости; расчетное критическое давление находится как наименьшее значение функции .
4. Приложения
4.1. Программа для проверки несущей способности и построения паспорта прочности тюбинговых обделок вертикальных стволов метрополитенов.
unit Calc1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, DBTables, DB, DBFilter, Grids, DBGrids, StdCtrls,
RXLookup, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
rxDBLookupCombo1: TrxDBLookupCombo;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
DBGrid1: TDBGrid;
Label4: TLabel;
TableSTUFF: TTable;
DataSourceSTUFF: TDataSource;
rxDBFilter1: TrxDBFilter;
DataSourceDATA: TDataSource;
TableDATA: TTable;
TableDATAR: TFloatField;
TableDATAMass: TFloatField;
TableDATAR_press: TFloatField;
TableDATAR_stretch: TFloatField;
TableDATAPuasson: TFloatField;
TableDATAR1: TFloatField;
TableDATARb: TFloatField;
TableDATAA: TFloatField;
TableDATAB: TFloatField;
TableDATAStuff: TSmallintField;
BitBtn1: TBitBtn;
RadioGroup1: TRadioGroup;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
procedure rxDBLookupCombo1Change(Sender: TObject);
procedure DBGrid1DblClick(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Draw;
{$R *.DFM}
procedure TForm1.rxDBLookupCombo1Change(Sender: TObject);
var
S: String;
begin
rxDBFilter1.Deactivate;
rxDBFilter1.Filter.Clear;
s:='Stuff = '+TableSTUFF.FieldByName('Code').AsString;
rxDBFilter1.Filter.Add(S);
rxDBFilter1.Activate;
end;
procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
Mass, R_press, R_stretch, Puasson, PuassonP, R1, Rb, R, A, B: Double;
P0, P2: Double;
C1, C2: Double;
K0, K1, K2, K3, K4: Double;
L, L1: Double;
ALFA1, ALFA2: Double;
BETA, BETA1, BETA2: Double;
DELTA1, DELTA2: Double;
GAMMA1, GAMMA2: Double;
D1, D2: Double;
F: Double;
SIGMARS, SIGMARR, SIGMASS, SIGMASR: Double;
i: Integer;
Pkr, PkrOld: Double;
Eo, Ep, J: Double;
procedure Calc;
begin
C1 := R1/Rb;
C2 := R/R1;
F := (C2*C2-1)/(C1*C1-1)*(C2*C2-1)/(C1*C1-1)*
(C2*C2-1)/(C1*C1-1)*(1+B/A);
D2 := (C2*C2+1)*(C2*C2+1)*(C2*C2+1)/(Puasson+1);
D1 := (C1*C1-1)*(C1*C1-1)/(Puasson+1);
DELTA2 := C2*C2*(C2*C2+1);
DELTA1 := C2*C2*(3-C2*C2);
GAMMA2 := C2*C2*(2*C2*C2*C2*C2+C2*C2+1);
GAMMA1 := C2*C2*(3+C2*C2);
BETA := (3+R/Rb*R/Rb)/(3-R/Rb*R/Rb);
BETA2 := C2*C2*C2*C2*(C2*C2+1)-D2+F*(C1*C1+1+D1);
BETA1 := 3*C2*C2-1-D2+F*((3-C2*C2)*C1*C1*C1*C1+D1);
ALFA2 := C2*C2*(2+C2*C2+C2*C2*C2*C2)-
D2+F*(2*C1*C1*C1*C1+C1*C1+1+D1);
ALFA1 := 3*C2*C2+1+D2+F*((C1*C1+3)*C1*C1*C1*C1-D1);
K4 := (ALFA2*DELTA1-ALFA1*DELTA2)/(ALFA2*BETA1-ALFA1*BETA2);
K3 := (ALFA1*GAMMA2-ALFA2*GAMMA1)/(ALFA2*BETA1-ALFA1*BETA2);
K2 := (BETA2*DELTA1-BETA1*DELTA2)/(ALFA2*BETA1-ALFA1*BETA2);
K1 := (BETA1*GAMMA2-BETA2*GAMMA1)/(ALFA2*BETA1-ALFA1*BETA2);
L1 := 4*C2*C2*(C2*C2+1-BETA)-(K1+BETA*K2)*((C1*C1+1)*(C1*C1+1)
+4*C2*C2)+2*(K3+BETA*K4)*((C2*C2+1)*(C2*C2+1)-2);
L := (K1+BETA*K2)*(C1*C1+1)-(K3+BETA*K4);
K0 := 3*C2*C2/((1+B/A)*(C2*C2-1)/(C1*C1-1)*(2+C1*C1)+2*C2*C2+1);
end;
begin
with TableDATA do begin
Mass := FieldByName('Mass').AsFloat;
R_press := FieldByName('R_press').AsFloat;
R_stretch := FieldByName('R_stretch').AsFloat;
Puasson := FieldByName('Puasson').AsFloat;
R1 := FieldByName('R1').AsFloat;
Rb := FieldByName('Rb').AsFloat;
R := FieldByName('R').AsFloat;
A := FieldByName('A').AsFloat;
B := FieldByName('B').AsFloat;
end;
if RadioButton1.Checked then begin
Calc;
if TableDATA.FieldByName('Stuff').AsInteger = 0 {Железо-бетон} then begin
PLines[isP0,1] := (C1*C1-1)*Mass*R_press/2*C1*C1*K0*(1+B/A);
PLines[isP2,1] := (C1*C1-1)*(C1*C1-1)*
Mass*R_press/4*C1*C1*K0*(1+B/A);
PLines[isP0,2] := -(C1*C1-1)*Mass*R_stretch/2*C1*C1*K0*(1+B/A);
PLines[isP2,2] := (C1*C1-1)*(C1*C1-1)*
Mass*R_stretch/4*C1*C1*K0*(1+B/A);
PLines[isP0,4] := (C2*C2-1)*Mass*R_press/(2*C2*C2-K0*
(C2*C2+1));
PLines[isP2,4] := (C2*C2-1)*(C2*C2-1)*Mass*R_press/L1;
PLines[isP0,5] := -(C2*C2-1)*
Mass*R_stretch/(2*C2*C2-K0*(C2*C2+1));
PLines[isP2,5] := (C2*C2-1)*(C2*C2-1)*Mass*R_stretch/L1;
end
else begin {Чугун}
PLines[isP0,1] := (C1*C1-1)*Mass*R_press/2*C1*K0*(1+B/A);
PLines[isP2,1] := (C2*C2-1)*(C2*C2-1)*
Mass*R_press/4*C1*C1*K0*(1+B/A);
PLines[isP0,2] := -(C2*C2-1)*Mass*R_stretch/2*C1*K0*(1+B/A);
PLines[isP2,2] := (C1*C1-1)*(C1*C1-1)*
Mass*R_stretch/4*C1*C1*K0*(1+B/A);
PLines[isP0,4] := (C2*C2-1)*Mass*R_press/(2*C2*C2-K0*
(C2*C2+1));
PLines[isP2,4] := (C2*C2-1)*(C2*C2-1)*Mass*R_press/L1;
PLines[isP0,5] := -(C2*C2-1)*Mass*R_stretch/(2*C2*C2-K0*
(C2*C2+1));
PLines[isP2,5] := (C2*C2-1)*(C2*C2-1)*Mass*R_stretch/L1;
end;
DrawForm.ShowModal;
end
else if RadioButton2.Checked then begin
Calc;
P0 := StrToFloat(Edit1.Text);
P2 := StrToFloat(Edit2.Text);
SIGMARS := ABS(2*C1*C1/(C1*C1-1)*(1+B/A)*(P0*K0+2*P2*L/
(C1*C1-1)));
SIGMARR := ABS(2*C1*C1/(C1*C1-1)*(1+B/A)*(P0*K0-2*P2*L/
(C1*C1-1)));
SIGMASS := ABS(P0/(C2*C2-1)*(2*C2*C2-K0*(C2*C2+1))+P2*L1/
(C2*C2-1)*(C2*C2-1));
SIGMASR := ABS(P0/(C2*C2-1)*(2*C2*C2-K0*(C2*C2+1))-P2*L1/
(C2*C2-1)*(C2*C2-1));
if (SIGMARS>Mass*R_press) or (SIGMARR>Mass*R_stretch) or
(SIGMASS>Mass*R_press) or (SIGMASR>Mass*R_stretch)
then
MessageDlg('Несущая способность не
обеспечена',mtInformation,[mbOk],0)
else
MessageDlg('Несущая способность
обеспечена',mtInformation,[mbOk],0);
end
else begin
i:=1;
PkrOld :=0;
repeat
i := i+1;
Pkr := (i*i-1)*Eo*J/((1-Puasson)*(1-Puasson)*R*R*R)+Ep/(2*
(1+PuassonP))*((i+1)*(i+1)/(i*i*(i-1))+(i-1)*
(i-1)/(i*i*(i+1)*(3-4*PuassonP)));
if Pkr < PkrOld then PkrOld := Pkr else i:=0;
until i = 0;
P0 := StrToFloat(Edit1.Text);
if P0<=Pkr then
MessageDlg('Устойчивость обеспечена',mtInformation,[mbOk],0)
else
MessageDlg('Устойчивость не
обеспечена',mtInformation,[mbOk],0);
end;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Label2.Visible := False;
Label3.Visible := False;
Edit1.Visible := False;
Edit2.Visible := False;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Label2.Visible := True;
Label3.Visible := True;
Edit1.Visible := True;
Edit2.Visible := True;
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
begin
Label2.Visible := True;
Label3.Visible := False;
Edit1.Visible := True;
Edit2.Visible := False;
end;
end.
unit Draw;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TDrawForm = class(TForm)
BitBtn1: TBitBtn;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TPaintData = (isP0,isP2);
TDiagramArray = Array[TPaintData,1..5] of Double;
var
PLines : TDiagramArray;
DrawForm: TDrawForm;
implementation
{$R *.DFM}
procedure TDrawForm.FormActivate(Sender: TObject);
var
R: TRect;
MaxX, MinX: Double;
MaxY, MinY: Double;
Nx, Ny: Integer;
Kx, Ky: Double;
i: Byte;
PointMin, PointMax: Double;
procedure DrawLine(X0, k, b:Double);
begin
Canvas.MoveTo(R.Left+60+Round(Kx*X0),R.Bottom-30);
if k<0 then
Canvas.LineTo(R.Left+60,Round(R.Bottom - 33 -
(Ky*(b+(k*(10)/Kx)))))
else
Canvas.LineTo(R.Right-10,Round(R.Bottom - 33 -
(Ky*(-b+(k*((R.Right-R.Left-70)/Kx))))));
end;
begin
PLines[isP0,3] := 0;
PLines[isP2,3] := 0;
MaxX := 0.0;
MinX := 0.0;
MaxY := 0.0;
MinY := 0.0;
for i := 1 to 5 do begin
if PLines[isP0,i] > MaxX then MaxX := PLines[isP0,i];
if PLines[isP2,i] > MaxY then MaxY := PLines[isP2,i];
if PLines[isP0,i] < MinX then MinX := PLines[isP0,i];
if PLines[isP2,i] < MinY then MinY := PLines[isP2,i];
end;
if MaxX > 200 then Nx := 100 else Nx := 10;
MaxX := Round(MaxX/Nx)*Nx+Nx;
if MaxY > 200 then Ny := 100 else Ny := 10;
MaxY := Round(MaxY/Ny)*Ny+Ny;
with DrawForm do begin
Canvas.Pen.Color := clBlack;
R.Left := 10;
R.Top := 10;
R.Right := Width - 15;
R.Bottom := Height - 70;
Canvas.FrameRect(R);
Canvas.Brush.Color := clBtnFace;
Kx := (R.Right - R.Left - 80)/MaxX;
Ky := (R.Bottom - R.Top - 80)/MaxY;
{Ось Po}
Canvas.MoveTo(R.Left+10,R.Bottom-30);
Canvas.LineTo(R.Right-10,R.Bottom-30);
{Ось P2}
Canvas.MoveTo(R.Left+60,R.Top+30);
Canvas.LineTo(R.Left+60,R.Bottom-30);
i := 0;
while i*Nx<MaxX do begin
Inc(i);
Canvas.MoveTo(R.Left+60+Round(Kx*i*Nx),R.Bottom-33);
Canvas.LineTo(R.Left+60+Round(Kx*i*Nx),R.Bottom-27);
Canvas.TextOut(R.Left+50+Round(Kx*i*Nx), R.Bottom-20,
IntToStr(i*Nx));
end;
i := 0;
while i*Ny<MaxY do begin
Inc(i);
Canvas.MoveTo(R.Left+63,R.Bottom-30-Round(Ky*i*Ny));
Canvas.LineTo(R.Left+57,R.Bottom-30-Round(Ky*i*Ny));
Canvas.TextOut(R.Left+30, R.Bottom-35-Round(Ky*i*Ny),
IntToStr(i*Ny));
end;
if PLines[isP0,1] > PLines[isP0,4] then
PointMax := PLines[isP0,4]
else PointMax := PLines[isP0,1];
if PLines[isP0,2] > PLines[isP0,5] then
PointMin := PLines[isP0,2]
else PointMin := PLines[isP0,5];
if PointMin < 0 then PointMin := 0.0;
DrawLine(PLines[isP0,1],
-(PLines[isP2,1]/PLines[isP0,1]),PLines[isP2,1]);
DrawLine(PLines[isP0,2],
-(PLines[isP2,2]/PLines[isP0,2]),PLines[isP2,2]);
DrawLine(0,1,0);
DrawLine(PLines[isP0,4],
-(PLines[isP2,4]/PLines[isP0,4]),PLines[isP2,4]);
DrawLine(PLines[isP0,5],
-(PLines[isP2,5]/PLines[isP0,5]),PLines[isP2,5]);
Canvas.Brush.Color := clGreen;
Canvas.FloodFill(Round((((PointMax-PointMin)/2)*Kx)+R.Left+60),
R.Bottom-55, clBlack, fsBorder);
Canvas.Brush.Color := clBtnFace;
Canvas.TextOut(R.Right-80, R.Bottom-50, 'P0, TC/M*2');
Canvas.TextOut(R.Left+20, R.Top+10, 'P2, TC/M*2');
end;
end;
end.
unit Edittub;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls,Forms, Dialogs, DBFilter, DB, DBTables, Grids, DBGrids,
RXLookup, ExtCtrls, DBCtrls;
type
TEditDataForm = class(TForm)
Panel1: TPanel;
rxDBLookupCombo1: TrxDBLookupCombo;
TableSTUFF: TTable;
DataSourceSTUFF: TDataSource;
DBGrid1: TDBGrid;
DataSourceDATA: TDataSource;
TableDATA: TTable;
TableDATAMass: TFloatField;
TableDATAR_press: TFloatField;
TableDATAR_stretch: TFloatField;
TableDATAPuasson: TFloatField;
TableDATAR1: TFloatField;
TableDATARb: TFloatField;
TableDATAR: TFloatField;
TableDATAA: TFloatField;
TableDATAB: TFloatField;
rxDBFilter1: TrxDBFilter;
TableDATAStuff: TSmallintField;
DBNavigator1: TDBNavigator;
procedure rxDBLookupCombo1Change(Sender: TObject);
procedure DBNavigator1Click(Sender: TObject; Button:
TNavigateBtn);
procedure DBGrid1DblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
EditDataForm: TEditDataForm;
implementation
{$R *.DFM}
uses
EditForm;
procedure TEditDataForm.rxDBLookupCombo1Change(Sender: TObject);
var
S: String;
begin
rxDBFilter1.Deactivate;
rxDBFilter1.Filter.Clear;
s:='Stuff = '+TableSTUFF.FieldByName('Code').AsString;
rxDBFilter1.Filter.Add(S);
rxDBFilter1.Activate;
end;
procedure TEditDataForm.DBNavigator1Click(Sender: TObject; Button:
TNavigateBtn);
begin
case Button of
nbInsert:
begin
EditDataTub(TableDATA, True,
TableSTUFF.FieldByName('Code').AsInteger);
end;
nbEdit:
begin
EditDataTub(TableDATA, False,
TableSTUFF.FieldByName('Code').AsInteger);
end;
end;
end;
procedure TEditDataForm.DBGrid1DblClick(Sender: TObject);
begin
EditDataTub(TableDATA, False,
TableSTUFF.FieldByName('Code').AsInteger);
end;
end.
unit Editform;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Mask, DBCtrls, ExtCtrls, DB,
DBTables, Buttons;
type
TEdTubForm = class(TForm)
DataSource1: TDataSource;
Panel1: TPanel;
DBEdit1: TDBEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
DBEdit4: TDBEdit;
DBEdit5: TDBEdit;
DBEdit6: TDBEdit;
Label7: TLabel;
DBEdit7: TDBEdit;
Label8: TLabel;
Label9: TLabel;
Panel2: TPanel;
Panel3: TPanel;
DBEdit8: TDBEdit;
DBEdit9: TDBEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Table1: TTable;
Label10: TLabel;
DBText1: TDBText;
DataSource2: TDataSource;
Query1: TQuery;
Query1Material: TStringField;
procedure FormCreate(Sender: TObject);
public
FCode: Integer;
function EditTub( Table: TTable; IsNew: Boolean; Code: Integer):
Boolean;
end;
var
EdTubForm: TEdTubForm;
function EditDataTub(Table: TTable; IsNew: Boolean; Code: Integer):
Boolean;
implementation
{$R *.DFM}
function EditDataTub(Table: TTable; IsNew: Boolean; Code: Integer):
Boolean;
begin
Result := False;
with TEdTubForm.Create(Application) do
try
FCode := Code;
Result := EditTub(Table, IsNew, Code);
finally
Free;
end;
end;
function TEdTubForm.EditTub(Table: TTable; IsNew: Boolean; Code:
Integer): Boolean;
begin
if Table <> nil then
DataSource1.DataSet := Table
else begin
Table1.Open;
DataSource1.DataSet := Table1;
end;
if IsNew then begin
DataSource1.DataSet.Append;
DataSource1.DataSet.FieldByName('Stuff').AsInteger := Code;
end
else DataSource1.DataSet.Edit;
Result := ShowModal = mrOk;
if Result then
DataSource1.DataSet.Post
else
DataSource1.DataSet.Cancel;
end;
procedure TEdTubForm.FormCreate(Sender: TObject);
begin
Query1.Active := False;
Query1.ParamByName('St').AsInteger := FCode;
Query1.Active := True;
end;
end.
unit EditUser;
interface
uses
SysUtils, WinTypes, WinProcs, Classes, Graphics, Forms, Controls,
Buttons, StdCtrls, ExtCtrls, DBCtrls, Mask, DB, DBTables;
type
TEditUserDialog = class(TForm)
OKBtn: TBitBtn;
CancelBtn: TBitBtn;
UsersTable: TTable;
dsUsers: TDataSource;
NameEdit: TDBEdit;
FullNameEdit: TDBEdit;
GroupBox: TGroupBox;
PasswordEdit: TDBEdit;
ConfirmPassword: TEdit;
Label1: TLabel;
Label2: TLabel;
LevelGroup: TDBRadioGroup;
procedure OKBtnClick(Sender: TObject);
procedure CancelBtnClick(Sender: TObject);
procedure FormHide(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function EditUser(const UserName: string; Table: TTable; IsNew:
Boolean): Boolean;
end;
var
EditUserDialog: TEditUserDialog;
function EditUserData(const UserName: string; Table: TTable;
IsNew: Boolean): Boolean;
implementation
uses
Global, Crypt;
{$R *.DFM}
const
SNotFound = 'Записей не обнаружено';
SNoConfirmPassword = 'Вы ввели разные пароли. Проверьте
правильность ввода';
function EditUserData(const UserName: string; Table: TTable;
IsNew: Boolean): Boolean;
var
SUName: string;
begin
Result := False;
SUName := UserName;
if glUserLevel <> ulAdministrator then begin
Table := nil;
SUName := glUserName;
end;
with TEditUserDialog.Create(Application) do
try
Result := EditUser(SUName, Table, IsNew);
finally
Free;
end;
end;
{ TEditUserDialog }
function TEditUserDialog.EditUser(const UserName: string; Table:
Ttable; IsNew: Boolean): Boolean;
begin
NameEdit.Enabled := (glUserLevel = ulAdministrator);
LevelGroup.Enabled := (glUserLevel = ulAdministrator);
if Table <> nil then begin
dsUsers.DataSet := Table;
UsersTable.Close;
end
else begin
UsersTable.Open;
if UserName <> '' then begin
if not UsersTable.FindKey([UserName]) then
raise Exception.Create(SNotFound);
end;
dsUsers.DataSet := UsersTable;
end;
if IsNew then dsUsers.DataSet.Append
else dsUsers.DataSet.Edit;
ConfirmPassword.Text := PasswordEdit.Text;
Result := ShowModal = mrOk;
end;
procedure TEditUserDialog.OKBtnClick(Sender: TObject);
begin
if PasswordEdit.Text <> ConfirmPassword.Text then
raise Exception.Create(SNoConfirmPassword);
dsUsers.DataSet.Post;
ModalResult := mrOk;
end;
procedure TEditUserDialog.CancelBtnClick(Sender: TObject);
begin
dsUsers.DataSet.Cancel;
ModalResult := mrCancel;
end;
procedure TEditUserDialog.FormHide(Sender: TObject);
begin
dsUsers.DataSet.Cancel;
UsersTable.Close;
end;
end.
unit Global;
interface
type
TUserLevel = (ulInvalid, ulOperator, ulManager, ulAdministrator);
const
InvalidID = 0;
glUserLevel: TUserLevel = ulInvalid;
glUserName: string = '';
glUserID: Longint = InvalidID;
function cUserLevel(Code: Longint): TUserLevel;
implementation
function cUserLevel(Code: Longint): TUserLevel;
begin
Result := ulInvalid;
if (Code in [Integer(Low(TUserLevel))..Integer(High(TUserLevel))]) then
Result := TUserLevel(Code);
end;
end.
unit Global;
interface
type
TUserLevel = (ulInvalid, ulOperator, ulManager, ulAdministrator);
const
InvalidID = 0;
glUserLevel: TUserLevel = ulInvalid;
glUserName: string = '';
glUserID: Longint = InvalidID;
function cUserLevel(Code: Longint): TUserLevel;
implementation
function cUserLevel(Code: Longint): TUserLevel;
begin
Result := ulInvalid;
if (Code in [Integer(Low(TUserLevel))..Integer(High(TUserLevel))]) then
Result := TUserLevel(Code);
end;
end.
unit Main;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, SpeedBar, Menus, ExtCtrls, Placemnt, DB,
DBSecur, DBTables;
type
TStaftForm = class(TForm)
SpeedBar: TSpeedBar;
ExitItem: TSpeedItem;
MainMenu: TMainMenu;
FileMenu: TMenuItem;
InsuranceMenuItem: TMenuItem;
FileMenuSeperator: TMenuItem;
PrinterSetupMenuItem: TMenuItem;
ExitMenuItem: TMenuItem;
DictSetupMenu: TMenuItem;
UserMenuItem: TMenuItem;
WindowMenu: TMenuItem;
TileMenuItem: TMenuItem;
CascadeMenuItem: TMenuItem;
MinimizeAllMenuItem: TMenuItem;
ArrangeAllMenuItem: TMenuItem;
HelpMenu: TMenuItem;
HelpContentsMenuItem: TMenuItem;
HelpMenuSeparator: TMenuItem;
AboutMenuItem: TMenuItem;
ChangePasswordItem: TSpeedItem;
PrintSetupItem: TSpeedItem;
CalcItem: TSpeedItem;
PrinterSetup: TPrinterSetupDialog;
TileWindowsItem: TSpeedItem;
CascadeWindowsItem: TSpeedItem;
HintPanel: TPanel;
DBSecurity1: TDBSecurity;
Database1: TDatabase;
EditItem: TMenuItem;
FormPlacement: TFormPlacement;
procedure ArrangeAllMenuItemClick(Sender: TObject);
procedure TileMenuItemClick(Sender: TObject);
procedure CascadeMenuItemClick(Sender: TObject);
procedure MinimizeAllMenuItemClick(Sender: TObject);
procedure AboutMenuItemClick(Sender: TObject);
procedure PrinterSetupMenuItemClick(Sender: TObject);
procedure ExitMenuItemClick(Sender: TObject);
procedure FormStorageRestorePlacement(Sender: TObject);
procedure FormStorageSavePlacement(Sender: TObject);
function DBSecurity1CheckUser(UsersTable: TTable;
const
Password: String): Boolean;
procedure UserMenuItemClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure InsuranceMenuItemClick(Sender: TObject);
procedure ShowHint(Sender: TObject);
procedure EditItemClick(Sender: TObject);
private
procedure SetUserLevel;
procedure UpdateMenuItems(Sender: TObject);
function ShowForm(FormClass: TFormClass): TForm;
end;
var
StaftForm: TStaftForm;
implementation
uses
About, rxIni, VCLUtils, Global, AppUtils, EditUser, UserList,
EditTub, Calc1;
{$R *.DFM}
const
siMDIChilds = 'OpenMDIChilds';
procedure TStaftForm.SetUserLevel;
begin
case glUserLevel of
ulOperator:
begin
DictSetupMenu.Visible := False;
DictSetupMenu.Enabled := False;
UserMenuItem.Visible := False;
UserMenuItem.Enabled := False;
end;
ulManager:
begin
DictSetupMenu.Visible := True;
DictSetupMenu.Enabled := True;
UserMenuItem.Visible := False;
UserMenuItem.Enabled := False;
end;
ulAdministrator:
begin
DictSetupMenu.Visible := True;
DictSetupMenu.Enabled := True;
UserMenuItem.Visible := True;
UserMenuItem.Enabled := True;
end;
end;
end;
procedure TStaftForm.TileMenuItemClick(Sender: TObject);
begin
Tile;
end;
procedure TStaftForm.CascadeMenuItemClick(Sender: TObject);
begin
Cascade;
end;
procedure TStaftForm.MinimizeAllMenuItemClick(Sender: TObject);
var
I: Integer;
begin
for I := MDIChildCount - 1 downto 0 do
MDIChildren[I].WindowState := wsMinimized;
end;
procedure TStaftForm.ArrangeAllMenuItemClick(Sender: TObject);
begin
ArrangeIcons;
end;
procedure TStaftForm.AboutMenuItemClick(Sender: TObject);
begin
ShowAboutDialog('Расчет тюбинговой обделки', 'Королев А.В.',
'МГГУ', nil, 1, 0, 1996);
end;
procedure TStaftForm.PrinterSetupMenuItemClick(Sender: TObject);
begin
PrinterSetup.Execute;
end;
procedure TStaftForm.ExitMenuItemClick(Sender: TObject);
begin
Close;
end;
function TStaftForm.ShowForm(FormClass: TFormClass): TForm;
var
Form: TForm;
begin
Result := nil;
StartWait;
try
Form := FindForm(FormClass);
if Form = nil then
Application.CreateForm(FormClass, Form);
with Form do begin
if WindowState = wsMinimized then WindowState := wsNormal;
Show;
end;
Result := Form;
finally
StopWait;
end;
end;
procedure TStaftForm.FormStorageRestorePlacement(Sender: TObject);
var
IniFile: TrxIniFile;
List: TStrings;
I: Integer;
FormClass: TFormClass;
Form: TForm;
begin
StartWait;
try
SpeedBar.Visible := True;
IniFile := TrxIniFile.Create(FormPlacement.IniFileName);
try
if (glUserLevel in [ulManager, ulAdministrator]) then begin
List := TStringList.Create;
try
IniFile.ReadList(siMDIChilds, List);
for I := 0 to List.Count - 1 do begin
FormClass := TFormClass(GetClass(List[I]));
if FormClass <> nil then ShowForm(FormClass);
end;
finally
List.Free;
end;
end;
finally
IniFile.Free;
end;
finally
StopWait;
end;
end;
procedure TStaftForm.FormStorageSavePlacement(Sender: TObject);
var
IniFile: TrxIniFile;
List: TStrings;
I: Integer;
begin
IniFile := TrxIniFile.Create(FormPlacement.IniFileName);
try
IniFile.EraseSection(siMDIChilds);
List := TStringList.Create;
try
for I := MDIChildCount - 1 downto 0 do
List.Add(MDIChildren[I].ClassName);
if List.Count > 0 then
IniFile.WriteList(siMDIChilds, List);
finally
List.Free;
end;
finally
IniFile.Free;
end;
end;
function TStaftForm.DBSecurity1CheckUser(UsersTable: TTable;
const
Password: String): Boolean;
begin
Result := (Password = UsersTable.FieldByName('Password').AsString);
if Result then begin
glUserName := UsersTable.FieldByName('UserName').AsString;
glUserID := UsersTable.FieldByName('ID').AsInteger;
glUserLevel := cUserLevel(UsersTable.FieldByName('UserLevel')
.AsInteger);
Result := (glUserLevel <> ulInvalid);
end;
if Result then SetUserLevel;
end;
procedure TStaftForm.UserMenuItemClick(Sender: TObject);
begin
ShowForm(TUserListForm);
end;
procedure TStaftForm.ShowHint(Sender: TObject);
begin
HintPanel.Caption := Application.Hint;
end;
procedure TStaftForm.UpdateMenuItems(Sender: TObject);
begin
{ Enable or disable menu items and buttons }
CascadeMenuItem.Enabled := MDIChildCount > 0;
TileMenuItem.Enabled := MDIChildCount > 0;
ArrangeAllMenuItem.Enabled := MDIChildCount > 0;
MinimizeAllMenuItem.Enabled := MDIChildCount > 0;
TileWindowsItem.Enabled := MDIChildCount > 0;
CascadeWindowsItem.Enabled := MDIChildCount > 0;
end;
procedure TStaftForm.FormCreate(Sender: TObject);
begin
Application.OnHint := ShowHint;
Screen.OnActiveFormChange := UpdateMenuItems;
SetAutoSubClass(True);
{ set wait cursor to SQL }
WaitCursor := crSQLWait;
{ register classes of MDI-child forms }
{RegisterClasses([TDictForm, TRatesForm, TItemReportForm]);}
end;
procedure TStaftForm.FormDestroy(Sender: TObject);
begin
Screen.OnActiveFormChange := nil;
Application.HelpCommand(HELP_QUIT,0);
end;
procedure TStaftForm.InsuranceMenuItemClick(Sender: TObject);
begin
Form1.ShowModal;
end;
procedure TStaftForm.EditItemClick(Sender: TObject);
begin
EditDataForm.Show;
end;
end.
unit UserList;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, DBCtrls, ExtCtrls, DBTables, DB, Grids,
DBGrids, RXDBCtrl, Placemnt, StdCtrls, Buttons;
type
TUserListForm = class(TForm)
UsersTable: TTable;
dsUsers: TDataSource;
UsersGrid: TrxDBGrid;
UsersTablePassword: TStringField;
Panel1: TPanel;
DBNavigator: TDBNavigator;
FormPlacement: TFormPlacement;
UsersTableID: TFloatField;
UsersTableUserName: TStringField;
UsersTableFullName: TStringField;
UsersTableUserLevel: TFloatField;
BitBtn1: TBitBtn;
procedure DBNavigatorClick(Sender: TObject; Button:
TNavigateBtn);
procedure UsersGridDblClick(Sender: TObject);
procedure FormPlacementSavePlacement(Sender: TObject);
procedure FormPlacementRestorePlacement(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
var
UserListForm: TUserListForm;
implementation
uses
EditUser, IniFiles, Global;
const
SAccessDenied = 'Недостаточно прав. Доступ запрещен';
{$R *.DFM}
procedure TUserListForm.DBNavigatorClick(Sender: TObject;
Button: TNavigateBtn);
begin
case Button of
nbInsert:
begin
EditUserData('', UsersTable, True);
end;
nbEdit:
begin
EditUserData('', UsersTable, False);
end;
end;
end;
procedure TUserListForm.UsersGridDblClick(Sender: TObject);
begin
EditUserData('', UsersTable, False);
end;
procedure TUserListForm.FormPlacementSavePlacement(Sender: TObject);
var
IniFile: TIniFile;
I: Integer;
begin
IniFile := TIniFile.Create(FormPlacement.IniFileName);
try
for I := 0 to ComponentCount - 1 do begin
if Components[I] is TrxDBGrid then
TrxDBGrid(Components[I]).SaveLayout(IniFile);
end;
finally
IniFile.Free;
end;
end;
procedure TUserListForm.FormPlacementRestorePlacement(Sender:
TObject);
var
IniFile: TIniFile;
I: Integer;
begin
IniFile := TIniFile.Create(FormPlacement.IniFileName);
try
for I := 0 to ComponentCount - 1 do begin
if Components[I] is TrxDBGrid then
TrxDBGrid(Components[I]).RestoreLayout(IniFile);
end;
finally
IniFile.Free;
end;
end;
procedure TUserListForm.FormCreate(Sender: TObject);
begin
if not (glUserLevel in [ulAdministrator]) then begin
raise Exception.Create(SAccessDenied);
end;
UsersTable.Open;
end;
procedure TUserListForm.FormClose(Sender: TObject;
var
Action: TCloseAction);
begin
Action := caFree;
end;
end.
program Shaft;
uses
Forms,
Main in 'MAIN.PAS' {StaftForm},
Global in 'GLOBAL.PAS',
EditUser in 'EDITUSER.PAS',
UserList in 'USERLIST.PAS' {UserListForm},
Edittub in 'EDITTUB.PAS' {EditDataForm},
Editform in 'EDITFORM.PAS' {EdTubForm},
Calc1 in 'CALC1.PAS' {Form1},
Draw in 'DRAW.PAS' {DrawForm};
{$R *.RES}
begin
Application.CreateForm(TStaftForm, StaftForm);
Application.CreateForm(TEditDataForm, EditDataForm);
Application.CreateForm(TEdTubForm, EdTubForm);
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TDrawForm, DrawForm);
Application.Run;
end.
5. Список использованной литературы.
1. Баклашов И.В., Картозия Б.А. “Механика подземных сооружений и конструкций крепей” - М., Недра, 1992, 543 с.
2. Насонов И.Д., Федюкин В.А., Шуплик М.Н., “Технология строительства подземных сооружений” - М., Недра, 1992, 285 с.
3. Насонов И.Д., Шуплик М.Н. “Закономерности формирования ледопородных ограждений при сооружении стволов шахт” - М., Недра, 1976, 237 с.
4. Храпов В.Г. “Тоннели и метрополитены” - М., Транспорт, 1989, 383 с.
5. Белый В.В. “Справочник инженера шахтостроителя” в 2-х томах - М., 1983
6. Туренский Н.Г., Ледяев А.П. “Строительство тоннелей и метрополитенов” - М., Транспорт, 1992, 264 с.
7. Богомолов Г.М., Голицынский Д.М. Сеславинский С.И. “Справочник инженера тоннельщика” - М., Транспорт, 1993, 389 с.
... РАUS и погрузочно-доставочными машинами ПД-2 ЛК-1. Доставка и укладка бетона осуществляется бетоно-транспортными машинами на базе ТСШ-4б. С целью реализации плана по внедрению современных технологий при строительстве Алматинского метрополитена был приобретен высокопроизводительный тоннелепроходческий комплекс (далее – ТПМК) «Неггеnknecht: S320». ТПМК компании «Неггеnknecht AG» должен обеспечить ...
... , которые дают возможность увеличить темпы работ при минимальном нарушении сложившихся условий жизни города и особенно его наземной транспортной системы. 2. Новая концепция строительства метрополитена на линиях мелкого заложения 2.1. Сущность метода и эффективность его применения Анализ опыта строительства метрополитенов в стране показывает, что росту протяженности линий мелкого заложения ...
... об истории строительства и развития Лондонского, Вашингтонского и Санкт-Петербургского метрополитенов. ЛОНДОНСКИЙ МЕТРОПОЛИТЕН Лондонский метрополитен является крупнейшим в Европе и старейшей в мире подземной системой. Первая в мире линия метрополитена длиной в 3,6 км строилась восемь лет и была открыта 9 января 1863 года. Она соединяла Западный и Северный вокзалы в Лондоне и предназначалась ...
... водоносных грунтов. 1933 год - год фактического начала работ. По трассе Мясницкого (Сокольнического) радиуса, на участке глубокого заложения, для широкого охвата строительством была развернута проходка 14 шахт. Одновременно началась работа в открытых котлованах на четырех дистанциях в Сокольниках. Велись подготовительные работы на пяти дистанциях на Остоженке. К концу года приступили к проходке ...
0 комментариев