📄 u_math.pas
字号:
tvtree.ReadOnly:=True;
pTD:=allocmem(sizeof(rTreedata));
pTD^.Code:='0' ;
pTD^.Name:=FirstNodeTxt ;
Node[currlevel]:= tvTree.Items.AddObject(nil,pTD^.Name,PTD) ;
// MaxLevel:= Length(arrangecode);
qurTree.Close;
qurTree.SQL.Clear;
qurTree.SQL.Add(QStr);
qurTree.open;
if qurTree.IsEmpty=False then qurTree.First
else exit;
while not qurTree.Eof do
begin
pTD:=allocmem(sizeof(rTreedata));
for i:=0 to qurTree.FieldCount-1 do
begin
case i of
0:pTD^.Code:=qurTree.Fields[0].AsString ;
1:pTD^.Name:=qurTree.Fields[1].AsString ;
2:pTD^.DeleteFlag:=qurTree.Fields[2].AsBoolean;
3:pTD^.EndFlag:=qurTree.Fields[3].Asboolean;
4:pTD^.SCode:=qurTree.Fields[4].AsString ;
end;
end;
currLevel:=GetTreeLevel(arrangecode,pTD^.Code); // 返回一个代码级数
if currLevel >0 then
begin
node[currLevel]:= tvTree.Items.AddChildObject(node[currLevel-1],pTD^.Name,PTD) ;
end;
qurTree.Next;
end;
node[0].Expand(False);//将首节点展开
end;
function GetTreeLevel(sFormat,sCode:String):integer; // 返回一个代码级数
var
i,len :integer;
begin
Result:=-1;
Len:=0;
if (sFormat<>'')and(sCode<>'')then
for i:=1 to Length(sFormat) do
begin
Len:=Len+StrToInt(sFormat[i]);
if Len=Length(sCode) then
begin
Result:=i;
Break;
end;
end;
end;
procedure AddTreeNode(tvTree:TTreeView;pTD:pTreedata);//新增结点
var
tTD:TTreenode;
begin
if tvTree.Selected =nil then exit;
tTD:=tvTree.Items.AddChildObject(tvTree.Selected,pTD^.Name,pTD);
end;
procedure EditTreeNode(tvTree:TTreeView;pTD:pTreedata);//修改结点
begin
if tvTree.Selected =nil then exit;
tvTree.Selected.Data:=ptd;
tvTree.Selected.Text:=ptd^.Name;
tvTree.Selected.Focused:=True;
end;
function InttoStrl(value,len:dword):string; //格式化数值为0000000
begin
result:=inttostr(value);
while length(result)<len do
result:='0'+result;
end;
procedure DestoryTree(tvTree:TTreeView);//摧毁树
var
i:integer;
pTD:pTreedata;
begin
if tvTree.Items.Count<=0 then exit;
for i:=0 to tvTree.Items.Count-1 do
begin
if tvTree.Items[i].Data<>nil then
begin
pTD:=tvTree.Items[i].Data;
With pTD^ Do
begin
Code:=EmptyStr;
Name:=EmptyStr;
DeleteFlag:=False;
EndFlag:=False;
sCode:=EmptyStr;
freemem(pTD,sizeof(rTreedata));
end ;
tvTree.Items[i].Data:=nil;
end;
end;
end;
function DeleteTreeItem(tNode:TTreeNode):Boolean; //删除树结点
var
pTD:pTreedata;
begin
Result:=False;
ptd:=tNode.Data;
With pTD^ Do
begin
Code:=EmptyStr;
Name:=EmptyStr;
DeleteFlag:=False;
EndFlag:=False;
freemem(pTD,sizeof(rTreedata));
end ;
tnode.Data:=nil;
tNode.Delete;
Result:=True;
end;
procedure GetNewTreeCode(tvTree:TTreeView;var s :string;Rule:string;var success:integer);//取得新树结点
var
pCTD,pNTD:pTreedata;
Ncode:string;//新编码
m:integer;
function GetlevelMaxnum(i:integer):integer;
var
j:integer;
s:string;
begin
s:='';
for j:=1 to i do
begin
s:=s+'9' ;
end;
result:=strtoint(s);
end;
begin
success:=0;
if tvTree.Selected.Level+1>Length(Rule) then
begin
MessageDlg('最大只能分为'+inttostr(Length(Rule))+'级!',mtConfirmation,[mbYes],0);
exit;
end;
pCTD:=tvTree.Selected.Data; //当前结点
if strtoint(RightStr(pCTD^.Code,strtoint(Copy(Rule,tvTree.Selected.Level+1,1))))>=GetlevelMaxnum(strtoint(Copy(Rule,tvTree.Selected.Level+1,1))) then
begin
MessageDlg('当前目录已经用完,不能再新增!',mtConfirmation,[mbYes],0);
exit;
end;
if tvTree.Selected.Level<>0 then
begin
Ncode:=pCTD^.Code;
end
else
begin
Ncode:='';
end;
if tvTree.Selected.getFirstChild<>nil then
begin
pNTD:=tvTree.Selected.GetLastChild.Data ;//新结点
Ncode:= pNTD^.Code;
m:=strtoint(RightStr(Ncode,strtoint(Copy(Rule,tvTree.Selected.Level+1,1))))+1;
Ncode:=copy(Ncode,1,length(Ncode)-strtoint(Copy(Rule,tvTree.Selected.Level+1,1)))
+ InttoStrl(m,strtoint(Copy(Rule,tvTree.Selected.Level+1,1)));
end
else
begin
m:=1;
Ncode:=Ncode+ InttoStrl(m,strtoint(Copy(Rule,tvTree.Selected.Level+1,1)));
end;
s:=Ncode;
success:=1;
end;
function GetPyBm(Str:string):string; //取得拼音简码
const
SqlStr='select * from Sys_Dict where hz=:hz';
var
qryFree:TQuery;
i:integer;
s:string;
//GetPyChar 从数据字典中取出拼音编码
function GetPyChar(Hz:String):String;
begin
Result:='';
with qryFree do
begin
close;
sql.clear;
SQL.Text:=SqlStr;
params.ParamByName('hz').Asstring:=Hz;
open;
if not qryFree.IsEmpty then
Result:=FieldbyName('py').AsString;
end;
end;
begin
i:=1;
s:='';
try
qryFree:=TQuery.Create(nil);
qryFree.DatabaseName:=DataMod.DBMain.DatabaseName;
while i<=length(Str) do
begin
if Ord(Str[i])>160 then //如果大于160表示是汉字
begin
s:=s+GetPyChar(Copy(Str,i,2));
inc(i);
end
else begin //如果小于160表示是非汉字
if (Str[i] in ['a'..'z'])or(Str[i] in ['A'..'Z']) or
(Str[i] in ['0'..'9']) then
s:=s+UpperCase(Str[i]);
end;
inc(i);
end;
Result:=s;
finally
qryFree.Free;
end;
end;
function GetMonthDayNum(ADate:TDateTime):Integer;//得到任意月天数
var
MyMonth,
MyYear,
MyDay : Word;
MyDayTable : TDayTable;
tmpBool : Boolean;
begin
DecodeDate(ADate, MyYear, MyMonth, MyDay);
tmpBool := IsLeapYear(MyYear);
MyDayTable := MonthDays[tmpBool];
Result := MyDayTable[MyMonth];
end;
function GetDecodeDate(ADate:TDateTime):string;
var
y,m,d:word;
begin
DecodeDate(ADate,y,m,d);
Result:=Formatfloat('0000',y)+'年'+Formatfloat('00',m)+'月'+Formatfloat('00',d)+'日';
end;
function CheckDate(sDate:string):Boolean;
var
dDate:TDate;
begin
try
dDate:=strtodate(copy(sdate,1,4)+'-'+copy(sdate,7,2)+'-'+copy(sdate,11,2));
except
MessageDlg('日期格式不正确,请重新填写!',mtConfirmation,[mbYes],0);
exit;
end;
end;
procedure AdjustDropDownForm(AControl : TControl; HostControl: TControl);
var
WorkArea: TRect;
HostP, PDelpta: TPoint;
begin
SystemParametersInfo(SPI_GETWORKAREA,0,@WorkArea,0);
HostP := HostControl.ClientToScreen(Point(0,0));
PDelpta := AControl.ClientToScreen(Point(0,0));
AControl.Left := HostP.x;
AControl.Top := HostP.y + HostControl.Height + 1;
if (AControl.Width > WorkArea.Right - WorkArea.Left) then
AControl.Width := WorkArea.Right - WorkArea.Left;
if (AControl.Left + AControl.Width > WorkArea.Right) then
AControl.Left := WorkArea.Right - AControl.Width;
if (AControl.Left < WorkArea.Left) then
AControl.Left := WorkArea.Left;
if (AControl.Top + AControl.Height > WorkArea.Bottom) then
begin
if (HostP.y - WorkArea.Top > WorkArea.Bottom - HostP.y - HostControl.Height) then
AControl.Top := HostP.y - AControl.Height;
end;
if (AControl.Top < WorkArea.Top) then
begin
AControl.Height := AControl.Height - (WorkArea.Top - AControl.Top);
AControl.Top := WorkArea.Top;
end;
if (AControl.Top + AControl.Height > WorkArea.Bottom) then
begin
AControl.Height := WorkArea.Bottom - AControl.Top;
end;
end;
function EditMask(s:string;Len:integer):string;
var
s1:string;
i:integer;
begin
s1:='';
s1:=s;
for i:=1 to Len do
begin
s1:=s1+'a';
end;
s1:=s1+';1;_' ;
Result:=s1;
end;
function PartitionSize(Size:string):string;
var
Rs,s:String;
begin
Rs:='';
s:=Size;
while s<>EmptyStr do
begin
if pos('/',s)>0 then
begin
Rs:=Rs+' , #'+copy(s,1,pos('/',s)-1)+'=Null';
delete(s,1,pos('/',s)) ;
end
else
begin
Rs:=Rs+' , #'+s+'=null ';
delete(s,1,Length(s));
end;
end;
Result:=Rs;
end;
procedure GetCurrPath;
var
currpath:string;
i:integer;
begin
currpath:=application.ExeName;
for i:=Length(Currpath) downto 1 do
if CurrPath[i]='\' then break;
//gAppPath:=copy(currPath,1,i);
end;
procedure CreateBomTree(tvTree:TTreeView;arrangecode:string;FirstNodeTxt:string;qurTree:Tquery);// Bom 树 arrange 排列编码 tNodes 结点
var
currLevel,childlevel:integer;
pTD:pTreedata;
Node:array[0..100] of TTreeNode;
i,j:integer;
nodequery,childquery :TQuery;
begin
currlevel:=0;
childlevel:=0;
tvtree.Items.Clear;
tvtree.ShowRoot:=False;
tvtree.ReadOnly:=True;
pTD:=allocmem(sizeof(rTreedata));
pTD^.Code:='0' ;
pTD^.Name:=FirstNodeTxt ;
Node[currlevel]:= tvTree.Items.AddObject(nil,pTD^.Name,PTD) ;
// MaxLevel:= Length(arrangecode);
qurTree.Close;
qurTree.SQL.Clear;
qurTree.SQL.Add('select PTcode, Ptype from Tech_ProductType where DeleteFlag=0 ' );
qurTree.open;
if qurTree.IsEmpty=False then qurTree.First
else exit;
nodequery:=TQuery.Create(nil);
//childquery:=Tquery.create(nil);
nodequery.DatabaseName:='dbmain';
// childquery.DatabaseName:='dbmain';
try
while not qurTree.Eof do
begin
pTD:=allocmem(sizeof(rTreedata));
for i:=0 to qurTree.FieldCount-1 do
begin
case i of
0:pTD^.Code:=qurTree.Fields[0].AsString ;
1:pTD^.Name:=qurTree.Fields[1].AsString ;
end;
pTD^.EndFlag:=False;
end;
currLevel:=GetTreeLevel(arrangecode,pTD^.Code); // 返回一个代码级数
if currLevel >0 then
begin
node[currLevel]:= tvTree.Items.AddChildObject(node[currLevel-1],pTD^.Name,PTD) ;
nodeQuery.Close;
nodequery.SQL.Clear;
nodequery.SQL.Add('select Agnateid,AgnateName from Tech_BomBrief where PTCode=:PTcode ');
nodequery.ParamByName('PTCode').Asstring:=qurtree.fieldbyname('PTCode').AsString;
nodequery.Open;
nodequery.First;
while not nodequery.Eof do
begin
pTD:=allocmem(sizeof(rTreedata));
PTD^.Code:=nodeQuery.fieldbyname('Agnateid').AsString;
pTD^.Name:=nodeQuery.fieldbyname('AgnateName').AsString;
pTD^.EndFlag:=True;
node[currlevel+1]:=tvTree.Items.AddChildObject(node[currLevel],pTD^.Name,PTD) ;
{ childquery.Close;
childquery.SQL.Clear;
childquery.SQL.Add(' select a.childid, ChilName=(select AgnateName from Tech_BomBrief where Agnateid=a.childid) '
+' from Tech_BomStructure a where a.Fatherid=:Fatherid ');
childquery.ParamByName('Fatherid').AsInteger:= nodeQuery.fieldbyname('Agnateid').asinteger;
childquery.Open;
if childquery.IsEmpty=False then
begin
childlevel:=currLevel+1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -