📄 uclass.pas
字号:
Begin
DiferAxis:=(Maximum-Minimum)*0.8;
NewMin:=Chart1.MinYValue(Chart1.LeftAxis)+ScrollBar1.Position*DiferChart/100.0;
NewMax:=Minimum+DiferAxis;
end;
for i:=1 to 84 do
begin
TmpChart:= FindComponent('chart'+IntToStr(i));
if ( TmpChart <> nil ) then
begin
TChart(TmpChart).LeftAxis.SetMinMax(NewMin,NewMax);
end
end;
ScrollBar1.Enabled:=true;
BitBtn4.Enabled:=true;
BitBtn6.Enabled:=true;
if DiferChart/DiferAxis > 100 then
BitBtn3.Enabled:=false;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
var i :longint;
var TmpChart :TComponent;
begin
ScrollBar1.Position:=0;
ScrollBar1.Enabled:=false;
for i:=1 to 12 do
begin
TmpChart:= FindComponent('chart'+IntToStr(i));
if ( TmpChart <> nil ) then
begin
TChart(TmpChart).LeftAxis.Automatic:=true;
end
end;
BitBtn6.Enabled:=false;
BitBtn4.Enabled:=false;
BitBtn3.Enabled:=true;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
s,str,WellTop,WellBottom,SqlString:string;
ts:TStringList;
i,j:integer;
begin
try
//或取当前WellID和WellTop 做为后面查询条件
s:=ComboBox1.Text;
ts:=TStringList.Create;
while Pos( '-',s) >0 do
begin
j:=POS( '-',s);
str:=Copy(s,1,j-1);
ts.Add(str);
Delete(s,1,j);
end;
ts.Add(s);
WellTop:=ts[1];
WellBottom:=ts[2];
//连接数据库,获取记录条数
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
SqlString:='select * from TbParameterTable where WellID='+WellID+' and DepthTop='+WellTop;
ADOQuery1.SQL.Add(SqlString);
ADOQuery1.ExecSQL;
ADOQuery1.Open;
if ADOQuery1.RecordCount=0 then
begin
//application.MessageBox('该深度段不存在常用测井曲线数据!', '系统提示', 0);
exit;
end;
ADOQuery1.Recordset.MoveFirst;
//参数显示
Edit16.Text:=WellTop;
Edit17.Text:=WellBottom;
Edit1.Text:= ADOQuery1.Recordset.Fields['FDC'].Value;
Edit2.Text:= ADOQuery1.Recordset.Fields['DCLN'].Value;
Edit3.Text:= ADOQuery1.Recordset.Fields['DCLM'].Value;
Edit4.Text:= ADOQuery1.Recordset.Fields['NCLN'].Value*100;
Edit5.Text:= ADOQuery1.Recordset.Fields['NCLM'].Value*100;
Edit6.Text:= ADOQuery1.Recordset.Fields['DGCL'].Value;
Edit7.Text:= ADOQuery1.Recordset.Fields['PMAX'].Value*100;
Edit8.Text:= ADOQuery1.Recordset.Fields['RW'].Value;
Edit9.Text:= ADOQuery1.Recordset.Fields['P'].Value;
Edit10.Text:= ADOQuery1.Recordset.Fields['GRAD'].Value;
Edit11.Text:= ADOQuery1.Recordset.Fields['RDEP'].Value;
Edit12.Text:= ADOQuery1.Recordset.Fields['HIMX'].Value;
Edit13.Text:= ADOQuery1.Recordset.Fields['HIMN'].Value;
Edit14.Text:= ADOQuery1.Recordset.Fields['CECMN'].Value;
Edit15.Text:= ADOQuery1.Recordset.Fields['CECMX'].Value;
if ADOQuery1.Recordset.Fields['GRSP'].Value=1 then
begin
radiobutton1.Checked:=true;
radiobutton2.Checked:=false;
end
else if ADOQuery1.Recordset.Fields['GRSP'].Value=2 then
begin
radiobutton2.Checked:=true;
radiobutton1.Checked:=false;
end;
//参数赋值
P:=ADOQuery1.Recordset.Fields['P'].Value;
FDC:=ADOQuery1.Recordset.Fields['FDC'].Value;
HIMX:=ADOQuery1.Recordset.Fields['HIMX'].Value;
HIMN:=ADOQuery1.Recordset.Fields['HIMN'].Value;
CECMN:=ADOQuery1.Recordset.Fields['CECMN'].Value;
CECMX:=ADOQuery1.Recordset.Fields['CECMX'].Value;
DCLM:=ADOQuery1.Recordset.Fields['DCLM'].Value;
DCLN:=ADOQuery1.Recordset.Fields['DCLN'].Value;
NCLM:=ADOQuery1.Recordset.Fields['NCLM'].Value;
NCLN:=ADOQuery1.Recordset.Fields['NCLN'].Value;
DGCL:=ADOQuery1.Recordset.Fields['DGCL'].Value;
PMAX:=ADOQuery1.Recordset.Fields['PMAX'].Value;
RW:=ADOQuery1.Recordset.Fields['RW'].Value;
BHT:=ADOQuery1.Recordset.Fields['BHT'].Value;
GRAD:=ADOQuery1.Recordset.Fields['GRAD'].Value;
RDEP:=ADOQuery1.Recordset.Fields['RDEP'].Value;
DG:=ADOQuery1.Recordset.Fields['DG'].Value;
DSH:=ADOQuery1.Recordset.Fields['DSH'].Value;
NSH:=ADOQuery1.Recordset.Fields['NSH'].Value;
NCL:=ADOQuery1.Recordset.Fields['NCL'].Value;
DCL:=ADOQuery1.Recordset.Fields['DCL'].Value;
CLMX:=ADOQuery1.Recordset.Fields['CLMX'].Value;
FDMN:=ADOQuery1.Recordset.Fields['FDMN'].Value;
BWMX:=ADOQuery1.Recordset.Fields['BWMX'].Value;
BWMN:=ADOQuery1.Recordset.Fields['BWMN'].Value;
RWCL:=ADOQuery1.Recordset.Fields['RWCL'].Value;
DWB:=ADOQuery1.Recordset.Fields['DWB'].Value;
//连接数据库,获取记录条数
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
SqlString:='select * from TbParameterCyqx where WellID='+WellID+ ' and Depth>='+WellTop+' and Depth<='+WellBottom;
ADOQuery1.SQL.Add(SqlString);
ADOQuery1.ExecSQL;
ADOQuery1.Open;
acount:=ADOQuery1.RecordCount;
if acount=0 then
begin
application.MessageBox('该深度段不存在常用测井曲线数据!', '系统提示', 0);
exit;
end;
SetLength(DEPTH,acount);
SetLength(SP,acount);
SetLength(GR,acount);
SetLength(DEN,acount);
SetLength(CNL,acount);
SetLength(TMON,acount);
SetLength(TGL,acount);
SetLength(TLN,acount);
SetLength(TILL,acount);
SetLength(mTMON,acount);
SetLength(mTGL,acount);
SetLength(mTLN,acount);
SetLength(mTILL,acount);
SetLength(VSH,acount);
SetLength(SVCL,acount);
SetLength(mSVCL,acount);
//变量赋值
ADOQuery1.Recordset.MoveFirst;
for i:=0 to acount-1 do
begin
DEPTH[i]:= ADOQuery1.Recordset.Fields['Depth'].Value;
GR[i]:= ADOQuery1.Recordset.Fields['GR'].Value;
SP[i]:= ADOQuery1.Recordset.Fields['SP'].Value;
DEN[i]:= ADOQuery1.Recordset.Fields['DEN'].Value;
CNL[i]:= ADOQuery1.Recordset.Fields['CNL'].Value/100;
ADOQuery1.Recordset.MoveNext ;
end;
//计算泥质相对体积
if SHF1=1 then
begin
//保证第一个值为非法数据
For i:= 0 To acount - 1 do
begin
if GR[i]=-9999 then continue
else
begin
GMXI := GR[i];
GMNI := GR[i];
break;
end;
end;
//计算最大值、最小值并排除非法数据
For i:= 0 To acount - 1 do
begin
if GR[i]=-9999 then continue;
If GR[i] > GMXI Then GMXI := GR[i];
If GR[i] < GMNI Then GMNI := GR[i];
end;
end;
if SHF1=2 then
begin
//保证第一个值为非法数据
For i:= 0 To acount - 1 do
begin
if GR[i]=-9999 then continue
else
begin
GMXI := SP[i];
GMNI := SP[i];
break;
end;
end;
//计算最大值、最小值并排除非法数据
For i:= 0 To acount - 1 do
begin
if GR[i]=-9999 then continue;
If SP[i] > GMXI Then GMXI := SP[i];
If SP[i] < GMNI Then GMNI := SP[i];
end;
end;
//清空表格
Chart1.Series[0].Clear ;
Chart1.Series[1].Clear ;
Chart2.Series[0].Clear ;
Chart2.Series[1].Clear ;
Chart3.Series[0].Clear ;
Chart3.Series[1].Clear ;
Chart4.Series[0].Clear ;
Chart4.Series[1].Clear ;
Chart1.Series[0].Active:=false;
Chart1.Series[1].Active:=false;
Chart2.Series[0].Active:=false;
Chart2.Series[1].Active:=false;
Chart3.Series[0].Active:=false;
Chart3.Series[1].Active:=false;
Chart4.Series[0].Active:=false;
Chart4.Series[1].Active:=false;
GroupBox5.Visible:=true;
for i:=0 to acount-1 do
begin
//对曲线表中存在的非法数据项予以剔除
if (DEPTH[i] =-9999) or
(GR[i]=-9999) or
(SP[i]=-9999) or
(DEN[i]=-9999) or
(CNL[i]=-9999) then continue;
if SHF1=1 then
VSH[i]:=(GR[i]-GMNI)/(GMXI-GMNI);
if SHF1=2 then
VSH[i]:=(SP[i]-GMNI)/(GMXI-GMNI);
//敏感度指数计算
//第一步:计算视流体密度
DFA1:=DG*CNL[i]/(CNL[i]+DG-DEN[i]); //1。DFA1
DFA2:=DG*(CNL[i]-VSH[i]*NSH)/(CNL[i]-VSH[i]*NSH+DG-(DEN[i]+VSH[i]*(DG-DSH))); //2。DFA2
VCL:=((DG-1)*CNL[i]+DEN[i]-DG)/((DG-1)*NCL-DCL+DG); //3。粘土含量VCL初值
DFMN:=DFA1-FDC*(DFA1-DFA2)*(VCL+0.1)/(VSH[i]+0.1); //4。经验性估算视流体密度最小值
//5。由用户提供的粘土含量上限调整DFMN
if VCL>CLMX then DFMN:=1;
if (VCL>=0.01) and (VCL<=CLMX) then DFMN:=DFMN+(VCL-0.01)*(1-DFMN)/(CLMX-0.01);
//6。由用户提供的流体密度最小值进一步调整DFMN
if (DFMN<FDMN) then DFMN:=FDMN;
if (DFA2<DFMN) then DFA2:=DFMN;
//计算视流体密度
DFA:=DFA2;
//第二步:计算粘土点参数
RNCL:=(CNL[i]-DFA*(DG-DEN[i]-VCL*(DG-DCLN))/(DG-DFA))/VCL;
ENCL:=(CNL[i]-DFA*(DG-DEN[i]-VCL*(DG-DCLM))/(DG-DFA))/VCL;
FAI:=(DG-DEN[i])/(DG-DFA)-VCL*(DG-DCLN)/(DG-DFA);
SL2:=(DCLN-DCLM)/(RNCL-ENCL);//直线ER斜率
SDCL:=SL2*(RNCL-ENCL)+DCLM;//计算出的粘土点参数
BW:=VCL*(DGCL-SDCL)/(DGCL-DWB);
SNCL:=NCLM+(BW-BWMN)*(NCLN-NCLM)/(BWMX-BWMN);
//第三步:计算粘土含量
SVCL[i]:=(DG*CNL[i]+(DEN[i]-2.65-CNL[i])*DFA)/((DG-DFA)*SNCL-(DG-DCL)*DFA);
//第四步:计算粘土阳离子交换能力CEC
//1. 计算粘土水化水含盐量
PT:=(BW*VSH[i]+(1-VSH[i])*PMAX);
PE:=PT-BW;
RWE:=PT*RW*RWCL/(RWCL*PE+RW*BW);
RTEMP:=BHT-GRAD*(DEPTH[i]-RDEP)/100;
RF75:=RWE*(RTEMP+7)/82;
C:=power(10,((3.526-Log10(RF75-0.012))/0.955))/(58.453*1000);
//2. 计算粘土水化水质量
SDG:=DGCL*SVCL[i]+(1-SVCL[i])*DG;
BW:=BW*DWB/(SDG*(1-PT));
CEC:=BW*1000/(0.084*power(C,-0.5)+0.22);
//第五步:计算不同粘土矿物的相对含量 存储于粘土矿物分析数据表中
//1、伊-蒙百分含量
TMI:=(HIMX-FAI)/(HIMX-HIMN);
//2、蒙脱石百分含量
TMON[i]:=TMI*(CEC-CECMN)/(CECMX-CECMN);
//3、伊利石百分含量
TILL[i]:=TMI-TMON[i];
//4、高岭石、绿泥石百分含量
TCHK:=1-TMI;
//5、高岭石百分含量
TGL[i]:=P*TCHK/100;
//6、绿泥石百分含量
TLN[i]:=(1-P/100)*TCHK;
//对于计算得到的非法数据跳过 折线中间断线
if (TMON[i]<0) or (TMON[i]>1) then
begin
Chart1.Series[0].AddNullXY(trunc(TMON[i]*100),DEPTH[i],'');
continue;
end;
if (TILL[i]<0) or (TILL[i]>1) then
begin
Chart2.Series[0].AddNullXY(trunc(TILL[i]*100),DEPTH[i],'');
continue;
end;
if (TGL[i]<0) or (TGL[i]>1) or (TLN[i]<0) or (TLN[i]>1) then
begin
Chart3.Series[0].AddNullXY(trunc((TLN[i]+TGL[i])*100),DEPTH[i],'');
continue;
end;
if (SVCL[i]<0) or (SVCL[i]>1) then
begin
Chart4.Series[0].AddNullXY(trunc(SVCL[i]*100),DEPTH[i],'');
continue;
end;
if (DEPTH[i] <= strtofloat(WellBottom)) and (DEPTH[i] >= strtofloat(WellTop)) then
begin
Chart1.Series[0].AddXY(trunc(TMON[i]*100),DEPTH[i]);
Chart2.Series[0].AddXY(trunc(TILL[i]*100),DEPTH[i]);
Chart3.Series[0].AddXY(trunc((TLN[i]+TGL[i])*100),DEPTH[i]);
Chart4.Series[0].AddXY(trunc(SVCL[i]*100),DEPTH[i]);
end ;
//进度条显示
ProgressBar1.Position := i ;
end;
GroupBox5.Visible:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
SqlString:='select * from TbDataNtkw where WellID='+WellID+ ' and Depth>='+WellTop+' and Depth<='+WellBottom+ ' order by Depth';
ADOQuery1.SQL.Add(SqlString);
ADOQuery1.ExecSQL;
ADOQuery1.Open;
if ADOQuery1.RecordCount<>0 then
begin
//画实验分析数据
ADOQuery1.Recordset.MoveFirst;
for i:=0 to ADOQuery1.RecordCount-1 do
begin
Chart1.Series[1].AddXY(trunc(strtofloat(ADOQuery1.Recordset.Fields['mtshl'].Value)),ADOQuery1.Recordset.Fields['Depth'].Value);
Chart2.Series[1].AddXY(trunc(ADOQuery1.Recordset.Fields['ylshl'].Value),ADOQuery1.Recordset.Fields['Depth'].Value);
Chart3.Series[1].AddXY(trunc((ADOQuery1.Recordset.Fields['glshl'].Value+ADOQuery1.Recordset.Fields['lnshl'].Value)),ADOQuery1.Recordset.Fields['Depth'].Value);
Chart4.Series[1].AddXY(trunc(ADOQuery1.Recordset.Fields['ntzhl'].Value),ADOQuery1.Recordset.Fields['Depth'].Value);
ADOQuery1.Recordset.MoveNext ;
end;
end;
//激活显示
Chart1.Series[0].Active:=true;
Chart1.Series[1].Active:=true;
Chart2.Series[0].Active:=true;
Chart2.Series[1].Active:=true;
Chart3.Series[0].Active:=true;
Chart3.Series[1].Active:=true;
Chart4.Series[0].Active:=true;
Chart4.Series[1].Active:=true;
ts.Free;
except
Application.HandleException(Self);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
//或取当前WellID和WellTop 做为后面查询条件
if (Edit16.Text='') or (Edit17.Text='') then exit ;
form2.WellID:=WellID;
form2.WellTop:=Edit16.Text;
form2.WellBottom:=Edit17.Text;
form2.Show;
except
Application.HandleException(Self);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -