|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1. Участки ствола в наносах, слабых сыпучих или выветренных грунтах.
Нагрузка от горного давления на обделку ствола в наносах, слабых сыпучих или выветренных коренных породах определяется с использованием методов предельного равновесия без учета коэффициента сцепления породы, что идет в запас прочности. Расчетная максимальная нагрузка на обделку ствола определяется по формуле: , где - коэффициент перегрузки, принимаемый равным ; - коэффициент, учитывающий неравномерность нагрузки за счет близости рассматриваемого участка с координатой к сопряжению с горизонтальной выработкой: при - , при - . Нормативная нагрузка от горного давления в выветренных породах определяется по формуле или из таблицы 2: , где - глубина заложения рассматриваемого участка ствола; ; - нормативное значение угла внутреннего трения грунта, принимаемое для песчаных и глинистых грунтов по таблице 3 (составлена на основании СНиП II-15-74 “Основания зданий и сооружений. Нормы проектирования”). Примечание: для промежуточных значений и величина может определяться линейным интерполированием данных по таблице 2.
Таблица 2. Значения нормативной нагрузки от горного давления на обделку ствола в наносах, слабых сыпучих или выветренных коренных породах в зависимости от глубины, радиуса и грунтовых условий. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
H/r |
/gr |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
j=50 |
j=100 |
j=150 |
j=200 |
j=250 |
j=300 |
j=350 |
j=400 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.0 |
0.0000 |
0.0000 |
0.0000 |
0.0000 |
0.0000 |
0.0000 |
0.0000 |
0.0000 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.50 |
0.4042 |
0.3260 |
0.2618 |
0.2084 |
0.1653 |
0.1293 |
0.0997 |
0.0753 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.00 |
0.7843 |
0.6132 |
0.4767 |
0.3662 |
0.2807 |
0.2114 |
0.1563 |
0.1131 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.75 |
1.3238 |
0.9965 |
0.7448 |
0.5477 |
0.4031 |
0.2902 |
0.1919 |
0.1613 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.50 |
1.8363 |
1.3405 |
0.9700 |
0.6888 |
0.4906 |
0.3411 |
0.2327 |
0.1553 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3.75 |
2.6178 |
1.8540 |
1.2845 |
0.8701 |
0.5937 |
0.3950 |
0.2586 |
0.1664 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.00 |
4.4198 |
2.3149 |
1.5485 |
1.0220 |
0.6664 |
0.4288 |
0.2727 |
0.1716 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6.25 |
4.1619 |
2.7383 |
1.7780 |
1.1240 |
0.7214 |
0.4521 |
0.2814 |
0.1742 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.50 |
4.8802 |
3.1327 |
1.9822 |
1.2197 |
0.7945 |
0.4691 |
0.2871 |
0.1757 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8.75 |
5.5786 |
3.5038 |
2.1671 |
1.3022 |
0.8000 |
0.4820 |
0.2911 |
0.1767 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10.0 |
6.2603 |
3.8553 |
2.3367 |
1.3979 |
0.8296 |
0.4921 |
0.2940 |
0.1774 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15.0 |
8.8574 |
5.1213 |
2.9069 |
1.6302 |
0.9131 |
0.5176 |
0.3002 |
0.1786 |
Нормативная нагрузка от горного давления в слабых сыпучих породах определяется по формуле:
.
Нормативная дополнительная нагрузка на обделку ствола, вызванная весом наземных зданий, сооружений или оборудования учитывается, если нагружающий объект отстоит от контура ствола не дальше чем на (, см. лист 1). При этом обязательно определение для участка ствола при .
Таблица 3.
Нормативные значения угла внутреннего трения , град, для песчаных и глинистых грунтов.
Виды грунтов
Значения при к - те пористости
0.45
0.55
0.65
0.75
0.85
0.95
1.05
Пески гравелистые и крупные
430
400
380
---
---
---
---
Пески средней крупности
400
380
350
---
---
---
---
Пески мелкие
380
360
320
280
---
---
---
Пески пылеватые
360
340
300
260
---
---
---
Супеси (консистенция 0 - 0.25)
300
290
270
---
---
---
---
Супеси (консистенция 0.25 - 0.75)
280
260
240
210
---
---
---
Суглинки (консистенция 0 - 0.25)
260
250
240
230
220
200
---
Суглинки (консистенция 0.25 - 0.5)
240
230
220
210
190
170
---
Суглинки (консистенция 0.5 - 0.75)
---
---
190
180
160
140
120
Глины (консистенция 0 - 0.25)
---
210
200
190
180
160
140
Глины (консистенция 0.25 - 0.5)
---
---
180
170
160
140
110
Глины (консистенция 0.5 - 0.75)
---
---
150
140
120
100
70
Нормативная дополнительная нагрузка по глубине ствола при наличии одной пригрузки (см. лист 1) или нескольких, центры тяжести которых одинаково удалены от ствола и лежат на перпендикулярных друг другу осях, определяются по формуле:
,
где - расстояние от внешнего контура ствола до наиболее удаленной точки нагружающего объекта;
- средний поперечный размер нагружающего объекта;
- вес нагружающего объекта.
Дополнительную нагрузку можно также определять по данным таблицы 4 в зависимости от глубины ствола, его радиуса и грунтовых условий по формуле, используя для промежуточных значений и линейную интерполяцию:
,
в которой
и где значение безразмерного параметра
в зависимости от грунтовых условий и отношения приведены в таблице 4.
Таблица 4.
Значения безразмерного параметра в зависимости от глубины ствола, его радиуса и грунтовых условий.
H/r
j=50
j=100
j=150
j=200
j=250
j=300
j=350
j=400
0.00
0.8396
0.7041
0.5871
0.4903
0.4059
0.3334
0.2710
0.2174
0.50
0.7812
0.6077
0.4680
0.3571
0.2708
0.2008
0.1454
0.1022
1.00
0.7415
0.5451
0.3945
0.2800
0.1973
0.1340
0.0878
0.0543
1.75
0.6994
0.4817
0.3240
0.2107
0.1356
0.0825
0.0475
0.025
2.50
0.6688
0.4376
0.2780
0.1685
0.1006
0.0558
0.0288
0.0135
3.75
0.6317
0.3873
0.2280
0.1258
0.680
0.033
0.0147
0.0057
5.00
0.6046
0.3523
0.1954
0.1002
0.0500
0.021
0.0086
0.0029
6.25
0.5834
0.3261
0.1722
0.0830
0.0387
0.0157
0.0055
0.0016
7.50
0.5661
0.3055
0.1541
0.0708
0.0311
0.0117
0.0038
0.0010
8.75
0.5516
0.2887
0.1410
0.0616
0.0258
0.0091
0.0027
0.0006
10.0
0.5392
0.2741
0.1300
0.0540
0.0218
0.0073
0.0020
0.0004
15.0
0.5022
0.2352
0.1006
0.0372
0.0129
0.0036
0.0008
0.0001
При наличии пригрузок с одинаковым весом, центры тяжести которых лежат на перпендикулярных друг другу осях, но находятся на разных расстояниях от контура ствола, в формуле подставляется меньшее из значений .
Если же пригрузки имеют различный вес, но расположены на равном расстоянии от контура ствола, в формуле подставляется большее значение .
Если же пригрузки имеют различный вес и расположены на различных расстояниях от контура ствола, расчет ведется для каждой пригрузки в отдельности и в расчет принимается наибольшее из полученных значений .
При наличии нескольких пригрузок, центры тяжести которых пересекаются относительно центра сечения ствола под углами меньшими 900 и составляют соответственно углы , наибольшая дополнительная равнодействующая нагрузка определяется по формуле:
,
где - порядковый номер нагружающего объекта;
- дополнительные нагрузки от - й пригрузки определяемые по формулам при соответствующих значениях ;
- угол, соответствующий расчетному направлению приложения наибольшей равнодействующей нагрузки, определяемой по формуле:
.
2. Участки ствола в коренных породах.
На участках где породы относятся к категории нестойких, нагрузка на обделку определяется в зависимости от способа сооружения ствола, его поперечного сечения, коэффициента крепости пород .
Средняя нормативная нагрузка на обделку ствола от горного давления определяется по формуле:
,
где - коэффициент, учитывающий степень разгрузки породной поверхности ствола при принятой технологии крепления, конструкции и материала обделки. Коэффициент может приниматься по таблице 5.
При проходке ствола в водоносных породах имеющих напор , полная средняя нормативная нагрузка на обделку принимается равной сумме нагрузок и .
Расчетные максимальные нагрузки , минимальные нагрузки , а также расчетные значения и определяются как произведение средней нормативной нагрузки и соответствующих коэффициентов, приведенных при проходке ствола обычным способом в таблице 6 и при проходке ствола бурением - в таблице 7.
Таблица 5.
Значения коэффициента .
Тип и способ сооружения ствола
Монолитная при совмещенной схеме проходке
5
То же при параллельной и параллельно-щитовой схеме проходки
3
Тюбинговая, вводимая в работу на расстоянии от забоя не менее 20 м при обычном способе проходки
1.1
То же при возведении крепи с предварительной откачкой раствора и полной разгрузкой породных стенок при проходке стволов бурением
0.8
Таблица 6.
Соотношения между расчетными значениями , , , и средней нормативной нагрузкой при обычном способе проходки.
Участок ствола
Характеристики нагрузок
Pmax
Pmin
P0
P2
P2
P0
Протяженный
2.8
0.33
1.56
1.24
0.8
Вблизи сопряжения (до 20 м)
3.1
0.17
1.64
1.46
0.9
На участке пересечения геологического нарушения
3.3
0.17
1.74
1.56
0.9
Таблица 7.
Соотношения между расчетными значениями , , , и средней нормативной нагрузкой при проходке ствола бурением.
Участок ствола
Характеристики нагрузок
Pmax
Pmin
P0
P2
P2
P0
Протяженный
1.4
0.6
1.0
0.4
0.4
Вблизи сопряжения
1.5
0.3
0.9
0.6
0.6
3.2. Проверка несущей способности тюбинговых обделок вертикальных стволов метрополитенов.
Расчет тюбинговой обделки вертикальных стволов метрополитенов будем производить как для двухслойного состава кольца (см. лист 1), наружным слоем которого является оболочка из спинок тюбингов, внутренним - кольцевые ребра жесткости.
Проверку несущей способности тюбинговой обделки будем производить из условия, при котором максимальные напряжения растяжения и сжатия в ребре и спинке не превышали расчетных сопротивлений материала обделки:
; ,
где - расчетное сопротивление материала обделки (железобетона или чугуна) принимаемое по СНиП II-21-75 “Бетонные и железобетонные конструкции. Нормы проектирования.” или СНиП II-8.3-72 “Стальные конструкции. Нормы проектирования.”
Несущая способность тюбинговой обделки с расчетными характеристиками материала и обеспечена если выполняются условия:
для ребра (сечение Б-Б на листе 1):
для спинки (сечение В-В на листе 1):
где знак “+” относится в зависимости от материала конструкции к расчетным характеристикам железобетона, а “-” - к расчетным характеристикам чугуна;
;
;
- радиус конструкции тюбинговой обделки по спинке тюбинга (см. лист 1);
- внутренний радиус тюбинговой обделки по кольцевому ребру (см. лист 1);
- расстояние в свету между кольцевыми ребрами тюбинга (см. лист 1);
- высота кольцевого ребра тюбинга (см. лист 1);
;
;
, , , - коэффициенты передачи нагрузок через наружний слой, в зависимости от геометрических размеров конструкции и определяемые по формулам:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
- коэффициент Пуассона материала обделки, принимаемый равным 0.25 для бетонной и железобетонной, 0.23 - 0.27 - для чугунной и 0.3 - для остальных.
При определении области применения типовой тюбинговой обделки ствола на различное сочетание нагрузок , , следует построить паспорт прочности конструкции в координатах - . Несущая способность конструкции будет обеспечена если комбинации нагрузок , и лежат в области, ограниченной нижними границами линий, характеризующих условия прочности по сжимающим и растягивающим напряжениям в спинке и ребре тюбинга и условия положительности нагрузок по формуле .
:
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 с.
![]() |
Все права защищены © 2010 |
![]() |