This commit is contained in:
parent
a0717b7cd3
commit
d295888137
|
|
@ -2886,6 +2886,7 @@ type TEditer=class(TCustomcontrol) //
|
||||||
subit.Parent := it;
|
subit.Parent := it;
|
||||||
subit.OnClick := thisfunction(PageEditerMenuClick);
|
subit.OnClick := thisfunction(PageEditerMenuClick);
|
||||||
end
|
end
|
||||||
|
FPageEditerMenus[v] := it;
|
||||||
continue;
|
continue;
|
||||||
end
|
end
|
||||||
FPageEditerMenus[v]:= it;
|
FPageEditerMenus[v]:= it;
|
||||||
|
|
@ -2900,11 +2901,12 @@ type TEditer=class(TCustomcontrol) //
|
||||||
begin
|
begin
|
||||||
zd := GetCurrentItem().FEditer.Readonly;
|
zd := GetCurrentItem().FEditer.Readonly;
|
||||||
rd.Checked := zd;
|
rd.Checked := zd;
|
||||||
it := FPageEditerMenus["Õ³Ìù(V)"];
|
for ii,vv in array("转换为大写","转换为小写","删除尾空白","粘贴(V)","剪切(X)","文档格式") do
|
||||||
if it then it.Enabled := not zd;
|
begin
|
||||||
it := FPageEditerMenus["¼ôÇÐ(X)"];
|
it := FPageEditerMenus[vv];
|
||||||
if it then it.Enabled := not zd;
|
if it then it.Enabled := not zd;
|
||||||
end
|
end
|
||||||
|
end
|
||||||
rd := FPageEditerMenus["²é¿´"];
|
rd := FPageEditerMenus["²é¿´"];
|
||||||
if rd then
|
if rd then
|
||||||
begin
|
begin
|
||||||
|
|
@ -3523,6 +3525,7 @@ type TEditer=class(TCustomcontrol) //
|
||||||
function upperorlowercase(f);
|
function upperorlowercase(f);
|
||||||
begin
|
begin
|
||||||
ed := GetCurrentEditer();
|
ed := GetCurrentEditer();
|
||||||
|
if ed.ReadOnly then return ;
|
||||||
IF not ed then return;
|
IF not ed then return;
|
||||||
s := ed.SelText;
|
s := ed.SelText;
|
||||||
if s then
|
if s then
|
||||||
|
|
|
||||||
|
|
@ -85,8 +85,8 @@ type TFTSLScriptcustomMemo=class(TSYNmemoNorm)
|
||||||
begin
|
begin
|
||||||
fy :=(FirstLine-TopLine) * LineHeight;
|
fy :=(FirstLine-TopLine) * LineHeight;
|
||||||
r := ClientRect;
|
r := ClientRect;
|
||||||
if fy<r[1]then return;
|
if fy<(r[1]-2) then return;
|
||||||
if fy>r[3]then return;
|
if fy>(r[3]+2)then return;
|
||||||
r[0]:= GutterWidth;
|
r[0]:= GutterWidth;
|
||||||
r[1]:= max(0,fy);
|
r[1]:= max(0,fy);
|
||||||
InvalidateRect(r,false);
|
InvalidateRect(r,false);
|
||||||
|
|
@ -615,8 +615,8 @@ type TTslDebuga=class(TCustomControl)
|
||||||
FDebugUsr := 0;
|
FDebugUsr := 0;
|
||||||
FDebugPwd := 0;
|
FDebugPwd := 0;
|
||||||
deletefuncacheini();
|
deletefuncacheini();
|
||||||
getdebuger(pms);
|
getdebuger(pms,pdir);
|
||||||
exestr := format('"%s" "%s" -DEBUGSERVER -DEBUGLOGIN 0 -WAITATTACH -DEBUGPORT %d -libpath "%s" ',FDebugExe,FRuningfile,FDebugport,dirs);
|
exestr := format('"%s" "%s" -DEBUGSERVER -DEBUGLOGIN 0 -WAITATTACH -DEBUGPORT %d -libpath "%s" ',FDebugExe,FRuningfile,FDebugport,(pdir?pdir:dirs));
|
||||||
exestr += pms;
|
exestr += pms;
|
||||||
fremotedbugstart := true;
|
fremotedbugstart := true;
|
||||||
fscriptbrks := array();
|
fscriptbrks := array();
|
||||||
|
|
@ -1320,7 +1320,7 @@ type TTslDebuga=class(TCustomControl)
|
||||||
begin
|
begin
|
||||||
fdefaultdbger := gettslexefullpath();
|
fdefaultdbger := gettslexefullpath();
|
||||||
end
|
end
|
||||||
function getdebuger(pms); //»ñµÃµ÷ÊÔ³ÌÐò
|
function getdebuger(pms,pdir); //获得调试程序
|
||||||
begin
|
begin
|
||||||
p := static pluginpath();
|
p := static pluginpath();
|
||||||
global g_debug_chooser;
|
global g_debug_chooser;
|
||||||
|
|
@ -1356,8 +1356,9 @@ type TTslDebuga=class(TCustomControl)
|
||||||
while idx<length(ps) do
|
while idx<length(ps) do
|
||||||
begin
|
begin
|
||||||
psi := ps[idx];
|
psi := ps[idx];
|
||||||
if lowercase(psi)="-libpath" then
|
if lowercase(psi)="-libpath" then //屏蔽此处,让debug和运行的参数保持一致
|
||||||
begin
|
begin
|
||||||
|
pdir :=ps[idx+1];
|
||||||
idx += 2;
|
idx += 2;
|
||||||
continue;
|
continue;
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -452,10 +452,10 @@ type TVclDesigner = class(tvcform)
|
||||||
end
|
end
|
||||||
function CreateTpjFomFile();//新建工程
|
function CreateTpjFomFile();//新建工程
|
||||||
begin
|
begin
|
||||||
FProjectFileOpener.caption := "新建";
|
FProjectFilesave.caption := "н¨";
|
||||||
if FProjectFileOpener.OpenDlg() then
|
if FProjectFilesave.OpenDlg() then
|
||||||
begin
|
begin
|
||||||
f := FProjectFileOpener.FileName;
|
f := FProjectFilesave.FileName;
|
||||||
if parseregexpr(".tpj$",f,"",pp1,pp2,pp3)<>1 then f+=".tpj";
|
if parseregexpr(".tpj$",f,"",pp1,pp2,pp3)<>1 then f+=".tpj";
|
||||||
FProjectsManager.CreateTpjFomFile(f);
|
FProjectsManager.CreateTpjFomFile(f);
|
||||||
end
|
end
|
||||||
|
|
@ -1089,6 +1089,12 @@ type TVclDesigner = class(tvcform)
|
||||||
function toplevelwndkeydown(o,e);
|
function toplevelwndkeydown(o,e);
|
||||||
begin
|
begin
|
||||||
cd := e.CharCode;
|
cd := e.CharCode;
|
||||||
|
if cd=vk_f12 then
|
||||||
|
begin
|
||||||
|
FProjectManager.GoToAFunction(nil);//DBLClickComponent(o,e);
|
||||||
|
FProjectManager.ShowEditor();
|
||||||
|
e.skip := true;
|
||||||
|
end
|
||||||
if cd = VK_ESCAPE then return select_parent();
|
if cd = VK_ESCAPE then return select_parent();
|
||||||
c := e.char;
|
c := e.char;
|
||||||
if not((c in array("X","V","C","Z")) or cd=VK_DELETE) then return ;
|
if not((c in array("X","V","C","Z")) or cd=VK_DELETE) then return ;
|
||||||
|
|
@ -1376,7 +1382,7 @@ type TVclDesigner = class(tvcform)
|
||||||
end
|
end
|
||||||
FTree.Loading := nil;
|
FTree.Loading := nil;
|
||||||
end
|
end
|
||||||
function loadtfmtotree(p,d,node,wr,prs,obarray,inhname,first,outobjs);//当如信息
|
function loadtfmtotree(p,d,node,wr,prs,obarray,inhname,first, outobjs);//µ±ÈçÐÅÏ¢
|
||||||
begin
|
begin
|
||||||
{**
|
{**
|
||||||
@explan(说明) 导入tfm文件 %%
|
@explan(说明) 导入tfm文件 %%
|
||||||
|
|
@ -1609,9 +1615,12 @@ type TVclDesigner = class(tvcform)
|
||||||
ic.Readvcon(HexFormatStrToTsl(GetTsIconBitmapInfo()));
|
ic.Readvcon(HexFormatStrToTsl(GetTsIconBitmapInfo()));
|
||||||
self.FormICon := ic;
|
self.FormICon := ic;
|
||||||
//文件打窗口
|
//文件打窗口
|
||||||
FProjectFileOpener := new TSavefileADlg(self);
|
FProjectFileOpener := new TOpenFileADlg(self);
|
||||||
|
FProjectFilesave := new TSavefileADlg(self);
|
||||||
FProjectFileOpener.filter := array("tvcl工程":"*.tpj");
|
FProjectFileOpener.filter := array("tvcl工程":"*.tpj");
|
||||||
|
FProjectFilesave.filter := array("tvcl¹¤³Ì":"*.tpj");
|
||||||
FProjectFileOpener.parent := self;
|
FProjectFileOpener.parent := self;
|
||||||
|
FProjectFilesave.parent := self;
|
||||||
FProjectManager.FTslEditer.setdbugruncall(thisfunction(debugproject)); //设置调试回调
|
FProjectManager.FTslEditer.setdbugruncall(thisfunction(debugproject)); //设置调试回调
|
||||||
FProjectManager.newmenu.parent := ffilemenu;//
|
FProjectManager.newmenu.parent := ffilemenu;//
|
||||||
FProjectManager.goformmenu.parent := fviewmenu;//
|
FProjectManager.goformmenu.parent := fviewmenu;//
|
||||||
|
|
@ -1729,6 +1738,7 @@ EB43A8AA7C90DAF18A0686290EA76BBE8743AF0DD966D8F5347F12A789A415120
|
||||||
A9CF93B033F9EA579B5AA7EC4E00000000049454E44AE42608200";
|
A9CF93B033F9EA579B5AA7EC4E00000000049454E44AE42608200";
|
||||||
end
|
end
|
||||||
FProjectFileOpener;
|
FProjectFileOpener;
|
||||||
|
FProjectFilesave;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -152,6 +152,7 @@ type t_children_sizer = class()
|
||||||
cidx := 0;
|
cidx := 0;
|
||||||
ridx++;
|
ridx++;
|
||||||
end
|
end
|
||||||
|
wi := 0;hi:=0;
|
||||||
ctl.GetPreferredSize(wi,hi);
|
ctl.GetPreferredSize(wi,hi);
|
||||||
if flayout=1 then
|
if flayout=1 then
|
||||||
r[ridx,cidx] := array(ctl,0,0,wi,hi);
|
r[ridx,cidx] := array(ctl,0,0,wi,hi);
|
||||||
|
|
|
||||||
|
|
@ -1495,10 +1495,11 @@ type tcontrol = class(tcomponent)
|
||||||
fautosizing := true;
|
fautosizing := true;
|
||||||
sf := self(true);
|
sf := self(true);
|
||||||
if (sf is class(TWinControl)) and sf.WsPopUp then return ;
|
if (sf is class(TWinControl)) and sf.WsPopUp then return ;
|
||||||
if Parent then
|
p := Parent;
|
||||||
|
if p then
|
||||||
begin
|
begin
|
||||||
if Parent.autosize then Parent.AdjustSize();
|
if p.autosize then p.AdjustSize();
|
||||||
else if Align<>alNone then Parent.DoControlAlign();
|
else if Align<>alNone then p.DoControlAlign();
|
||||||
end
|
end
|
||||||
fautosizing := false;
|
fautosizing := false;
|
||||||
//excludestate(FControlFlags,cfAutoSizeNeeded);
|
//excludestate(FControlFlags,cfAutoSizeNeeded);
|
||||||
|
|
|
||||||
|
|
@ -4181,493 +4181,34 @@ type tprogressbar = class(tcustomprogressbar)
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
type tmonthcalendar = class(TCustomControl)
|
type tmonthcalendar =class(tcustommonthcalendar)
|
||||||
{**
|
{**
|
||||||
@explan(说明)月历控件
|
@explan(说明)月历控件
|
||||||
该控件的函数可能的返回值:
|
**}
|
||||||
array等期望的数据/1:成功。
|
|
||||||
-1:一般是函数参数格式不正确。
|
|
||||||
nil:该项属性在控件种类正确、窗口未创建、无默认值的情况下未设置过或被重置过。
|
|
||||||
0:失败,可能的原因:
|
|
||||||
1.参数格式正确但不适用于控件的当前状态,如对多选月历设置当前选择项时项数超过其最大多选项数限制。
|
|
||||||
2.控件类型错误,如对单选月历调用设置其最大多选项数限制的函数。
|
|
||||||
3.要求控件创建后才可调用的函数在控件创建之前被调用。
|
|
||||||
4.未知错误。
|
|
||||||
**}
|
|
||||||
function create(aowner);
|
function create(aowner);
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
//TodayButton := false;
|
|
||||||
end
|
end
|
||||||
function AfterConstruction();override;
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
width := 213;
|
|
||||||
height := 175;
|
|
||||||
FCalender := new tVirtualCalender();
|
|
||||||
FCalender.ExecuteCommand("memymd",date());
|
|
||||||
FCalender.Left := 1;
|
|
||||||
FCalender.top := 1;
|
|
||||||
FCalender.host := self(true);
|
|
||||||
end
|
|
||||||
function paint();override;
|
|
||||||
begin
|
|
||||||
if FCalender then FCalender.paint();
|
|
||||||
end
|
|
||||||
function MouseUp(o,e);override;
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
if e.skip then return ;
|
|
||||||
if not FCalender then return ;
|
|
||||||
if e.button()= mbLeft then
|
|
||||||
begin
|
|
||||||
r := FCalender.ExecuteCommand("mestatebypos",e.pos);
|
|
||||||
if r then return ;
|
|
||||||
r := FCalender.ExecuteCommand("megetincpos",e.pos);
|
|
||||||
if r then return FCalender.ExecuteCommand("meminc",r);
|
|
||||||
std := FCalender.ExecuteCommand("mestate");
|
|
||||||
r := FCalender.ExecuteCommand("meselbypos",e.pos);
|
|
||||||
if std=3 or r="today" then
|
|
||||||
begin
|
|
||||||
if FonSelect then
|
|
||||||
CallMessgeFunction(FonSelect,self(true),new tuieventbase(0,0,0,0));
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function getCurrentSelection();begin
|
|
||||||
{**
|
|
||||||
@explan(说明)获取当前选择的日期,该函数仅能用于单选的月历控件%%
|
|
||||||
@return(array/integer/nil)array:成功;0:失败;nil:未设置过此项。
|
|
||||||
array(2019,2,1)
|
|
||||||
**}
|
|
||||||
if FCalender then
|
|
||||||
begin
|
|
||||||
r := FCalender.ExecuteCommand("meymd");
|
|
||||||
decodedate(r,y,m,d);
|
|
||||||
return array(y,m,d);
|
|
||||||
end
|
|
||||||
return 0;
|
|
||||||
end
|
|
||||||
function setCurrentSelection(y,m,d);
|
|
||||||
begin
|
|
||||||
{**
|
|
||||||
@explan(说明)设置当前选择日期,该函数仅能用于单选的月历控件%%
|
|
||||||
@param(y)(integer)年%%
|
|
||||||
@param(m)(integer)月%%
|
|
||||||
@param(d)(integer)日%%
|
|
||||||
@return(integer)1:成功;0:失败;-1:出错%%
|
|
||||||
**}
|
|
||||||
if ifnumber(y) and ifnumber(m) or ifnumber(d) then
|
|
||||||
begin
|
|
||||||
dt := encodedate(y,m,d);
|
|
||||||
if FCalender then
|
|
||||||
begin
|
|
||||||
FCalender.ExecuteCommand("meymd",dt);
|
|
||||||
return 1;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function GetPreferredSize(w,h);override;
|
|
||||||
begin
|
|
||||||
if FCalender then
|
|
||||||
begin
|
|
||||||
FCalender.GetPreferredSize(w,h);
|
|
||||||
w+=1;
|
|
||||||
h+=1;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function DoDatechanged();
|
|
||||||
begin
|
|
||||||
if FonSelectChange then
|
|
||||||
CallMessgeFunction(FonSelectChange,self(true),new tuieventbase(0,0,0,0));
|
|
||||||
end
|
|
||||||
function recycling();override;
|
|
||||||
begin
|
|
||||||
FCalender.recycling();
|
|
||||||
inherited;
|
|
||||||
FCalender := nil;
|
|
||||||
FonSelect := nil;
|
|
||||||
FonSelectChange := nil;
|
|
||||||
end
|
|
||||||
published
|
|
||||||
property onSelectChange read FonSelectChange write FonSelectChange;
|
|
||||||
property TodayButton:bool read getnoTodayButton write setNoTodayButton;
|
|
||||||
property onSelect:eventhandler read FonSelect write FonSelect;
|
|
||||||
property onSelChanged:eventhandler read FonSelectChange write FonSelectChange;
|
|
||||||
{**
|
|
||||||
@param(todayButton)(bool)月历显示“今日”按钮(默认开启)%%
|
|
||||||
@param(onselchanged)(function[tmonthcalendar,tuieventbase])选择日期改变%%
|
|
||||||
**}
|
|
||||||
|
|
||||||
private
|
|
||||||
function setNoTodayButton(v);
|
|
||||||
begin
|
|
||||||
if FCalender then return FCalender.ExecuteCommand("metodaybutton",v);
|
|
||||||
end
|
|
||||||
function getnoTodayButton();
|
|
||||||
begin
|
|
||||||
if FCalender then return FCalender.ExecuteCommand("metodaybutton");
|
|
||||||
end
|
|
||||||
private
|
|
||||||
FCalender;
|
|
||||||
FMousedownState;
|
|
||||||
[weakref]FonSelect;
|
|
||||||
[weakref]FonSelectChange;
|
|
||||||
end
|
end
|
||||||
|
type tdatetimepicker = class(tcustomdatetimepicker)
|
||||||
type tdatetimepicker = class(tthreeEntry)
|
|
||||||
{**
|
{**
|
||||||
@explan(说明) 日期选择控件 %%
|
@explan(说明) 日期选择控件 %%
|
||||||
**}
|
**}
|
||||||
function create(aowner);
|
function create(aowner);
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
caption:="Date/TimePicker";
|
|
||||||
FCalender := new tmonthcalendar(self);
|
|
||||||
FCalender.autosize := true;
|
|
||||||
FCalender.border := true;
|
|
||||||
FCalender.WsPopUp := true;
|
|
||||||
FCalender.parent := self;
|
|
||||||
FCalender.Visible := false;
|
|
||||||
//FScreenRect := _wapi.GetScreenRect();
|
|
||||||
decodedate(date(),y,m,d);
|
|
||||||
setDate(y,m,d);
|
|
||||||
FCalender.onSelect := function(o,e)begin
|
|
||||||
FCalender.Visible := false;
|
|
||||||
d := FCalender.getCurrentSelection();
|
|
||||||
setDate(d[0],d[1],d[2]);
|
|
||||||
end
|
end
|
||||||
FCalender.OnActivate := function(o,e)begin
|
|
||||||
if e.wparam=0 then
|
|
||||||
begin
|
|
||||||
FCalender.Visible := false;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function btnclicked(p);override;
|
|
||||||
begin
|
|
||||||
rec := BtnRect;
|
|
||||||
if pointinrect(p,rec) then
|
|
||||||
begin
|
|
||||||
ShowDropDown(true);
|
|
||||||
return true;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function ExecuteCommand(cmd,p);override;
|
|
||||||
begin
|
|
||||||
case cmd of
|
|
||||||
"dtchanged":
|
|
||||||
begin
|
|
||||||
es := entrys;
|
|
||||||
if p = es[2] then //日
|
|
||||||
begin
|
|
||||||
pn := getenumber(p);
|
|
||||||
y := getenumber(es[0]);
|
|
||||||
m := getenumber(es[1]);
|
|
||||||
if pn<1 then p.text := inttostr(getmonthdates(y,m));
|
|
||||||
else
|
|
||||||
if pn>28 and pn>getmonthdates(y,m) then
|
|
||||||
begin
|
|
||||||
p.text := "1";
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
if p = es[1] then //月
|
|
||||||
begin
|
|
||||||
y := getenumber(es[0]);
|
|
||||||
m := getenumber(es[1]);
|
|
||||||
bm := m;
|
|
||||||
if m>12 then
|
|
||||||
begin
|
|
||||||
m := 1;
|
|
||||||
end else
|
|
||||||
if m<1 then m := 12;
|
|
||||||
if bm<>m then
|
|
||||||
begin
|
|
||||||
p.text := inttostr(m);
|
|
||||||
end
|
|
||||||
d := getenumber(es[2]);
|
|
||||||
if d<1 then es[2].text := "1";
|
|
||||||
else
|
|
||||||
if d>28 then
|
|
||||||
begin
|
|
||||||
ct := getmonthdates(y,m);
|
|
||||||
if d>ct then es[2].text := inttostr(ct);
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
if p = es[0] then //年
|
|
||||||
begin
|
|
||||||
y := getenumber(p);
|
|
||||||
m := getenumber(es[1]);
|
|
||||||
d := getenumber(es[2]);
|
|
||||||
if dt>28 then
|
|
||||||
begin
|
|
||||||
ct := getmonthdates(y,m);
|
|
||||||
if d>ct then es[2].text := inttostr(ct);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if Fonselectchange then
|
|
||||||
calldatafunction(Fonselectchange,self(true),new tuieventbase(0,0,0,0));
|
|
||||||
end
|
|
||||||
"dtadate":
|
|
||||||
begin
|
|
||||||
es := entrys;
|
|
||||||
if ifarray(p) and ifnumber(p[0]) and ifnumber(p[1]) and ifnumber(p[2]) then
|
|
||||||
begin
|
|
||||||
dt := encodedate(p[0],p[1],p[2]);
|
|
||||||
decodedate(dt,y,m,d);
|
|
||||||
es[0].text := inttostr(y);
|
|
||||||
es[1].text := inttostr(m);
|
|
||||||
es[2].text := inttostr(d);
|
|
||||||
if Fonselectchange then
|
|
||||||
calldatafunction(Fonselectchange,self(true),new tuieventbase(0,0,0,0));
|
|
||||||
end else
|
|
||||||
begin
|
|
||||||
y := strtointdef(es[0].text,2021);
|
|
||||||
m := strtointdef(es[1].text,1);
|
|
||||||
d := strtointdef(es[2].text,1);
|
|
||||||
return array(y,m,d);
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function ShowDropDown(f);virtual;
|
|
||||||
begin
|
|
||||||
{**
|
|
||||||
@explan(说明) 设置弹出框的显示区域 %%
|
|
||||||
**}
|
|
||||||
if not(FCalender ) then return ;
|
|
||||||
nv := ifnil(f)?true:(f?true:false);
|
|
||||||
if FCalender.Visible = nv then return FCalender.show(0);
|
|
||||||
rc := ClientRect;
|
|
||||||
nrc := ClientToScreen(rc[0],rc[3]);
|
|
||||||
p2 := clienttoscreen(rc[0],rc[1]+FCalender.height);
|
|
||||||
src := _wapi.GetScreenRect(nrc);
|
|
||||||
if (src[3]<p2[1]) then //由于缩放问题暂时屏蔽
|
|
||||||
begin
|
|
||||||
nrc := ClientToScreen(rc[0],rc[1]-FCalender.height);
|
|
||||||
end
|
|
||||||
FCalender.Left := nrc[0];
|
|
||||||
FCalender.top := nrc[1];
|
|
||||||
dt := getDate();
|
|
||||||
FCalender.setCurrentSelection(dt[0],dt[1],dt[2]);
|
|
||||||
FCalender.show();
|
|
||||||
end
|
|
||||||
function getDate();
|
|
||||||
begin
|
|
||||||
{**
|
|
||||||
@explan(说明) 获得日期 %%
|
|
||||||
@return(array) array(y,m,d) %%
|
|
||||||
**}
|
|
||||||
return ExecuteCommand("dtadate");
|
|
||||||
end
|
|
||||||
function setDate(y,m,d);
|
|
||||||
begin
|
|
||||||
{**
|
|
||||||
@explan(说明) 获得日期 %%
|
|
||||||
@param(y)(integer) 年 %%
|
|
||||||
@param(m)(integer) 月 %%
|
|
||||||
@param(d)(integer) 日 %%
|
|
||||||
**}
|
|
||||||
return ExecuteCommand("dtadate",array(y,m,d));
|
|
||||||
end
|
|
||||||
function recycling();override;
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
FCalender := nil;
|
|
||||||
Fonselectchange := nil;
|
|
||||||
end
|
|
||||||
published
|
|
||||||
property onselectchange:eventhandler read Fonselectchange write Fonselectchange;
|
|
||||||
property onselchanged:eventhandler read Fonselectchange write Fonselectchange;
|
|
||||||
{
|
|
||||||
@param(onselchanged)(function[tdatetimepicker,tuieventbase])选择日期改变%%
|
|
||||||
}
|
|
||||||
private
|
|
||||||
function getenumber(e);
|
|
||||||
begin
|
|
||||||
t := e.text;
|
|
||||||
ti := strtointdef(t,1);
|
|
||||||
return ti;
|
|
||||||
end
|
|
||||||
//FScreenRect;
|
|
||||||
FCalender;
|
|
||||||
[weakref]Fonselectchange;
|
|
||||||
end
|
end
|
||||||
type ttimepicker = class(tthreeEntry)
|
type ttimepicker = class(tcustomtimepicker)
|
||||||
function create(aowner);
|
{**
|
||||||
begin
|
@explan(说明) 时间选择控件 %%
|
||||||
inherited;
|
**}
|
||||||
caption := "timepicker";
|
function create(AOwner);
|
||||||
width := 120;
|
|
||||||
ExecuteCommand("dttime",now());
|
|
||||||
end
|
|
||||||
function ExecuteCommand(cmd,p);override;
|
|
||||||
begin
|
|
||||||
case cmd of
|
|
||||||
"dttime":
|
|
||||||
begin
|
|
||||||
if ifnumber(p) then
|
|
||||||
begin
|
|
||||||
decodedatetime(p,y,mt,d,h,m,s,ms);
|
|
||||||
ExecuteCommand("dtatime",array(h,m,s));
|
|
||||||
|
|
||||||
end else
|
|
||||||
begin
|
|
||||||
r := ExecuteCommand("dtatime");
|
|
||||||
r2 := encodedatetime(2021,1,1,r[0],r[1],r[2],0);
|
|
||||||
if ifarray(r) then
|
|
||||||
begin
|
|
||||||
return frac(r2);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
"dtatime":
|
|
||||||
begin
|
|
||||||
es := entrys;
|
|
||||||
if ifarray(p) and ifnumber(p[0]) and ifnumber(p[1]) and ifnumber(p[1]) then
|
|
||||||
begin
|
|
||||||
es[0].text := inttostr(p[0]);
|
|
||||||
es[1].text := inttostr(p[1]);
|
|
||||||
es[2].text := inttostr(p[2]);
|
|
||||||
ExecuteCommand("dtchanged",es[2]);
|
|
||||||
end else
|
|
||||||
begin
|
|
||||||
r := array();
|
|
||||||
for i,v in es do r[i] := strtointdef(v.text,0);
|
|
||||||
return r;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
"dtchanged":
|
|
||||||
begin
|
|
||||||
es := entrys;
|
|
||||||
if es[2]=p then
|
|
||||||
begin
|
|
||||||
t := p.text;
|
|
||||||
ti := strtointdef(t,0);
|
|
||||||
if ti<0 then
|
|
||||||
begin
|
|
||||||
p.text := "59";
|
|
||||||
es[1].dec();
|
|
||||||
end else
|
|
||||||
if ti>59 then
|
|
||||||
begin
|
|
||||||
p.text := "0";
|
|
||||||
es[1].inc();
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
if es[1] = p then
|
|
||||||
begin
|
|
||||||
t := p.text;
|
|
||||||
ti := strtointdef(t,0);
|
|
||||||
if ti<0 then
|
|
||||||
begin
|
|
||||||
p.text := "59";
|
|
||||||
es[0].dec();
|
|
||||||
end else
|
|
||||||
if ti>59 then
|
|
||||||
begin
|
|
||||||
p.text := "0";
|
|
||||||
es[0].inc();
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
if es[0] = p then
|
|
||||||
begin
|
|
||||||
t := p.text;
|
|
||||||
ti := strtointdef(t,0);
|
|
||||||
if ti<0 then p.text := "24";
|
|
||||||
else if ti>24 then p.text := "0";
|
|
||||||
end
|
|
||||||
if Fonselectchange then
|
|
||||||
calldatafunction(Fonselectchange,self(true),new tuieventbase(0,0,0,0));
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function PaintBtn();override;
|
|
||||||
begin
|
|
||||||
if FRectUp then
|
|
||||||
begin
|
|
||||||
dc := Canvas;
|
|
||||||
dc.Draw("framecontrol",array(FRectUp[0:1],FRectUp[2:3]),DFC_SCROLL,DFCS_SCROLLUP);
|
|
||||||
dc.Draw("framecontrol",array(FRectDown[0:1],FRectDown[2:3]),DFC_SCROLL,DFCS_SCROLLDOWN);
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function btnClicked(p);virtual;
|
|
||||||
begin
|
|
||||||
if pointinrect(p,FRectUp) then
|
|
||||||
begin
|
|
||||||
for i,v in entrys do
|
|
||||||
begin
|
|
||||||
if v.HasFocus then
|
|
||||||
begin
|
|
||||||
v.inc();
|
|
||||||
return 1;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end else
|
|
||||||
if pointinrect(p,FRectDown) then
|
|
||||||
begin
|
|
||||||
for i,v in entrys do
|
|
||||||
begin
|
|
||||||
if v.HasFocus then
|
|
||||||
begin
|
|
||||||
v.dec();
|
|
||||||
return 1;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function getTime();override;begin
|
|
||||||
{**
|
|
||||||
@explan(说明)获取控件当前选择的时间%%
|
|
||||||
@return(array)%%
|
|
||||||
**}
|
|
||||||
return ExecuteCommand("dtatime");
|
|
||||||
end
|
|
||||||
function setTime(h,m,s);override;begin
|
|
||||||
{**
|
|
||||||
@explan(说明)设置控件当前选择的时间%%
|
|
||||||
@param(h)(integer)时,24小时制%%
|
|
||||||
@param(m)(integer)分%%
|
|
||||||
@param(s)(integer)秒%%
|
|
||||||
**}
|
|
||||||
return ExecuteCommand("dtatime",array(h,m,s));
|
|
||||||
end
|
|
||||||
function recycling();override;
|
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
published
|
|
||||||
property onselectchange read Fonselectchange write Fonselectchange;
|
|
||||||
property onselchanged:eventhandler read Fonselectchange write Fonselectchange;
|
|
||||||
{
|
|
||||||
@param(onselchanged)(function[ttimepicker,tuieventbase])选择日期改变%%
|
|
||||||
}
|
|
||||||
protected
|
|
||||||
function calcCtls();override;
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
rec := BtnRect;
|
|
||||||
FRectUp := array(rec[0],rec[1],rec[2],integer(rec[1]+rec[3]/2));
|
|
||||||
FRectDown := array(rec[0],integer(rec[1]+rec[3]/2),rec[2],rec[3]);
|
|
||||||
end
|
|
||||||
private
|
|
||||||
function getEntryWidth(i);virtual;
|
|
||||||
begin
|
|
||||||
return 2;
|
|
||||||
end
|
|
||||||
function getSym(i);virtual;
|
|
||||||
begin
|
|
||||||
return ":";
|
|
||||||
end
|
|
||||||
FRectUp;
|
|
||||||
FRectDown;
|
|
||||||
[weakref]Fonselectchange;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
type tipaddr = class(tcustomipaddr)
|
type tipaddr = class(tcustomipaddr)
|
||||||
{**
|
{**
|
||||||
@explan(说明) ip控件 %%
|
@explan(说明) ip控件 %%
|
||||||
|
|
@ -4858,6 +4399,7 @@ type TDragImageList=class(TCustomImageList)
|
||||||
property Dragging:Boolean read FDragging;
|
property Dragging:Boolean read FDragging;
|
||||||
property ImageIndex read FImageIndex write FImageIndex;
|
property ImageIndex read FImageIndex write FImageIndex;
|
||||||
end
|
end
|
||||||
|
//////////gdi对象//////////////////////////////////////
|
||||||
type TImage = class(tcustomimage)
|
type TImage = class(tcustomimage)
|
||||||
function create();
|
function create();
|
||||||
begin
|
begin
|
||||||
|
|
@ -4865,7 +4407,6 @@ type TImage = class(tcustomimage)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
type TBitmap = class(tcustombitmap)
|
type TBitmap = class(tcustombitmap)
|
||||||
|
|
||||||
function create();override;
|
function create();override;
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
|
|
@ -4876,7 +4417,6 @@ type TIcon = class(tcustomicon)
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
type tcursor = class(tcustomcursor)
|
type tcursor = class(tcustomcursor)
|
||||||
function create();override;
|
function create();override;
|
||||||
|
|
@ -4884,28 +4424,25 @@ type tcursor = class(tcustomcursor)
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
type TFont = class(tcustomfont)
|
type TFont = class(tcustomfont)
|
||||||
function create();override;
|
function create();override;
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
type tpen = class(tcustompen)
|
type tpen = class(tcustompen)
|
||||||
function create();override;
|
function create();override;
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
type TBrush = class(tcustombrush)
|
type TBrush = class(tcustombrush)
|
||||||
function create();override;
|
function create();override;
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
///////////////////////////////////////
|
||||||
type TCanvas = class(TCustomcanvas)
|
type TCanvas = class(TCustomcanvas)
|
||||||
function create();override;
|
function create();override;
|
||||||
begin
|
begin
|
||||||
|
|
@ -4921,10 +4458,7 @@ type TTimer = class(TCustomTimer)
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
//******action 相关*****************************************
|
//******action 相关*****************************************
|
||||||
|
|
||||||
|
|
||||||
type TAction=class(TCustomAction)
|
type TAction=class(TCustomAction)
|
||||||
{**
|
{**
|
||||||
@explan(说明) action / command 类 对外接口,参考 TCustomAction 类 %%
|
@explan(说明) action / command 类 对外接口,参考 TCustomAction 类 %%
|
||||||
|
|
@ -4941,7 +4475,6 @@ type tactionlist =class(TCustomactionlist)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
//*****************************
|
//*****************************
|
||||||
type TMessageboxADlg = class(TcustommsgADlg)
|
type TMessageboxADlg = class(TcustommsgADlg)
|
||||||
{**
|
{**
|
||||||
|
|
@ -4979,7 +4512,6 @@ type TSavefileADlg = class(tcustomfsdlg)
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
type TOpenFileADlg=class(tcustomfsdlg)
|
type TOpenFileADlg=class(tcustomfsdlg)
|
||||||
{**
|
{**
|
||||||
|
|
@ -6055,16 +5587,12 @@ type TTipMessageButton = class(TcustomTipMessageButton)
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type TInPutQuerys = class(TcustomInPutQuerys)
|
type TInPutQuerys = class(TcustomInPutQuerys)
|
||||||
function create(AOwner);
|
function create(AOwner);
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
///////////////tmf文件转换///////////////////////
|
///////////////tmf文件转换///////////////////////
|
||||||
type Ttfm2Component = class(TTmfParser)
|
type Ttfm2Component = class(TTmfParser)
|
||||||
|
|
@ -7017,7 +6545,6 @@ begin
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
function initlib();
|
function initlib();
|
||||||
begin
|
begin
|
||||||
|
|
@ -7028,7 +6555,7 @@ begin
|
||||||
end
|
end
|
||||||
|
|
||||||
Initialization
|
Initialization
|
||||||
initlib();
|
initlib();
|
||||||
Finalization
|
Finalization
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2640,17 +2640,24 @@ type TWinControl = class(tcontrol)
|
||||||
crec := ClientRect;
|
crec := ClientRect;
|
||||||
dw := (brec[2]-brec[0])-(crec[2]-crec[0]);
|
dw := (brec[2]-brec[0])-(crec[2]-crec[0]);
|
||||||
dh := (brec[3]-brec[1])-(crec[3]-crec[1]);
|
dh := (brec[3]-brec[1])-(crec[3]-crec[1]);
|
||||||
|
dh1 := crec[1];
|
||||||
|
dh2 := dh-dh1;
|
||||||
|
dw1 := crec[0];
|
||||||
|
dw2 := dw-dw1;
|
||||||
cs := fchildsizing;
|
cs := fchildsizing;
|
||||||
if autosize and cs.layout>0 then
|
if autosize and cs.layout>0 then
|
||||||
begin
|
begin
|
||||||
dh += cs.topbottomspacing;
|
dh1 += cs.topbottomspacing;
|
||||||
dw += cs.leftrightspacing;
|
dw1 += cs.leftrightspacing;
|
||||||
|
dh2 += cs.topbottomspacing;
|
||||||
|
dw2 += cs.leftrightspacing;
|
||||||
end
|
end
|
||||||
cts := Controls;
|
cts := Controls;
|
||||||
w := 0;
|
w := 0;
|
||||||
h := 0;
|
h := 0;
|
||||||
aw := 0;
|
aw := 0;
|
||||||
ah := 0;
|
ah := 0;
|
||||||
|
cc := 0;
|
||||||
for i := 0 to ControlCount-1 do
|
for i := 0 to ControlCount-1 do
|
||||||
begin
|
begin
|
||||||
it := cts[i];
|
it := cts[i];
|
||||||
|
|
@ -2658,6 +2665,51 @@ type TWinControl = class(tcontrol)
|
||||||
if not it.Visible then continue;
|
if not it.Visible then continue;
|
||||||
if (it is class(TWinControl)) and it.WsPopUp then continue;
|
if (it is class(TWinControl)) and it.WsPopUp then continue;
|
||||||
ita := it.Align;
|
ita := it.Align;
|
||||||
|
case ita of
|
||||||
|
alNone:
|
||||||
|
begin
|
||||||
|
ibrc := it.BoundsRect;
|
||||||
|
w := max(ibrc[2],w);
|
||||||
|
h := max(ibrc[3],h);
|
||||||
|
end
|
||||||
|
alLeft,alRight:
|
||||||
|
begin
|
||||||
|
it.GetPreferredSize(wi,hi);
|
||||||
|
aw+=wi;
|
||||||
|
ah := max(ah,hi);
|
||||||
|
end
|
||||||
|
alTop,alBottom:
|
||||||
|
begin
|
||||||
|
it.GetPreferredSize(wi,hi);
|
||||||
|
ah += hi;
|
||||||
|
aw := max(wi,aw);
|
||||||
|
end
|
||||||
|
alClient:
|
||||||
|
begin
|
||||||
|
if cc<1 then
|
||||||
|
begin
|
||||||
|
//cc++;
|
||||||
|
if it.autosize then
|
||||||
|
begin
|
||||||
|
it.GetPreferredSize(wi,hi);
|
||||||
|
ah += hi;
|
||||||
|
aw += wi;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
bs := it.UnAlignBounds;
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
if bs then
|
||||||
|
begin
|
||||||
|
ah :=max(ah, bs[3]-bs[1]);
|
||||||
|
aw :=max(aw,(bs[2]-bs[0]));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
{
|
||||||
if ita=alNone then
|
if ita=alNone then
|
||||||
begin
|
begin
|
||||||
ibrc := it.BoundsRect;
|
ibrc := it.BoundsRect;
|
||||||
|
|
@ -2683,14 +2735,13 @@ type TWinControl = class(tcontrol)
|
||||||
ah += bs[3]-bs[1];
|
ah += bs[3]-bs[1];
|
||||||
aw +=(bs[2]-bs[0]);
|
aw +=(bs[2]-bs[0]);
|
||||||
end
|
end
|
||||||
|
end}
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
w := max(w,aw);
|
w := max(w,aw);
|
||||||
h := max(h,ah);
|
h := max(h,ah);
|
||||||
w+=dw;
|
w+=dw2;
|
||||||
h+=dh;
|
h+=dh2;
|
||||||
|
|
||||||
end
|
end
|
||||||
procedure DoControlAlign({rect});override;
|
procedure DoControlAlign({rect});override;
|
||||||
begin
|
begin
|
||||||
|
|
@ -2793,7 +2844,7 @@ type TWinControl = class(tcontrol)
|
||||||
@param(msg)(integer)ÏûÏ¢ºÅ %%
|
@param(msg)(integer)ÏûÏ¢ºÅ %%
|
||||||
@param(wparam)(integer)wparam %%
|
@param(wparam)(integer)wparam %%
|
||||||
@param(lparam)(integer)lparam %%
|
@param(lparam)(integer)lparam %%
|
||||||
@param(param)(bool) true 采用post false 采用send %%
|
@param(f)(bool) true ²ÉÓÃpost false ²ÉÓÃsend %%
|
||||||
@return(pointer)
|
@return(pointer)
|
||||||
|
|
||||||
**}
|
**}
|
||||||
|
|
|
||||||
|
|
@ -1645,8 +1645,8 @@ type TCustomMemo = class(TCustomScrollControl,TCustomMemoCmd) //
|
||||||
fy :=(FirstLine-FTopLine)* fTextHeight;
|
fy :=(FirstLine-FTopLine)* fTextHeight;
|
||||||
ly :=(LastLine-FTopLine+1)* fTextHeight;
|
ly :=(LastLine-FTopLine+1)* fTextHeight;
|
||||||
r := ClientRect;
|
r := ClientRect;
|
||||||
if ly<r[1]then return;
|
if ly<(r[1]-2) then return;
|
||||||
if fy>r[3]then return;
|
if fy>(r[3]+2) then return;
|
||||||
r[0]:= FGutter.Width;
|
r[0]:= FGutter.Width;
|
||||||
r[1]:= max(0,fy);
|
r[1]:= max(0,fy);
|
||||||
r[3]:= min(r[3],ly);
|
r[3]:= min(r[3],ly);
|
||||||
|
|
|
||||||
|
|
@ -1873,6 +1873,7 @@ type TCustomImageList=class(tcomponent)
|
||||||
end
|
end
|
||||||
function setsize(sz);
|
function setsize(sz);
|
||||||
begin
|
begin
|
||||||
|
if ifnumber(sz) and sz>0 then return setsize(array(sz,sz));
|
||||||
if not(ifarray(sz) ) then return ;
|
if not(ifarray(sz) ) then return ;
|
||||||
w := sz[0];
|
w := sz[0];
|
||||||
h := sz[1];
|
h := sz[1];
|
||||||
|
|
@ -3143,6 +3144,7 @@ type TcustomCanvas = class(TSLUIBASE)
|
||||||
@param(TextMetric)(ttagTEXTMETRICA) 文本样式信息 %%
|
@param(TextMetric)(ttagTEXTMETRICA) 文本样式信息 %%
|
||||||
**}
|
**}
|
||||||
end
|
end
|
||||||
|
|
||||||
type tcustommemcanvas = class(tcustomcanvas)
|
type tcustommemcanvas = class(tcustomcanvas)
|
||||||
{**
|
{**
|
||||||
@explan(说明) 内存画布,支持保存png文件 %%
|
@explan(说明) 内存画布,支持保存png文件 %%
|
||||||
|
|
@ -3264,7 +3266,52 @@ type TControlCanvs=class(TcustomCanvas)
|
||||||
FClipRect;
|
FClipRect;
|
||||||
end
|
end
|
||||||
implementation
|
implementation
|
||||||
|
{type tcustommetacanvas = class(tcustomcanvas)
|
||||||
|
function create(fn,w,h);
|
||||||
|
begin
|
||||||
|
inherited create();
|
||||||
|
folddc := _wapi.GetDC(0);
|
||||||
|
get_w_h(w,h,wo,ho);
|
||||||
|
fcurhdc := _wapi.CreateEnhMetaFileA(folddc,fn,array(0,0,wo*26,ho*26),0);
|
||||||
|
fsaveid := _wapi.SaveDC(fcurhdc);
|
||||||
|
_wapi.SetGraphicsMode(fcurhdc,2);
|
||||||
|
handle := fcurhdc;
|
||||||
|
end
|
||||||
|
function destroy();override;
|
||||||
|
begin
|
||||||
|
_wapi.ReleaseDC(0,folddc);
|
||||||
|
_wapi.RestoreDC(fcurhdc,fsaveid);
|
||||||
|
_wapi.CloseEnhMetaFile(fcurhdc);
|
||||||
|
//_wapi.DeleteObject(fimg);
|
||||||
|
handle := 0;
|
||||||
|
inherited;
|
||||||
|
end
|
||||||
|
function save_wmf(fn); //±£´æpng
|
||||||
|
begin
|
||||||
|
_wapi.CloseEnhMetaFile(fimg);
|
||||||
|
end
|
||||||
|
property width read FWidth;
|
||||||
|
property height read fheight;
|
||||||
|
private
|
||||||
|
function get_w_h(w,h,wo,ho);
|
||||||
|
begin
|
||||||
|
if w>0 then wo := int(w);
|
||||||
|
else
|
||||||
|
wo := _wapi.GetDeviceCaps(folddc,8);
|
||||||
|
if h>0 then ho := int(w);
|
||||||
|
else ho := _wapi.GetDeviceCaps(folddc,10);
|
||||||
|
FWidth := 400;//wo;
|
||||||
|
fheight := 400;//ho;
|
||||||
|
end
|
||||||
|
private
|
||||||
|
fsaveid;
|
||||||
|
FWidth;
|
||||||
|
fheight;
|
||||||
|
fimg;
|
||||||
|
foimg;
|
||||||
|
fcurhdc;
|
||||||
|
folddc;
|
||||||
|
end}
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
type TResourcescache=class
|
type TResourcescache=class
|
||||||
{**
|
{**
|
||||||
|
|
|
||||||
|
|
@ -790,6 +790,30 @@ type tcustompagecontrol = class(tcustomtabcontrol)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
public
|
public
|
||||||
|
function GetPreferredSize(w,h);override;
|
||||||
|
begin
|
||||||
|
len := ftabitems.length();
|
||||||
|
if len<1 then
|
||||||
|
begin
|
||||||
|
w := width;
|
||||||
|
h := height;
|
||||||
|
return ;
|
||||||
|
end
|
||||||
|
w := 100;
|
||||||
|
h := 100;
|
||||||
|
for i:= 0 to len-1 do
|
||||||
|
begin
|
||||||
|
FTabItems[i].PageSheet.GetPreferredSize(wi,hi);
|
||||||
|
w := max(w,wi);
|
||||||
|
h := max(h,hi);
|
||||||
|
end
|
||||||
|
rc := ClientRect;
|
||||||
|
bc := BoundsRect;
|
||||||
|
dh := bc[3]-bc[1]-(rc[3]-rc[1]);
|
||||||
|
dw := bc[2]-bc[0]-(rc[2]-rc[0]);
|
||||||
|
w := w+dw;
|
||||||
|
h := h+dh;
|
||||||
|
end
|
||||||
function checknewchild(achild);override;//¼ì²échild
|
function checknewchild(achild);override;//¼ì²échild
|
||||||
begin
|
begin
|
||||||
r := inherited;
|
r := inherited;
|
||||||
|
|
|
||||||
|
|
@ -879,8 +879,8 @@ type teditable=class(TSLUIBASE) //
|
||||||
FHost := nil;
|
FHost := nil;
|
||||||
if host is class(TWinControl)then
|
if host is class(TWinControl)then
|
||||||
begin
|
begin
|
||||||
SetFont(host.font);
|
|
||||||
FHost := host;
|
FHost := host;
|
||||||
|
SetFont(host.font);
|
||||||
end else
|
end else
|
||||||
begin
|
begin
|
||||||
if ohost then ohost.InvalidateRect(GetEntryRect(),false);
|
if ohost then ohost.InvalidateRect(GetEntryRect(),false);
|
||||||
|
|
@ -1305,7 +1305,7 @@ type teditable=class(TSLUIBASE) //
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
rc := GetEntryRect();
|
rc := GetEntryRect();
|
||||||
if LineWrap then
|
if FLineWrap then
|
||||||
begin
|
begin
|
||||||
if(FFontWidth * (len+1))>(rc[2]-rc[0])then return;
|
if(FFontWidth * (len+1))>(rc[2]-rc[0])then return;
|
||||||
end
|
end
|
||||||
|
|
@ -2965,104 +2965,6 @@ type tcustompassword = class(tcustomedit)
|
||||||
|
|
||||||
end
|
end
|
||||||
type tthreeEntry=class(TCustomControl)
|
type tthreeEntry=class(TCustomControl)
|
||||||
private
|
|
||||||
type tpickerEditer=class(teditable)
|
|
||||||
function Create();
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
border := false;
|
|
||||||
end
|
|
||||||
function valuemodify();
|
|
||||||
begin
|
|
||||||
//ÐÞ¸ÄÈÕÆÚ
|
|
||||||
if host then Host.ExecuteCommand("dtchanged",self);
|
|
||||||
end
|
|
||||||
fprev;
|
|
||||||
fnext;
|
|
||||||
protected
|
|
||||||
function doonsetfocus();override;
|
|
||||||
begin
|
|
||||||
ExecuteCommand("ecselall");
|
|
||||||
end
|
|
||||||
function doonkillfocus();override;
|
|
||||||
begin
|
|
||||||
valuemodify();
|
|
||||||
ExecuteCommand("ecclcsel");
|
|
||||||
end
|
|
||||||
public
|
|
||||||
function GetEntryRect();override;
|
|
||||||
begin
|
|
||||||
r := ClientRect;
|
|
||||||
if not ifarray(r)then return array(0,0,0,0);
|
|
||||||
return r;
|
|
||||||
end
|
|
||||||
function WMCHAR(o,e);override;
|
|
||||||
begin
|
|
||||||
case e.char of
|
|
||||||
"0" to "9":return inherited;
|
|
||||||
end;
|
|
||||||
case e.CharCode of
|
|
||||||
VK_DELETE,VK_BACK:inherited;
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
function WMKEYDOWN(o,e);override;
|
|
||||||
begin
|
|
||||||
case e.CharCode of
|
|
||||||
13:
|
|
||||||
begin
|
|
||||||
return valuemodify();
|
|
||||||
end
|
|
||||||
VK_LEFT:
|
|
||||||
begin
|
|
||||||
return GoToPrev();
|
|
||||||
end
|
|
||||||
VK_RIGHT:
|
|
||||||
begin
|
|
||||||
return gotonext();
|
|
||||||
end
|
|
||||||
VK_UP:
|
|
||||||
begin
|
|
||||||
return inc();
|
|
||||||
end
|
|
||||||
VK_DOWN:
|
|
||||||
begin
|
|
||||||
return dec();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
inherited;
|
|
||||||
end
|
|
||||||
function inc();
|
|
||||||
begin
|
|
||||||
s := text;
|
|
||||||
text := inttostr(strtointdef(s,0)+1);
|
|
||||||
valuemodify();
|
|
||||||
end
|
|
||||||
function dec();
|
|
||||||
begin
|
|
||||||
s := text;
|
|
||||||
text := inttostr(strtointdef(s,0)-1);
|
|
||||||
valuemodify();
|
|
||||||
end
|
|
||||||
private
|
|
||||||
function gotonext();
|
|
||||||
begin
|
|
||||||
valuemodify();
|
|
||||||
if fnext then
|
|
||||||
begin
|
|
||||||
KillFocus();
|
|
||||||
fnext.SetFocus();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function GoToPrev();
|
|
||||||
begin
|
|
||||||
valuemodify();
|
|
||||||
if fprev then
|
|
||||||
begin
|
|
||||||
KillFocus();
|
|
||||||
fprev.SetFocus();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
public
|
public
|
||||||
function create(aowner);
|
function create(aowner);
|
||||||
begin
|
begin
|
||||||
|
|
@ -3090,8 +2992,8 @@ type tthreeEntry=class(TCustomControl)
|
||||||
FEntrys[i].fnext := FEntrys[(i+1)mod 3];
|
FEntrys[i].fnext := FEntrys[(i+1)mod 3];
|
||||||
FEntrys[(i+1)mod 3].Fprev := FEntrys[i];
|
FEntrys[(i+1)mod 3].Fprev := FEntrys[i];
|
||||||
end
|
end
|
||||||
calcCtls();
|
|
||||||
FEntrys :: mcell.host := self(true);
|
FEntrys :: mcell.host := self(true);
|
||||||
|
calcCtls();
|
||||||
end
|
end
|
||||||
function GetPreferredSize(w,h);override;
|
function GetPreferredSize(w,h);override;
|
||||||
begin
|
begin
|
||||||
|
|
@ -3102,6 +3004,11 @@ type tthreeEntry=class(TCustomControl)
|
||||||
w := ftw*11+fth;
|
w := ftw*11+fth;
|
||||||
h := fth+4;
|
h := fth+4;
|
||||||
end
|
end
|
||||||
|
function WMSize(o,e);override;
|
||||||
|
begin
|
||||||
|
calcCtls();
|
||||||
|
inherited;
|
||||||
|
end
|
||||||
function paint();override;
|
function paint();override;
|
||||||
begin
|
begin
|
||||||
for i,v in FEntrys do
|
for i,v in FEntrys do
|
||||||
|
|
@ -3114,34 +3021,24 @@ type tthreeEntry=class(TCustomControl)
|
||||||
if not ifarray(v)then continue;
|
if not ifarray(v)then continue;
|
||||||
dc.drawtext(v["sym"],v["rec"],DT_CENTER .| DT_VCENTER .| DT_SINGLELINE);
|
dc.drawtext(v["sym"],v["rec"],DT_CENTER .| DT_VCENTER .| DT_SINGLELINE);
|
||||||
end
|
end
|
||||||
|
rec := ClientRect;
|
||||||
|
h := rec[3]-rec[1];
|
||||||
|
FBtnRect := array(max(0,integer(rec[2]-min(25,h))),rec[1],rec[2]-1,rec[3]-1);
|
||||||
PaintBtn();
|
PaintBtn();
|
||||||
end
|
end
|
||||||
function PaintBtn();virtual;
|
function PaintBtn();virtual;
|
||||||
begin
|
|
||||||
if FBtnRect then
|
|
||||||
begin
|
begin
|
||||||
dc := Canvas;
|
dc := Canvas;
|
||||||
dc.Draw("framecontrol",array(FBtnRect[0:1],FBtnRect[2:3]),DFC_SCROLL,DFCS_SCROLLDOWN);
|
dc.Draw("framecontrol",array(FBtnRect[0:1],FBtnRect[2:3]),DFC_SCROLL,DFCS_SCROLLDOWN);
|
||||||
end
|
end
|
||||||
end
|
|
||||||
function AdjustSize();override;
|
function AdjustSize();override;
|
||||||
begin
|
begin
|
||||||
if csLoading in ComponentState then return ;
|
if csLoading in ComponentState then return ;
|
||||||
if autosizing then return ;
|
if autosizing then return ;
|
||||||
if not HandleAllocated() then return ;
|
|
||||||
calcCtls();
|
calcCtls();
|
||||||
class(TWinControl).AdjustSize();
|
class(TWinControl).AdjustSize();
|
||||||
end
|
|
||||||
{function WMSize(o,e):LM_SIZE;virtual;
|
|
||||||
begin
|
|
||||||
|
|
||||||
end
|
|
||||||
function DoWMSIZE(o,e);override;
|
|
||||||
begin
|
|
||||||
calcCtls();
|
|
||||||
InvalidateRect(nil,false);
|
InvalidateRect(nil,false);
|
||||||
inherited;
|
end
|
||||||
end}
|
|
||||||
function dosetfocus(o,e);override;
|
function dosetfocus(o,e);override;
|
||||||
begin
|
begin
|
||||||
if csDesigning in ComponentState then return;
|
if csDesigning in ComponentState then return;
|
||||||
|
|
@ -3266,9 +3163,6 @@ type tthreeEntry=class(TCustomControl)
|
||||||
function calcCtls();virtual;
|
function calcCtls();virtual;
|
||||||
begin
|
begin
|
||||||
rec := ClientRect;
|
rec := ClientRect;
|
||||||
h := rec[3]-rec[1];
|
|
||||||
wd := rec[2]-rec[0];
|
|
||||||
FBtnRect := array(max(0,integer(rec[2]-min(25,h))),rec[1],rec[2]-1,rec[3]-1);
|
|
||||||
x := rec[0]+1;
|
x := rec[0]+1;
|
||||||
FSymInfo := array();
|
FSymInfo := array();
|
||||||
for i,v in FEntrys do
|
for i,v in FEntrys do
|
||||||
|
|
@ -6490,11 +6384,17 @@ type TCustomSpinEdit = class(TCustomControl)
|
||||||
begin
|
begin
|
||||||
class(tcontrol).GetPreferredSize(w,h);
|
class(tcontrol).GetPreferredSize(w,h);
|
||||||
if ongetpreferredsize then return ;
|
if ongetpreferredsize then return ;
|
||||||
|
ft := Font;
|
||||||
|
if not ft then return ;
|
||||||
|
h := ft.Height+4;
|
||||||
bs := BoundsRect;
|
bs := BoundsRect;
|
||||||
cs := ClientRect;
|
cs := ClientRect;
|
||||||
dh := (bs[3]-bs[1])-(cs[3]-cs[1]);
|
dh := (bs[3]-bs[1])-(cs[3]-cs[1]);
|
||||||
h+=dh;
|
h+=dh;
|
||||||
w := Width;
|
dw := (bs[2]-bs[2])-(cs[2]-cs[2]);
|
||||||
|
|
||||||
|
w := (max(length(tostn(FMinValue)),length(tostn(FMaxValue)))+2)*ft.Width+FUDwidth;
|
||||||
|
w+=dw;
|
||||||
end
|
end
|
||||||
function paint();override;
|
function paint();override;
|
||||||
begin
|
begin
|
||||||
|
|
@ -6618,7 +6518,7 @@ type tcustomgroupbox=class(TCustomControl)
|
||||||
end
|
end
|
||||||
function GetPreferredSize(w,h);override;
|
function GetPreferredSize(w,h);override;
|
||||||
begin
|
begin
|
||||||
inherited;
|
return inherited;
|
||||||
br := BoundsRect;
|
br := BoundsRect;
|
||||||
cr := ClientRect;
|
cr := ClientRect;
|
||||||
dh := (br[3]-br[1])-(cr[3]-cr[1])-8;
|
dh := (br[3]-br[1])-(cr[3]-cr[1])-8;
|
||||||
|
|
@ -6636,15 +6536,8 @@ type tcustomgroupbox=class(TCustomControl)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
private
|
private
|
||||||
function calc_rec();
|
|
||||||
begin
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
ftwidth;
|
ftwidth;
|
||||||
ftheight;
|
ftheight;
|
||||||
frecplus ;
|
|
||||||
fspacewidth;
|
|
||||||
FtextPosition;
|
FtextPosition;
|
||||||
end
|
end
|
||||||
type tcustomprogressbar=class(TCustomControl)
|
type tcustomprogressbar=class(TCustomControl)
|
||||||
|
|
@ -7637,6 +7530,483 @@ type tcustomprocess = class(tcomponent) //
|
||||||
static fproces;
|
static fproces;
|
||||||
static fpends;
|
static fpends;
|
||||||
end
|
end
|
||||||
|
type tcustomtimepicker = class(tthreeEntry)
|
||||||
|
function create(aowner);
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
caption := "timepicker";
|
||||||
|
width := 120;
|
||||||
|
ExecuteCommand("dttime",now());
|
||||||
|
end
|
||||||
|
function ExecuteCommand(cmd,p);override;
|
||||||
|
begin
|
||||||
|
case cmd of
|
||||||
|
"dttime":
|
||||||
|
begin
|
||||||
|
if ifnumber(p) then
|
||||||
|
begin
|
||||||
|
decodedatetime(p,y,mt,d,h,m,s,ms);
|
||||||
|
ExecuteCommand("dtatime",array(h,m,s));
|
||||||
|
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
r := ExecuteCommand("dtatime");
|
||||||
|
r2 := encodedatetime(2021,1,1,r[0],r[1],r[2],0);
|
||||||
|
if ifarray(r) then
|
||||||
|
begin
|
||||||
|
return frac(r2);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
"dtatime":
|
||||||
|
begin
|
||||||
|
es := entrys;
|
||||||
|
if ifarray(p) and ifnumber(p[0]) and ifnumber(p[1]) and ifnumber(p[1]) then
|
||||||
|
begin
|
||||||
|
es[0].text := inttostr(p[0]);
|
||||||
|
es[1].text := inttostr(p[1]);
|
||||||
|
es[2].text := inttostr(p[2]);
|
||||||
|
ExecuteCommand("dtchanged",es[2]);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
r := array();
|
||||||
|
for i,v in es do r[i] := strtointdef(v.text,0);
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
"dtchanged":
|
||||||
|
begin
|
||||||
|
es := entrys;
|
||||||
|
if es[2]=p then
|
||||||
|
begin
|
||||||
|
t := p.text;
|
||||||
|
ti := strtointdef(t,0);
|
||||||
|
if ti<0 then
|
||||||
|
begin
|
||||||
|
p.text := "59";
|
||||||
|
es[1].dec();
|
||||||
|
end else
|
||||||
|
if ti>59 then
|
||||||
|
begin
|
||||||
|
p.text := "0";
|
||||||
|
es[1].inc();
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
if es[1] = p then
|
||||||
|
begin
|
||||||
|
t := p.text;
|
||||||
|
ti := strtointdef(t,0);
|
||||||
|
if ti<0 then
|
||||||
|
begin
|
||||||
|
p.text := "59";
|
||||||
|
es[0].dec();
|
||||||
|
end else
|
||||||
|
if ti>59 then
|
||||||
|
begin
|
||||||
|
p.text := "0";
|
||||||
|
es[0].inc();
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
if es[0] = p then
|
||||||
|
begin
|
||||||
|
t := p.text;
|
||||||
|
ti := strtointdef(t,0);
|
||||||
|
if ti<0 then p.text := "24";
|
||||||
|
else if ti>24 then p.text := "0";
|
||||||
|
end
|
||||||
|
if Fonselectchange then
|
||||||
|
calldatafunction(Fonselectchange,self(true),new tuieventbase(0,0,0,0));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function PaintBtn();override;
|
||||||
|
begin
|
||||||
|
rec := BtnRect;
|
||||||
|
FRectUp := array(rec[0],rec[1],rec[2],integer(rec[1]+rec[3]/2));
|
||||||
|
FRectDown := array(rec[0],integer(rec[1]+rec[3]/2),rec[2],rec[3]);
|
||||||
|
dc := Canvas;
|
||||||
|
dc.Draw("framecontrol",array(FRectUp[0:1],FRectUp[2:3]),DFC_SCROLL,DFCS_SCROLLUP);
|
||||||
|
dc.Draw("framecontrol",array(FRectDown[0:1],FRectDown[2:3]),DFC_SCROLL,DFCS_SCROLLDOWN);
|
||||||
|
end
|
||||||
|
function btnClicked(p);virtual;
|
||||||
|
begin
|
||||||
|
if pointinrect(p,FRectUp) then
|
||||||
|
begin
|
||||||
|
for i,v in entrys do
|
||||||
|
begin
|
||||||
|
if v.HasFocus then
|
||||||
|
begin
|
||||||
|
v.inc();
|
||||||
|
return 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end else
|
||||||
|
if pointinrect(p,FRectDown) then
|
||||||
|
begin
|
||||||
|
for i,v in entrys do
|
||||||
|
begin
|
||||||
|
if v.HasFocus then
|
||||||
|
begin
|
||||||
|
v.dec();
|
||||||
|
return 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function getTime();override;begin
|
||||||
|
{**
|
||||||
|
@explan(说明)获取控件当前选择的时间%%
|
||||||
|
@return(array)%%
|
||||||
|
**}
|
||||||
|
return ExecuteCommand("dtatime");
|
||||||
|
end
|
||||||
|
function setTime(h,m,s);override;begin
|
||||||
|
{**
|
||||||
|
@explan(说明)设置控件当前选择的时间%%
|
||||||
|
@param(h)(integer)时,24小时制%%
|
||||||
|
@param(m)(integer)分%%
|
||||||
|
@param(s)(integer)秒%%
|
||||||
|
**}
|
||||||
|
return ExecuteCommand("dtatime",array(h,m,s));
|
||||||
|
end
|
||||||
|
function recycling();override;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
end
|
||||||
|
published
|
||||||
|
property onselectchange read Fonselectchange write Fonselectchange;
|
||||||
|
property onselchanged:eventhandler read Fonselectchange write Fonselectchange;
|
||||||
|
{
|
||||||
|
@param(onselchanged)(function[ttimepicker,tuieventbase])选择日期改变%%
|
||||||
|
}
|
||||||
|
private
|
||||||
|
function getEntryWidth(i);virtual;
|
||||||
|
begin
|
||||||
|
return 2;
|
||||||
|
end
|
||||||
|
function getSym(i);virtual;
|
||||||
|
begin
|
||||||
|
return ":";
|
||||||
|
end
|
||||||
|
FRectUp;
|
||||||
|
FRectDown;
|
||||||
|
[weakref]Fonselectchange;
|
||||||
|
end
|
||||||
|
type tcustomdatetimepicker = class(tthreeEntry)
|
||||||
|
{**
|
||||||
|
@explan(说明) 日期选择控件 %%
|
||||||
|
**}
|
||||||
|
function create(aowner);
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
caption:="Date/TimePicker";
|
||||||
|
FCalender := new tcustommonthcalendar(self);
|
||||||
|
FCalender.autosize := true;
|
||||||
|
FCalender.border := true;
|
||||||
|
FCalender.WsPopUp := true;
|
||||||
|
FCalender.parent := self;
|
||||||
|
FCalender.Visible := false;
|
||||||
|
//FScreenRect := _wapi.GetScreenRect();
|
||||||
|
decodedate(date(),y,m,d);
|
||||||
|
setDate(y,m,d);
|
||||||
|
FCalender.onSelect := function(o,e)begin
|
||||||
|
FCalender.Visible := false;
|
||||||
|
d := FCalender.getCurrentSelection();
|
||||||
|
setDate(d[0],d[1],d[2]);
|
||||||
|
end
|
||||||
|
FCalender.OnActivate := function(o,e)begin
|
||||||
|
if e.wparam=0 then
|
||||||
|
begin
|
||||||
|
FCalender.Visible := false;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function btnclicked(p);override;
|
||||||
|
begin
|
||||||
|
rec := BtnRect;
|
||||||
|
if pointinrect(p,rec) then
|
||||||
|
begin
|
||||||
|
ShowDropDown(true);
|
||||||
|
return true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function ExecuteCommand(cmd,p);override;
|
||||||
|
begin
|
||||||
|
case cmd of
|
||||||
|
"dtchanged":
|
||||||
|
begin
|
||||||
|
es := entrys;
|
||||||
|
if p = es[2] then //日
|
||||||
|
begin
|
||||||
|
pn := getenumber(p);
|
||||||
|
y := getenumber(es[0]);
|
||||||
|
m := getenumber(es[1]);
|
||||||
|
if pn<1 then p.text := inttostr(getmonthdates(y,m));
|
||||||
|
else
|
||||||
|
if pn>28 and pn>getmonthdates(y,m) then
|
||||||
|
begin
|
||||||
|
p.text := "1";
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
if p = es[1] then //月
|
||||||
|
begin
|
||||||
|
y := getenumber(es[0]);
|
||||||
|
m := getenumber(es[1]);
|
||||||
|
bm := m;
|
||||||
|
if m>12 then
|
||||||
|
begin
|
||||||
|
m := 1;
|
||||||
|
end else
|
||||||
|
if m<1 then m := 12;
|
||||||
|
if bm<>m then
|
||||||
|
begin
|
||||||
|
p.text := inttostr(m);
|
||||||
|
end
|
||||||
|
d := getenumber(es[2]);
|
||||||
|
if d<1 then es[2].text := "1";
|
||||||
|
else
|
||||||
|
if d>28 then
|
||||||
|
begin
|
||||||
|
ct := getmonthdates(y,m);
|
||||||
|
if d>ct then es[2].text := inttostr(ct);
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
if p = es[0] then //年
|
||||||
|
begin
|
||||||
|
y := getenumber(p);
|
||||||
|
m := getenumber(es[1]);
|
||||||
|
d := getenumber(es[2]);
|
||||||
|
if dt>28 then
|
||||||
|
begin
|
||||||
|
ct := getmonthdates(y,m);
|
||||||
|
if d>ct then es[2].text := inttostr(ct);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if Fonselectchange then
|
||||||
|
calldatafunction(Fonselectchange,self(true),new tuieventbase(0,0,0,0));
|
||||||
|
end
|
||||||
|
"dtadate":
|
||||||
|
begin
|
||||||
|
es := entrys;
|
||||||
|
if ifarray(p) and ifnumber(p[0]) and ifnumber(p[1]) and ifnumber(p[2]) then
|
||||||
|
begin
|
||||||
|
dt := encodedate(p[0],p[1],p[2]);
|
||||||
|
decodedate(dt,y,m,d);
|
||||||
|
es[0].text := inttostr(y);
|
||||||
|
es[1].text := inttostr(m);
|
||||||
|
es[2].text := inttostr(d);
|
||||||
|
if Fonselectchange then
|
||||||
|
calldatafunction(Fonselectchange,self(true),new tuieventbase(0,0,0,0));
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
y := strtointdef(es[0].text,2021);
|
||||||
|
m := strtointdef(es[1].text,1);
|
||||||
|
d := strtointdef(es[2].text,1);
|
||||||
|
return array(y,m,d);
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function ShowDropDown(f);virtual;
|
||||||
|
begin
|
||||||
|
{**
|
||||||
|
@explan(说明) 设置弹出框的显示区域 %%
|
||||||
|
**}
|
||||||
|
if not(FCalender ) then return ;
|
||||||
|
nv := ifnil(f)?true:(f?true:false);
|
||||||
|
if FCalender.Visible = nv then return FCalender.show(0);
|
||||||
|
rc := ClientRect;
|
||||||
|
nrc := ClientToScreen(rc[0],rc[3]);
|
||||||
|
p2 := clienttoscreen(rc[0],rc[1]+FCalender.height);
|
||||||
|
src := _wapi.GetScreenRect(nrc);
|
||||||
|
if (src[3]<p2[1]) then //由于缩放问题暂时屏蔽
|
||||||
|
begin
|
||||||
|
nrc := ClientToScreen(rc[0],rc[1]-FCalender.height);
|
||||||
|
end
|
||||||
|
FCalender.Left := nrc[0];
|
||||||
|
FCalender.top := nrc[1];
|
||||||
|
dt := getDate();
|
||||||
|
FCalender.setCurrentSelection(dt[0],dt[1],dt[2]);
|
||||||
|
FCalender.show();
|
||||||
|
end
|
||||||
|
function getDate();
|
||||||
|
begin
|
||||||
|
{**
|
||||||
|
@explan(说明) 获得日期 %%
|
||||||
|
@return(array) array(y,m,d) %%
|
||||||
|
**}
|
||||||
|
return ExecuteCommand("dtadate");
|
||||||
|
end
|
||||||
|
function setDate(y,m,d);
|
||||||
|
begin
|
||||||
|
{**
|
||||||
|
@explan(说明) 获得日期 %%
|
||||||
|
@param(y)(integer) 年 %%
|
||||||
|
@param(m)(integer) 月 %%
|
||||||
|
@param(d)(integer) 日 %%
|
||||||
|
**}
|
||||||
|
return ExecuteCommand("dtadate",array(y,m,d));
|
||||||
|
end
|
||||||
|
function recycling();override;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
FCalender := nil;
|
||||||
|
Fonselectchange := nil;
|
||||||
|
end
|
||||||
|
published
|
||||||
|
property onselectchange:eventhandler read Fonselectchange write Fonselectchange;
|
||||||
|
property onselchanged:eventhandler read Fonselectchange write Fonselectchange;
|
||||||
|
{
|
||||||
|
@param(onselchanged)(function[tdatetimepicker,tuieventbase])选择日期改变%%
|
||||||
|
}
|
||||||
|
private
|
||||||
|
function getenumber(e);
|
||||||
|
begin
|
||||||
|
t := e.text;
|
||||||
|
ti := strtointdef(t,1);
|
||||||
|
return ti;
|
||||||
|
end
|
||||||
|
//FScreenRect;
|
||||||
|
FCalender;
|
||||||
|
[weakref]Fonselectchange;
|
||||||
|
end
|
||||||
|
type tcustommonthcalendar = class(TCustomControl)
|
||||||
|
{**
|
||||||
|
@explan(说明)月历控件
|
||||||
|
该控件的函数可能的返回值:
|
||||||
|
array等期望的数据/1:成功。
|
||||||
|
-1:一般是函数参数格式不正确。
|
||||||
|
nil:该项属性在控件种类正确、窗口未创建、无默认值的情况下未设置过或被重置过。
|
||||||
|
0:失败,可能的原因:
|
||||||
|
1.参数格式正确但不适用于控件的当前状态,如对多选月历设置当前选择项时项数超过其最大多选项数限制。
|
||||||
|
2.控件类型错误,如对单选月历调用设置其最大多选项数限制的函数。
|
||||||
|
3.要求控件创建后才可调用的函数在控件创建之前被调用。
|
||||||
|
4.未知错误。
|
||||||
|
**}
|
||||||
|
function create(aowner);
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
//TodayButton := false;
|
||||||
|
end
|
||||||
|
function AfterConstruction();override;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
width := 213;
|
||||||
|
height := 175;
|
||||||
|
FCalender := new tVirtualCalender();
|
||||||
|
FCalender.ExecuteCommand("memymd",date());
|
||||||
|
FCalender.Left := 1;
|
||||||
|
FCalender.top := 1;
|
||||||
|
FCalender.host := self(true);
|
||||||
|
end
|
||||||
|
function paint();override;
|
||||||
|
begin
|
||||||
|
if FCalender then FCalender.paint();
|
||||||
|
end
|
||||||
|
function MouseUp(o,e);override;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
if e.skip then return ;
|
||||||
|
if not FCalender then return ;
|
||||||
|
if e.button()= mbLeft then
|
||||||
|
begin
|
||||||
|
r := FCalender.ExecuteCommand("mestatebypos",e.pos);
|
||||||
|
if r then return ;
|
||||||
|
r := FCalender.ExecuteCommand("megetincpos",e.pos);
|
||||||
|
if r then return FCalender.ExecuteCommand("meminc",r);
|
||||||
|
std := FCalender.ExecuteCommand("mestate");
|
||||||
|
r := FCalender.ExecuteCommand("meselbypos",e.pos);
|
||||||
|
if std=3 or r="today" then
|
||||||
|
begin
|
||||||
|
if FonSelect then
|
||||||
|
CallMessgeFunction(FonSelect,self(true),new tuieventbase(0,0,0,0));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function getCurrentSelection();begin
|
||||||
|
{**
|
||||||
|
@explan(说明)获取当前选择的日期,该函数仅能用于单选的月历控件%%
|
||||||
|
@return(array/integer/nil)array:成功;0:失败;nil:未设置过此项。
|
||||||
|
array(2019,2,1)
|
||||||
|
**}
|
||||||
|
if FCalender then
|
||||||
|
begin
|
||||||
|
r := FCalender.ExecuteCommand("meymd");
|
||||||
|
decodedate(r,y,m,d);
|
||||||
|
return array(y,m,d);
|
||||||
|
end
|
||||||
|
return 0;
|
||||||
|
end
|
||||||
|
function setCurrentSelection(y,m,d);
|
||||||
|
begin
|
||||||
|
{**
|
||||||
|
@explan(说明)设置当前选择日期,该函数仅能用于单选的月历控件%%
|
||||||
|
@param(y)(integer)年%%
|
||||||
|
@param(m)(integer)月%%
|
||||||
|
@param(d)(integer)日%%
|
||||||
|
@return(integer)1:成功;0:失败;-1:出错%%
|
||||||
|
**}
|
||||||
|
if ifnumber(y) and ifnumber(m) or ifnumber(d) then
|
||||||
|
begin
|
||||||
|
dt := encodedate(y,m,d);
|
||||||
|
if FCalender then
|
||||||
|
begin
|
||||||
|
FCalender.ExecuteCommand("meymd",dt);
|
||||||
|
return 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function GetPreferredSize(w,h);override;
|
||||||
|
begin
|
||||||
|
if FCalender then
|
||||||
|
begin
|
||||||
|
FCalender.GetPreferredSize(w,h);
|
||||||
|
w+=1;
|
||||||
|
h+=1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function DoDatechanged();
|
||||||
|
begin
|
||||||
|
if FonSelectChange then
|
||||||
|
CallMessgeFunction(FonSelectChange,self(true),new tuieventbase(0,0,0,0));
|
||||||
|
end
|
||||||
|
function recycling();override;
|
||||||
|
begin
|
||||||
|
FCalender.recycling();
|
||||||
|
inherited;
|
||||||
|
FCalender := nil;
|
||||||
|
FonSelect := nil;
|
||||||
|
FonSelectChange := nil;
|
||||||
|
end
|
||||||
|
published
|
||||||
|
property onSelectChange read FonSelectChange write FonSelectChange;
|
||||||
|
property TodayButton:bool read getnoTodayButton write setNoTodayButton;
|
||||||
|
property onSelect:eventhandler read FonSelect write FonSelect;
|
||||||
|
property onSelChanged:eventhandler read FonSelectChange write FonSelectChange;
|
||||||
|
{**
|
||||||
|
@param(todayButton)(bool)月历显示“今日”按钮(默认开启)%%
|
||||||
|
@param(onselchanged)(function[tcustommonthcalendar,tuieventbase])选择日期改变%%
|
||||||
|
**}
|
||||||
|
|
||||||
|
private
|
||||||
|
function setNoTodayButton(v);
|
||||||
|
begin
|
||||||
|
if FCalender then return FCalender.ExecuteCommand("metodaybutton",v);
|
||||||
|
end
|
||||||
|
function getnoTodayButton();
|
||||||
|
begin
|
||||||
|
if FCalender then return FCalender.ExecuteCommand("metodaybutton");
|
||||||
|
end
|
||||||
|
private
|
||||||
|
FCalender;
|
||||||
|
FMousedownState;
|
||||||
|
[weakref]FonSelect;
|
||||||
|
[weakref]FonSelectChange;
|
||||||
|
end
|
||||||
implementation
|
implementation
|
||||||
type TtoolbuttonActionLink=class(TControlActionLink)
|
type TtoolbuttonActionLink=class(TControlActionLink)
|
||||||
{**
|
{**
|
||||||
|
|
@ -7720,6 +8090,103 @@ type TTipWnd=class(TCustomControl) //tip
|
||||||
private
|
private
|
||||||
FSize;
|
FSize;
|
||||||
end
|
end
|
||||||
|
type tpickerEditer=class(teditable)
|
||||||
|
function Create();
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
border := false;
|
||||||
|
end
|
||||||
|
function valuemodify();
|
||||||
|
begin
|
||||||
|
//修改日期
|
||||||
|
if host then Host.ExecuteCommand("dtchanged",self);
|
||||||
|
end
|
||||||
|
fprev;
|
||||||
|
fnext;
|
||||||
|
protected
|
||||||
|
function doonsetfocus();override;
|
||||||
|
begin
|
||||||
|
ExecuteCommand("ecselall");
|
||||||
|
end
|
||||||
|
function doonkillfocus();override;
|
||||||
|
begin
|
||||||
|
valuemodify();
|
||||||
|
ExecuteCommand("ecclcsel");
|
||||||
|
end
|
||||||
|
public
|
||||||
|
function GetEntryRect();override;
|
||||||
|
begin
|
||||||
|
r := ClientRect;
|
||||||
|
if not ifarray(r)then return array(0,0,0,0);
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
function WMCHAR(o,e);override;
|
||||||
|
begin
|
||||||
|
case e.char of
|
||||||
|
"0" to "9":return inherited;
|
||||||
|
end;
|
||||||
|
case e.CharCode of
|
||||||
|
VK_DELETE,VK_BACK:inherited;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
function WMKEYDOWN(o,e);override;
|
||||||
|
begin
|
||||||
|
case e.CharCode of
|
||||||
|
13:
|
||||||
|
begin
|
||||||
|
return valuemodify();
|
||||||
|
end
|
||||||
|
VK_LEFT:
|
||||||
|
begin
|
||||||
|
return GoToPrev();
|
||||||
|
end
|
||||||
|
VK_RIGHT:
|
||||||
|
begin
|
||||||
|
return gotonext();
|
||||||
|
end
|
||||||
|
VK_UP:
|
||||||
|
begin
|
||||||
|
return inc();
|
||||||
|
end
|
||||||
|
VK_DOWN:
|
||||||
|
begin
|
||||||
|
return dec();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
inherited;
|
||||||
|
end
|
||||||
|
function inc();
|
||||||
|
begin
|
||||||
|
s := text;
|
||||||
|
text := inttostr(strtointdef(s,0)+1);
|
||||||
|
valuemodify();
|
||||||
|
end
|
||||||
|
function dec();
|
||||||
|
begin
|
||||||
|
s := text;
|
||||||
|
text := inttostr(strtointdef(s,0)-1);
|
||||||
|
valuemodify();
|
||||||
|
end
|
||||||
|
private
|
||||||
|
function gotonext();
|
||||||
|
begin
|
||||||
|
valuemodify();
|
||||||
|
if fnext then
|
||||||
|
begin
|
||||||
|
KillFocus();
|
||||||
|
fnext.SetFocus();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function GoToPrev();
|
||||||
|
begin
|
||||||
|
valuemodify();
|
||||||
|
if fprev then
|
||||||
|
begin
|
||||||
|
KillFocus();
|
||||||
|
fprev.SetFocus();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
type tedoitem = class
|
type tedoitem = class
|
||||||
function create(r,s,e,t);
|
function create(r,s,e,t);
|
||||||
begin
|
begin
|
||||||
|
|
|
||||||
|
|
@ -61,17 +61,17 @@ uses utslvclauxiliary;
|
||||||
title 标题 tg_label 类型
|
title 标题 tg_label 类型
|
||||||
y_label y轴标签 tg_label 类型
|
y_label y轴标签 tg_label 类型
|
||||||
x_label x轴标签 tg_label 类型
|
x_label x轴标签 tg_label 类型
|
||||||
axises(idx) 0,1,2 分别获取对应的x,y轴 ,tg_axis 类型
|
axises(idx) 0,1,2 分别获取对应的x,y,z轴 ,tg_axis 类型
|
||||||
axes_reverse(idx) 坐标轴是否反向,默认正向
|
axes_reverse(idx) := tgc_on|tgc_off 坐标轴是否反向,默认正向
|
||||||
auto_ticks(idx) 设置坐标轴刻度自动计算
|
auto_ticks(idx) := tgc_on|tgc_off 设置坐标轴刻度自动计算
|
||||||
margins 空白,array(左上右下),设置上下左右空白,tg_figure区域的百分比
|
margins 空白,array(左上右下),设置上下左右空白,tg_figure区域的百分比
|
||||||
axes_bounds(idx) 坐标系的大小 array((x,width),(y,heigt)),以margins为基准点,安百分比
|
axes_bounds := array(左,上,右,下) 坐标系的范围;扣除margins边界,按比例
|
||||||
data_bounds(idx) 获取或者设置数据范围 array((x0,x1),(y0,y1),(z0,z1))
|
data_bounds(idx) 获取或者设置数据范围 array((x0,x1),(y0,y1),(z0,z1)) ,设置之后 对应轴的数据显示范围不会随着数据改变改变,如果要改变 data_bounds(idx) :=tgc_off
|
||||||
zoom_box(idx) 设置显示的数据的区域 array((x0,x1),(y0,y1),(z0,z1))
|
|
||||||
x_location 坐标轴方向,tgc_bottom tgc_top,tgc_middle ,tgc_origin
|
x_location 坐标轴方向,tgc_bottom tgc_top,tgc_middle ,tgc_origin
|
||||||
y_location 坐标轴方向,tgc_left tgc_right,tgc_middle ,tgc_origin
|
y_location 坐标轴方向,tgc_left tgc_right,tgc_middle ,tgc_origin
|
||||||
box 是否有边框
|
box = tgc_on | tgc_off 是否有边框
|
||||||
grid(idx) 背景网格线属性 tg_line_info 对象,size为0的时候网格线消失
|
grid(idx) 背景网格线属性, tg_line_info 对象,size为0的时候网格线消失
|
||||||
|
squred :=tgc_on|tgc_off 长宽等比例,适合于饼图等
|
||||||
|
|
||||||
tg_axis 坐标轴,可以在坐标系中放置任意多个坐标轴
|
tg_axis 坐标轴,可以在坐标系中放置任意多个坐标轴
|
||||||
tics_direction 坐标轴方向 tgc_direct_asc(坐标轴指向的左手方向) , tgc_direct_desc
|
tics_direction 坐标轴方向 tgc_direct_asc(坐标轴指向的左手方向) , tgc_direct_desc
|
||||||
|
|
@ -218,7 +218,7 @@ type tfm = class(tvcform)
|
||||||
fg.Align := alClient;
|
fg.Align := alClient;
|
||||||
//////////设置坐标轴属性////////////////////////
|
//////////设置坐标轴属性////////////////////////
|
||||||
axs := new tg_axes();
|
axs := new tg_axes();
|
||||||
axs.figure := fg.figure;
|
axs.figure := fg;
|
||||||
axs.title.text := "你好 plot ";
|
axs.title.text := "你好 plot ";
|
||||||
axs.title.fontinfo.size := 15;
|
axs.title.fontinfo.size := 15;
|
||||||
axs.title.fontinfo.color := 0xff0000;
|
axs.title.fontinfo.color := 0xff0000;
|
||||||
|
|
@ -236,8 +236,8 @@ type tfm = class(tvcform)
|
||||||
line.markinfo.color := 0x0000ff;
|
line.markinfo.color := 0x0000ff;
|
||||||
line.mark_mode := "on";
|
line.mark_mode := "on";
|
||||||
line.markinfo.size := 30;
|
line.markinfo.size := 30;
|
||||||
line.markinfo.style := "pentagram";
|
line.markinfo.style := line.tgc_mks_pentagram;
|
||||||
line.polyline_style := "staircase";
|
line.polyline_style := line.tgc_LS_staircase;
|
||||||
d := array();
|
d := array();
|
||||||
idx := 0;
|
idx := 0;
|
||||||
for i:= -pi() to pi() step 0.2 do
|
for i:= -pi() to pi() step 0.2 do
|
||||||
|
|
@ -280,7 +280,7 @@ type tfm = class(tvcform)
|
||||||
axs.axises(1).lineinfo.color := 0x00ff00;
|
axs.axises(1).lineinfo.color := 0x00ff00;
|
||||||
sf := new tg_my_surf();
|
sf := new tg_my_surf();
|
||||||
sf.lineinfo.color := 0x0000ff;
|
sf.lineinfo.color := 0x0000ff;
|
||||||
sf.lineinfo.style := tgc_BS_SOLID;
|
sf.lineinfo.style := sf.tgc_BS_SOLID;
|
||||||
sf.graph_data := get_surf_data();
|
sf.graph_data := get_surf_data();
|
||||||
sf.parent := axs;
|
sf.parent := axs;
|
||||||
return ;
|
return ;
|
||||||
|
|
@ -608,6 +608,33 @@ type tg_picture = class(tcustommemcanvas,tg_figure_container) //
|
||||||
ffigure.paint_pre(self);
|
ffigure.paint_pre(self);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
{
|
||||||
|
type tg_metafile = class(tcustommetacanvas,tg_figure_container) //绘图对象
|
||||||
|
uses utslvclgdi;
|
||||||
|
function create(fn,w,h);
|
||||||
|
begin
|
||||||
|
class(tcustommetacanvas).create(fn,w,h);
|
||||||
|
class(tg_figure_container).create();
|
||||||
|
frect := array(0,0,w,h);
|
||||||
|
ffigure.rec_getter := function()begin
|
||||||
|
return frect;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function save_wmf(fn);
|
||||||
|
begin
|
||||||
|
paint();
|
||||||
|
//savepng(fn);
|
||||||
|
end
|
||||||
|
private
|
||||||
|
frect;
|
||||||
|
function paint(); //绘制
|
||||||
|
begin
|
||||||
|
brush.color := 0xffffff;
|
||||||
|
FillRect(frect);
|
||||||
|
ffigure.paint_pre(self);
|
||||||
|
end
|
||||||
|
end }
|
||||||
|
//tcustommetacanvas
|
||||||
type tg_WinControl = class(tcustomcontrol,tg_figure_container) //绘图窗口
|
type tg_WinControl = class(tcustomcontrol,tg_figure_container) //绘图窗口
|
||||||
function create(AOwner);
|
function create(AOwner);
|
||||||
begin
|
begin
|
||||||
|
|
@ -751,7 +778,7 @@ type tg_figure = class(tg_evet_conainter) //
|
||||||
function paint_pre(cvs); //绘制
|
function paint_pre(cvs); //绘制
|
||||||
begin
|
begin
|
||||||
Fpainting := true;
|
Fpainting := true;
|
||||||
cvs := new tg_canvas(cvs.Handle);
|
cvs := new tg_canvas(cvs.Handle,self);
|
||||||
for i,v in faxeses.data do
|
for i,v in faxeses.data do
|
||||||
begin
|
begin
|
||||||
v.paint_pre(cvs);
|
v.paint_pre(cvs);
|
||||||
|
|
@ -833,12 +860,12 @@ type tg_figure = class(tg_evet_conainter) //
|
||||||
fwilldelaxs := axs;
|
fwilldelaxs := axs;
|
||||||
axs.figure := nil;
|
axs.figure := nil;
|
||||||
end
|
end
|
||||||
function fresh(); ///////////////////////////
|
function fresh(); ///刷新////////////////////////
|
||||||
begin
|
begin
|
||||||
if Fpainting then return ;
|
if Fpainting then return ;
|
||||||
if ffresh_caller then call(ffresh_caller);
|
if ffresh_caller then call(ffresh_caller);
|
||||||
end
|
end
|
||||||
function rect(); //////////////////////////////////
|
function rect(); ///获取区域///////////////////////////////
|
||||||
begin
|
begin
|
||||||
r := array(0,0,200,200);
|
r := array(0,0,200,200);
|
||||||
if frect_getter then r := call(frect_getter);
|
if frect_getter then r := call(frect_getter);
|
||||||
|
|
@ -1162,23 +1189,6 @@ type tg_axes = class(tg_base) //
|
||||||
end
|
end
|
||||||
cvs.axesunclip();
|
cvs.axesunclip();
|
||||||
end
|
end
|
||||||
{function paint(cvs);override;
|
|
||||||
begin
|
|
||||||
paint_grid(cvs);
|
|
||||||
inherited;
|
|
||||||
cvs.axesunclip();
|
|
||||||
for i,v in faxes_objects do //绘制坐标
|
|
||||||
begin
|
|
||||||
v.paint(cvs);
|
|
||||||
end
|
|
||||||
modify_label_postion();
|
|
||||||
ftitle.paint(cvs);
|
|
||||||
if fbox = tgc_on then
|
|
||||||
begin
|
|
||||||
set_lineinfo_to_canvas(cvs);
|
|
||||||
paint_box(cvs);
|
|
||||||
end
|
|
||||||
end }
|
|
||||||
function axes_changed();//改变
|
function axes_changed();//改变
|
||||||
begin
|
begin
|
||||||
if not fFigure then return ;
|
if not fFigure then return ;
|
||||||
|
|
@ -1188,11 +1198,18 @@ type tg_axes = class(tg_base) //
|
||||||
fr := fFigure.rect();
|
fr := fFigure.rect();
|
||||||
w := fr[2]-fr[0];
|
w := fr[2]-fr[0];
|
||||||
h := fr[3]-fr[1];
|
h := fr[3]-fr[1];
|
||||||
|
wa := w*(1-fmargins[0]-fmargins[2]);
|
||||||
p_left := fr[0]+w*fmargins[0]+faxes_bounds[0];
|
ha := h*(1-fmargins[1]-fmargins[3]);
|
||||||
p_top := fr[1]+h*fmargins[1]+faxes_bounds[1];
|
p_left := fr[0]+w*fmargins[0]+wa*faxes_bounds[0];
|
||||||
p_width := w*(1-fmargins[0]-fmargins[2])*faxes_bounds[2];
|
p_top := fr[1]+h*fmargins[1]+wa*faxes_bounds[1];
|
||||||
p_height := h*(1-fmargins[1]-fmargins[3])*faxes_bounds[3];
|
p_width := wa*(faxes_bounds[2]-faxes_bounds[0]);
|
||||||
|
p_height := ha*(faxes_bounds[3]-faxes_bounds[1]);
|
||||||
|
if fsqured=tgc_on then
|
||||||
|
begin
|
||||||
|
ts := min(p_width,p_height);
|
||||||
|
p_width := ts;
|
||||||
|
p_height := ts;
|
||||||
|
end
|
||||||
fcvs_bounds := array(p_left,p_top,p_left+p_width,p_top+p_height);
|
fcvs_bounds := array(p_left,p_top,p_left+p_width,p_top+p_height);
|
||||||
if (f_changed .& c_g_data_changed)=c_g_data_changed then
|
if (f_changed .& c_g_data_changed)=c_g_data_changed then
|
||||||
begin
|
begin
|
||||||
|
|
@ -1267,6 +1284,7 @@ type tg_axes = class(tg_base) //
|
||||||
function create(pms);
|
function create(pms);
|
||||||
begin
|
begin
|
||||||
f_changed := 0;
|
f_changed := 0;
|
||||||
|
fsqured := tgc_off;
|
||||||
inherited;
|
inherited;
|
||||||
ftheta := 0;
|
ftheta := 0;
|
||||||
falpha := 0;
|
falpha := 0;
|
||||||
|
|
@ -1308,7 +1326,6 @@ type tg_axes = class(tg_base) //
|
||||||
gd.Style := tgc_PS_DOT;
|
gd.Style := tgc_PS_DOT;
|
||||||
fgrid[i] := gd;
|
fgrid[i] := gd;
|
||||||
end
|
end
|
||||||
|
|
||||||
faxes_reverse := array(tgc_off,tgc_off,tgc_off);
|
faxes_reverse := array(tgc_off,tgc_off,tgc_off);
|
||||||
fbox := tgc_off;
|
fbox := tgc_off;
|
||||||
ffilled := tgc_off;
|
ffilled := tgc_off;
|
||||||
|
|
@ -1380,15 +1397,13 @@ type tg_axes = class(tg_base) //
|
||||||
property sub_ticks read gs_sub_ticks write gs_sub_ticks;
|
property sub_ticks read gs_sub_ticks write gs_sub_ticks;
|
||||||
//上下左右空白
|
//上下左右空白
|
||||||
property margins read gs_margins write gs_margins; //空白区域
|
property margins read gs_margins write gs_margins; //空白区域
|
||||||
property axes_bounds read gs_axes_bounds write gs_axes_bounds; //坐标轴边界
|
property axes_bounds read faxes_bounds write set_axes_bounds; //坐标轴边界
|
||||||
|
property squred read fsqured write set_squred; //绘制区域是否采用等长宽,默认
|
||||||
property data_bounds read gs_data_bounds write gs_data_bounds; //数据边界
|
property data_bounds read gs_data_bounds write gs_data_bounds; //数据边界
|
||||||
property zoom_box read gs_zoom_box write gs_zoom_box; //视图范围
|
property zoom_box read gs_zoom_box write gs_zoom_box; //视图范围
|
||||||
//在窗口中的区域
|
//在窗口中的区域
|
||||||
|
|
||||||
//网格线
|
//网格线
|
||||||
property grid read get_grid;
|
property grid read get_grid;
|
||||||
|
|
||||||
|
|
||||||
//grid ;//= [-1,-1]
|
//grid ;//= [-1,-1]
|
||||||
//grid_position ;//= "background"
|
//grid_position ;//= "background"
|
||||||
//grid_thickness ;//= [1,1]
|
//grid_thickness ;//= [1,1]
|
||||||
|
|
@ -1445,6 +1460,7 @@ type tg_axes = class(tg_base) //
|
||||||
faxes_objects;
|
faxes_objects;
|
||||||
fzoom_box;
|
fzoom_box;
|
||||||
fmargins;
|
fmargins;
|
||||||
|
fsqured;
|
||||||
faxes_bounds ;//= [0,0,1,1]
|
faxes_bounds ;//= [0,0,1,1]
|
||||||
fdata_bounds;
|
fdata_bounds;
|
||||||
fdata_bounds_locked;
|
fdata_bounds_locked;
|
||||||
|
|
@ -1468,8 +1484,6 @@ type tg_axes = class(tg_base) //
|
||||||
if xg.width>0 and ifnumber(xg.color) then
|
if xg.width>0 and ifnumber(xg.color) then
|
||||||
begin
|
begin
|
||||||
set_lineinfo_to_canvas(cvs,xg);
|
set_lineinfo_to_canvas(cvs,xg);
|
||||||
//y1 := p_top;
|
|
||||||
//y2 := p_top+p_height;
|
|
||||||
for i,v in faxes_objects[0].executecommand("get_tics_value") do
|
for i,v in faxes_objects[0].executecommand("get_tics_value") do
|
||||||
begin
|
begin
|
||||||
if v<fzoom_box[0,0] or v>fzoom_box[0,1] then continue;
|
if v<fzoom_box[0,0] or v>fzoom_box[0,1] then continue;
|
||||||
|
|
@ -1564,6 +1578,7 @@ type tg_axes = class(tg_base) //
|
||||||
xcd[ii++] := vi;
|
xcd[ii++] := vi;
|
||||||
vi+=stp;
|
vi+=stp;
|
||||||
end
|
end
|
||||||
|
xcd[ii] := vi;
|
||||||
end
|
end
|
||||||
axi.tics_coord := xcd;
|
axi.tics_coord := xcd;
|
||||||
end
|
end
|
||||||
|
|
@ -1998,26 +2013,31 @@ type tg_axes = class(tg_base) //
|
||||||
return faxes_objects[idx];
|
return faxes_objects[idx];
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function gs_axes_bounds(idx,v);
|
function set_squred(v);
|
||||||
begin
|
begin
|
||||||
if ifarray(v) and ifnumber(v[0]) and ifnumber(v[1]) then
|
if not tg_boolen_value(v,nv) then return ;
|
||||||
|
if nv<>fsqured then
|
||||||
begin
|
begin
|
||||||
if idx in array(0,1,2,3) then
|
fsqured := nv;
|
||||||
|
prop_changed("axes_bounds",idx);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function set_axes_bounds(v);
|
||||||
begin
|
begin
|
||||||
faxes_bounds[idx] := array(v[0],v[1]);
|
if ifarray(v) and ifnumber(v[0]) and ifnumber(v[1]) and v[2]>v[0] and v[3]>v[1] then
|
||||||
|
begin
|
||||||
|
if faxes_bounds<>v then
|
||||||
|
begin
|
||||||
|
faxes_bounds := v;
|
||||||
f_changed .|=c_g_paint_rect ;
|
f_changed .|=c_g_paint_rect ;
|
||||||
prop_changed("axes_bounds",idx);
|
prop_changed("axes_bounds",idx);
|
||||||
end
|
end
|
||||||
end else //get
|
|
||||||
begin
|
|
||||||
if idx in array(0,1,2,3) then return faxes_bounds[idx];
|
|
||||||
return faxes_bounds;
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function gs_data_bounds(vidx,v);
|
function gs_data_bounds(vidx,v);
|
||||||
begin
|
begin
|
||||||
idx := tg_get_true_idx(vidx);
|
idx := tg_get_true_idx(vidx);
|
||||||
if v=-1 then
|
if (v=-1) or (v=tgc_off) then
|
||||||
begin
|
begin
|
||||||
if idx in array(0,1,2) then
|
if idx in array(0,1,2) then
|
||||||
begin
|
begin
|
||||||
|
|
@ -2071,21 +2091,19 @@ type tg_axes = class(tg_base) //
|
||||||
return faxes_reverse;
|
return faxes_reverse;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function gs_margins(idx,v); //空白
|
function gs_margins(v); //空白
|
||||||
begin
|
begin
|
||||||
if ifnumber(v) then
|
if ifarray(v) then
|
||||||
begin
|
begin
|
||||||
if idx in array(0,1,2,3) then
|
if v<>fmargins and v[0]>0 and v[1]>0 and v[2]>0 and v[3]>0 and (v[0]+v[2])<1 and (v[1]+v[3])<1 then
|
||||||
begin
|
begin
|
||||||
fmargins[idx] := v;
|
fmargins := v;
|
||||||
f_changed .|= c_g_paint_rect;
|
f_changed .|= c_g_paint_rect;
|
||||||
prop_changed("margins",idx);
|
prop_changed("margins",idx);
|
||||||
end
|
end
|
||||||
end else //get
|
return ;
|
||||||
begin
|
|
||||||
if idx in array(0,1,2,3) then return fmargins[idx];
|
|
||||||
return fmargins;
|
|
||||||
end
|
end
|
||||||
|
return fmargins;
|
||||||
end
|
end
|
||||||
function gs_sub_ticks(vidx,v); //小刻度线
|
function gs_sub_ticks(vidx,v); //小刻度线
|
||||||
begin
|
begin
|
||||||
|
|
@ -2323,22 +2341,33 @@ type tg_axes = class(tg_base) //
|
||||||
end
|
end
|
||||||
type tg_canvas = class(TcustomCanvas) //画布对象
|
type tg_canvas = class(TcustomCanvas) //画布对象
|
||||||
uses utslvclgdi;
|
uses utslvclgdi;
|
||||||
function create(h);
|
function create(h,fg);
|
||||||
begin
|
begin
|
||||||
inherited create();
|
inherited create();
|
||||||
|
ffigure := fg;
|
||||||
FCvsHandle := h;
|
FCvsHandle := h;
|
||||||
Handle := h;
|
Handle := h;
|
||||||
faxesrgn := new TRGNPOLY();//new TRGNRECT();
|
faxesrgn := new TRGNPOLY();//new TRGNRECT();
|
||||||
|
ffigurergn := new TRGNRECT();//new TRGNRECT();
|
||||||
|
ffigurergn.rect := fg.rect();
|
||||||
faxesrgntemp := new TRGNPOLY();//new TRGNRECT();
|
faxesrgntemp := new TRGNPOLY();//new TRGNRECT();
|
||||||
|
//ffigurergn.
|
||||||
end
|
end
|
||||||
function axesclip();
|
function axesclip(); //裁剪坐标系范围
|
||||||
begin
|
begin
|
||||||
if faxesrgn then
|
if faxesrgn then
|
||||||
begin
|
begin
|
||||||
_wapi.SelectClipRgn(FCvsHandle,faxesrgn.Handle); //裁剪区域
|
_wapi.SelectClipRgn(FCvsHandle,faxesrgn.Handle); //裁剪区域
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function clip_rgn(pts);//裁剪区域
|
function figureclip(); //裁剪figure区域
|
||||||
|
begin
|
||||||
|
if ffigurergn then
|
||||||
|
begin
|
||||||
|
_wapi.SelectClipRgn(FCvsHandle,ffigurergn.Handle); //裁剪figure
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function clip_rgn(pts);//裁剪指定区域
|
||||||
begin
|
begin
|
||||||
faxesrgntemp.points := pts;
|
faxesrgntemp.points := pts;
|
||||||
h := faxesrgntemp.Handle;
|
h := faxesrgntemp.Handle;
|
||||||
|
|
@ -2352,15 +2381,21 @@ type tg_canvas = class(TcustomCanvas) //
|
||||||
begin
|
begin
|
||||||
Handle := 0;
|
Handle := 0;
|
||||||
faxesrgn := nil;
|
faxesrgn := nil;
|
||||||
|
ffigurergn := nil;
|
||||||
|
faxesrgntemp :=nil;
|
||||||
end
|
end
|
||||||
property axesvector read faxesvector write set_clip_vector;
|
property figure:tg_figure read ffigure; //绘制区域
|
||||||
property axesrec read FaxesRec write set_clip_rect;
|
property axesvector read faxesvector write set_clip_vector; //坐标系区域
|
||||||
|
property axesrec read FaxesRec write set_clip_rect; //坐标系矩形区域
|
||||||
private
|
private
|
||||||
FaxesRec;
|
FaxesRec;
|
||||||
faxesvector;
|
faxesvector;
|
||||||
FCvsHandle;
|
FCvsHandle;
|
||||||
faxesrgn;
|
faxesrgn;
|
||||||
|
ffigurergn;
|
||||||
faxesrgntemp;
|
faxesrgntemp;
|
||||||
|
ffigurerect;
|
||||||
|
[weakref]ffigure;
|
||||||
private
|
private
|
||||||
function set_clip_rect(rec);
|
function set_clip_rect(rec);
|
||||||
begin
|
begin
|
||||||
|
|
@ -2407,6 +2442,17 @@ type tg_axis_main = class(tg_axis) //
|
||||||
end
|
end
|
||||||
private
|
private
|
||||||
[weakref] faxes;
|
[weakref] faxes;
|
||||||
|
function getfontinfo();override;
|
||||||
|
begin
|
||||||
|
if faxes and (ParentFont=tgc_on) then
|
||||||
|
begin
|
||||||
|
r := faxes.fontinfo;
|
||||||
|
r.flinker := self(true);
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
ffontinfo.flinker := self(true);
|
||||||
|
return ffontinfo;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
type tg_label_axis = class(tg_base) //坐标轴标签
|
type tg_label_axis = class(tg_base) //坐标轴标签
|
||||||
public
|
public
|
||||||
|
|
@ -2694,6 +2740,7 @@ type tg_axis = class(tg_base) //
|
||||||
function draw_axis(cvs,subtks);
|
function draw_axis(cvs,subtks);
|
||||||
begin
|
begin
|
||||||
pw := lineinfo.width;
|
pw := lineinfo.width;
|
||||||
|
set_lineinfo_to_canvas(cvs);
|
||||||
tksize := pw+fticksize;
|
tksize := pw+fticksize;
|
||||||
tic_space := 3;
|
tic_space := 3;
|
||||||
tksizesub := fsubticksize+pw;
|
tksizesub := fsubticksize+pw;
|
||||||
|
|
@ -3026,8 +3073,9 @@ type tg_text = class(tg_base)
|
||||||
begin
|
begin
|
||||||
if (visible<>tgc_on) then return ;
|
if (visible<>tgc_on) then return ;
|
||||||
if not fdata then return ;
|
if not fdata then return ;
|
||||||
|
if not ftext then return ;
|
||||||
if not zoom_to_xyz(fdata[0],fdata[1],fdata[2],x,y) then return ;
|
if not zoom_to_xyz(fdata[0],fdata[1],fdata[2],x,y) then return ;
|
||||||
if clip_state=tgc_on then
|
if clip_state=tgc_on or ((p:=parent) and p.clip_state=tgc_on) then
|
||||||
begin
|
begin
|
||||||
bx := axes.zoom_box;
|
bx := axes.zoom_box;
|
||||||
vj := fdata;
|
vj := fdata;
|
||||||
|
|
@ -3050,9 +3098,9 @@ type tg_text = class(tg_base)
|
||||||
x := 0;
|
x := 0;
|
||||||
y := 0;
|
y := 0;
|
||||||
end
|
end
|
||||||
set_lineinfo_to_canvas(cvs);
|
|
||||||
if line_mode=tgc_on then
|
if line_mode=tgc_on then
|
||||||
begin
|
begin
|
||||||
|
set_lineinfo_to_canvas(cvs);
|
||||||
rc := array(x,y,x+w,y+h);
|
rc := array(x,y,x+w,y+h);
|
||||||
cvs.draw_rect().rect(rc).draw();
|
cvs.draw_rect().rect(rc).draw();
|
||||||
end
|
end
|
||||||
|
|
@ -3112,6 +3160,7 @@ type tg_text = class(tg_base)
|
||||||
function set_text(v);
|
function set_text(v);
|
||||||
begin
|
begin
|
||||||
tx := array();
|
tx := array();
|
||||||
|
if ifstring(v) and v then return set_text(array(v));
|
||||||
if not ifarray(v) then return ;
|
if not ifarray(v) then return ;
|
||||||
for i,vi in v do
|
for i,vi in v do
|
||||||
begin
|
begin
|
||||||
|
|
@ -3181,45 +3230,7 @@ type tg_label =class(tg_base) //
|
||||||
end
|
end
|
||||||
txtw := length(ftext)*fontinfo.size;
|
txtw := length(ftext)*fontinfo.size;
|
||||||
txth := fontinfo.size;
|
txth := fontinfo.size;
|
||||||
modify_text_pos(x_,y_,txtw,txth,ftextalign);
|
modify_text_pos(x_,y_,txtw,txth,ftextalign);//修正位置
|
||||||
case ftextalign of
|
|
||||||
2:
|
|
||||||
begin
|
|
||||||
x_ := x_-txtw/2;
|
|
||||||
end
|
|
||||||
3:
|
|
||||||
begin
|
|
||||||
x_ := x_-txtw;
|
|
||||||
end
|
|
||||||
4:
|
|
||||||
begin
|
|
||||||
y_ := y_-txth/2;
|
|
||||||
end
|
|
||||||
5:
|
|
||||||
begin
|
|
||||||
x_ := x_-txtw/2;
|
|
||||||
y_ := y_-txth/2;
|
|
||||||
end
|
|
||||||
6:
|
|
||||||
begin
|
|
||||||
x_ := x_-txtw;
|
|
||||||
y_ := y_-txth/2;
|
|
||||||
end
|
|
||||||
7:
|
|
||||||
begin
|
|
||||||
y_ := y_-txth;
|
|
||||||
end
|
|
||||||
8:
|
|
||||||
begin
|
|
||||||
x_ := x_-txtw/2;
|
|
||||||
y_ := y_-txth;
|
|
||||||
end
|
|
||||||
9:
|
|
||||||
begin
|
|
||||||
x_ := x_-txtw;
|
|
||||||
y_ := y_-txth;
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
rec := array(x_,y_,x_+txtw,y_+txth);
|
rec := array(x_,y_,x_+txtw,y_+txth);
|
||||||
flabel_rgn := rec_to_points(rec)[0:3];
|
flabel_rgn := rec_to_points(rec)[0:3];
|
||||||
if ffont_angle<>0 then
|
if ffont_angle<>0 then
|
||||||
|
|
@ -4126,210 +4137,176 @@ type tg_Polyline = class(tg_graph) //
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
type tg_line_info = class(tg_const) //线型信息
|
type tg_gdi = class(tg_const) //gdi对象基类
|
||||||
|
function create(awner);
|
||||||
|
begin
|
||||||
|
fpdata := array();
|
||||||
|
FOwner := awner;
|
||||||
|
end
|
||||||
|
function clone();//克隆信息
|
||||||
|
begin
|
||||||
|
r := createobject(self(true).Classinfo(1),nil);
|
||||||
|
r.fpdata := fpdata;
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
property info read fpdata write set_pdatas; //数据信息
|
||||||
|
[weakref]flinker;
|
||||||
|
protected
|
||||||
|
function check_prop(idx,v);virtual;//检查数据
|
||||||
|
begin
|
||||||
|
return true;
|
||||||
|
end
|
||||||
|
function set_pdatas(d); //设置数据
|
||||||
|
begin
|
||||||
|
if flinker then
|
||||||
|
begin
|
||||||
|
flinker.ParentFont := false;
|
||||||
|
if flinker<>FOwner then
|
||||||
|
begin
|
||||||
|
ft := flinker.fontinfo;
|
||||||
|
ft.info := d;
|
||||||
|
return ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
{
|
||||||
|
if (flinker and flinker<>FOwner) then
|
||||||
|
begin
|
||||||
|
flinker.ParentFont := false;
|
||||||
|
ft := flinker.fontinfo;
|
||||||
|
ft.info := d;
|
||||||
|
return ;
|
||||||
|
end }
|
||||||
|
for i,v in d do
|
||||||
|
begin
|
||||||
|
if fpdata[i]<>v and check_prop(i,v) then
|
||||||
|
begin
|
||||||
|
cg := true;
|
||||||
|
fpdata[i] := v;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if cg then
|
||||||
|
begin
|
||||||
|
pdata_changed();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function pdata_changed();virtual; //数据改变
|
||||||
|
begin
|
||||||
|
if fonwer then fonwer.invalidate();
|
||||||
|
end
|
||||||
|
function get_pdata(idx);//获取单个字段
|
||||||
|
begin
|
||||||
|
return fpdata[idx];
|
||||||
|
end
|
||||||
|
function set_pdata(idx,v);//设置单个值
|
||||||
|
begin
|
||||||
|
set_pdatas(array(idx:v));
|
||||||
|
end
|
||||||
|
fpdata; //数据
|
||||||
|
private
|
||||||
|
[weakref]FOwner;
|
||||||
|
end
|
||||||
|
type tg_line_info = class(tg_gdi) //线型信息
|
||||||
function create(awer);
|
function create(awer);
|
||||||
begin
|
begin
|
||||||
fcolor := 0;
|
inherited;
|
||||||
FWidth := 1;
|
fpdata := array("color":0,"size":1,"style":tgc_PS_SOLID,"bkcolor":nil);
|
||||||
FStyle := tgc_PS_SOLID;
|
|
||||||
fbkcolor := nil;
|
|
||||||
fonwer := awer;
|
|
||||||
end
|
end
|
||||||
function clone();
|
property style index "style" read get_pdata write set_pdata;
|
||||||
|
property width index "size" read get_pdata write set_pdata;
|
||||||
|
property size index "size" read get_pdata write set_pdata;
|
||||||
|
property color index "color" read get_pdata write set_pdata;
|
||||||
|
property bkcolor index "bkcolor" read get_pdata write set_pdata;
|
||||||
|
protected
|
||||||
|
function check_prop(idx,v);override;//检查数据
|
||||||
begin
|
begin
|
||||||
r := new tg_line_info();
|
case idx of
|
||||||
r.style := fstyle;
|
"size":
|
||||||
r.width := FWidth;
|
begin
|
||||||
r.size := FWidth;
|
return ifnumber(v) and v>=0;
|
||||||
r.color := fcolor;
|
|
||||||
r.bkcolor := fbkcolor;
|
|
||||||
return r;
|
|
||||||
end
|
end
|
||||||
property style index "style" read FStyle write setpropid;
|
"style","color":
|
||||||
property width index "width" read FWidth write setpropid;
|
|
||||||
property size index "size" read FWidth write setpropid;
|
|
||||||
property color index "color" read fcolor write setpropid;
|
|
||||||
property bkcolor index "bkcolor" read fbkcolor write setpropid;
|
|
||||||
private
|
|
||||||
fwidth;
|
|
||||||
fcolor;
|
|
||||||
FStyle;
|
|
||||||
fbkcolor;
|
|
||||||
function setpropid(id,v);
|
|
||||||
begin
|
begin
|
||||||
case id of
|
return ifnumber(v);
|
||||||
"style":
|
|
||||||
begin
|
|
||||||
if FStyle<>v and ifnumber(v) then
|
|
||||||
begin
|
|
||||||
FStyle := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
"width","size":
|
|
||||||
begin
|
|
||||||
if FWidth<>v and ifnumber(v) and (v>=0) then
|
|
||||||
begin
|
|
||||||
FWidth := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
"color":
|
|
||||||
begin
|
|
||||||
if fcolor<>v and ifnumber(v) then
|
|
||||||
begin
|
|
||||||
fcolor := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
"bkcolor":
|
"bkcolor":
|
||||||
begin
|
begin
|
||||||
if fbkcolor<>v and (ifnumber(v) or ifnil(v)) then //设置颜色
|
return ifnumber(v) or ifnil(v);
|
||||||
begin
|
|
||||||
fbkcolor := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end;
|
return false;
|
||||||
end
|
end
|
||||||
[weakref]fonwer;
|
|
||||||
end
|
end
|
||||||
type tg_font_info = class(tg_const) //字体信息
|
type tg_font_info = class(tg_gdi) //字体信息
|
||||||
function create(awner);
|
function create(awner);
|
||||||
begin
|
begin
|
||||||
fstyle := nil;
|
inherited;
|
||||||
fsize := 7;
|
fpdata := array("style":nil,"size":7,"color":0,"bkcolor":nil);
|
||||||
fforeground := 0;
|
|
||||||
fbackground := nil;
|
|
||||||
fonwer := awner;
|
|
||||||
end
|
end
|
||||||
function clone();
|
property style index "style" read get_pdata write set_pdata;
|
||||||
|
property size index "size" read get_pdata write set_pdata;
|
||||||
|
property color index "color" read get_pdata write set_pdata;
|
||||||
|
property bkcolor index "bkcolor" read get_pdata write set_pdata;
|
||||||
|
protected
|
||||||
|
function check_prop(idx,v);override;//检查数据
|
||||||
begin
|
begin
|
||||||
r := new tg_font_info();
|
case idx of
|
||||||
r.style := fstyle;
|
"size":
|
||||||
r.size := fsize;
|
begin
|
||||||
r.color := fforeground;
|
return ifnumber(v) and v>5;
|
||||||
r.bkcolor := fbackground;
|
|
||||||
return r;
|
|
||||||
end
|
end
|
||||||
property style index "style" read fstyle write setpropid;
|
|
||||||
property size index "size" read fsize write setpropid;
|
|
||||||
property color index "color" read fforeground write setpropid;
|
|
||||||
property bkcolor index "bkcolor" read fbackground write setpropid;
|
|
||||||
private
|
|
||||||
fstyle;
|
|
||||||
fsize;
|
|
||||||
fsize_unit;
|
|
||||||
fforeground;
|
|
||||||
fbackground;
|
|
||||||
[weakref]fonwer;
|
|
||||||
function setpropid(id,v);
|
|
||||||
begin
|
|
||||||
case id of
|
|
||||||
"style":
|
"style":
|
||||||
begin
|
begin
|
||||||
if FStyle<>v and ifnumber(v) then
|
return ifnumber(v);
|
||||||
begin
|
|
||||||
FStyle := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
end
|
||||||
|
"color":
|
||||||
|
begin
|
||||||
|
return ifnumber(v) or (v=tgc_complementary_color);
|
||||||
|
end
|
||||||
|
"bkcolor":
|
||||||
|
begin
|
||||||
|
return ifnumber(v) or ifnil(v);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
type tg_mark_info = class(tg_gdi) //标记信息
|
||||||
|
function create(awner);
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
fpdata := array("style":tgc_mks_dot,"size":0,"size_unit":tgc_mk_point,"color":0,"bkcolor":0xffffff);
|
||||||
|
end
|
||||||
|
property style index "style" read get_pdata write set_pdata;
|
||||||
|
property size index "size" read get_pdata write set_pdata;
|
||||||
|
property size_unit read get_pdata write set_pdata;
|
||||||
|
property color index "color" read get_pdata write set_pdata;
|
||||||
|
property bkcolor index "bkcolor" read get_pdata write set_pdata;
|
||||||
|
protected
|
||||||
|
function check_prop(idx,v);override;//检查数据
|
||||||
|
begin
|
||||||
|
case idx of
|
||||||
|
"size_unit":
|
||||||
|
begin
|
||||||
|
return (tgc_mk_tabulated=v or tgc_mk_point=v);
|
||||||
end
|
end
|
||||||
"size":
|
"size":
|
||||||
begin
|
begin
|
||||||
if fsize<>v and ifnumber(v) and (v>5) then
|
return ifnumber(v) and v>=0;
|
||||||
begin
|
|
||||||
fsize := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
"color":
|
|
||||||
begin
|
|
||||||
if fforeground<>v and ifnumber(v) then
|
|
||||||
begin
|
|
||||||
fforeground := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
"bkcolor":
|
|
||||||
begin
|
|
||||||
if fbackground<>v and (ifnumber(v) or ifnil(v)) then
|
|
||||||
begin
|
|
||||||
fbackground := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
type tg_mark_info = class(tg_const) //标记信息
|
|
||||||
function create(awner);
|
|
||||||
begin
|
|
||||||
fstyle := tgc_mks_dot;
|
|
||||||
fsize := 0;
|
|
||||||
fsize_unit := tgc_mk_point;
|
|
||||||
fforeground := 0;
|
|
||||||
fbackground := 0xffffff;
|
|
||||||
fonwer := awner;
|
|
||||||
end
|
|
||||||
function clone();
|
|
||||||
begin
|
|
||||||
r := new tg_mark_info();
|
|
||||||
r.Style := fstyle;
|
|
||||||
r.size := fsize;
|
|
||||||
r.size_unit := fsize_unit;
|
|
||||||
r.color := fforeground;
|
|
||||||
r.bkcolor := fbackground;
|
|
||||||
return r;
|
|
||||||
end
|
|
||||||
property style index "style" read fstyle write setpropid;
|
|
||||||
property size index "size" read fsize write setpropid;
|
|
||||||
property size_unit read fsize_unit write fsize_unit;
|
|
||||||
property color index "color" read fforeground write setpropid;
|
|
||||||
property bkcolor index "bkcolor" read fbackground write setpropid;
|
|
||||||
private
|
|
||||||
fstyle;
|
|
||||||
fsize;
|
|
||||||
fsize_unit;
|
|
||||||
fforeground;
|
|
||||||
fbackground;
|
|
||||||
[weakref]fonwer;
|
|
||||||
function setpropid(id,v);
|
|
||||||
begin
|
|
||||||
case id of
|
|
||||||
"style":
|
"style":
|
||||||
begin
|
begin
|
||||||
if FStyle<>v and ifnumber(v) then
|
return (v and ifstring(v));
|
||||||
begin
|
|
||||||
FStyle := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
|
||||||
"size":
|
|
||||||
begin
|
|
||||||
if fsize<>v and ifnumber(v) then
|
|
||||||
begin
|
|
||||||
fsize := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
"color":
|
"color":
|
||||||
begin
|
begin
|
||||||
if fforeground<>v and ifnumber(v) then
|
return ifnumber(v);
|
||||||
begin
|
|
||||||
fforeground := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
"bkcolor":
|
"bkcolor":
|
||||||
begin
|
begin
|
||||||
if fbackground<>v and (ifnumber(v) or ifnil(v)) then
|
return ifnumber(v) or ifnil(v);
|
||||||
begin
|
|
||||||
fbackground := v;
|
|
||||||
if fonwer then fonwer.invalidate();
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end;
|
return false;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
type tg_evet_conainter = class(tg_const) //带消息的绘图基类
|
type tg_evet_conainter = class(tg_const) //带消息的绘图基类
|
||||||
|
|
@ -4369,6 +4346,7 @@ type tg_base = class(TNode,tg_evet_conainter) //
|
||||||
fenabled := tgc_on;
|
fenabled := tgc_on;
|
||||||
fline_mode := tgc_off;
|
fline_mode := tgc_off;
|
||||||
fmark_mode := tgc_off;
|
fmark_mode := tgc_off;
|
||||||
|
fParentFont := tgc_on;
|
||||||
flineinfo := new tg_line_info(self(true));
|
flineinfo := new tg_line_info(self(true));
|
||||||
fmarkinfo := new tg_mark_info(self(true));
|
fmarkinfo := new tg_mark_info(self(true));
|
||||||
ffontinfo := new tg_font_info(self(true));
|
ffontinfo := new tg_font_info(self(true));
|
||||||
|
|
@ -4425,24 +4403,26 @@ type tg_base = class(TNode,tg_evet_conainter) //
|
||||||
else
|
else
|
||||||
li := lineinfo;
|
li := lineinfo;
|
||||||
cl := li.color;
|
cl := li.color;
|
||||||
cvs.pen.style := li.style;
|
bcl := li.bkcolor;
|
||||||
|
cp := cvs.pen;
|
||||||
|
cp.style := li.style;
|
||||||
if ifnumber(cl) then
|
if ifnumber(cl) then
|
||||||
begin
|
begin
|
||||||
cvs.pen.color := cl;
|
cp.color := cl;
|
||||||
end else
|
end else
|
||||||
begin
|
begin
|
||||||
cvs.pen.Style := tgc_BS_NULL;
|
cp.Style := tgc_BS_NULL;
|
||||||
end
|
end
|
||||||
cvs.pen.width := li.width;
|
cp.width := li.width;
|
||||||
bcl := li.bkcolor;
|
cb := cvs.brush;
|
||||||
if ifnumber(bcl) then
|
if ifnumber(bcl) then
|
||||||
begin
|
begin
|
||||||
cvs.brush.color := bcl;
|
cb.color := bcl;
|
||||||
cvs.brush.Style := tgc_BS_SOLID;
|
cb.Style := tgc_BS_SOLID;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
cvs.brush.Style := tgc_BS_NULL;
|
cb.Style := tgc_BS_NULL;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function set_fontinfo_to_canvas(cvs,info); //设置字体信息到画布
|
function set_fontinfo_to_canvas(cvs,info); //设置字体信息到画布
|
||||||
|
|
@ -4450,10 +4430,19 @@ type tg_base = class(TNode,tg_evet_conainter) //
|
||||||
if info is class(tg_font_info) then fi := info;
|
if info is class(tg_font_info) then fi := info;
|
||||||
else
|
else
|
||||||
fi := fontinfo;
|
fi := fontinfo;
|
||||||
cvs.font.color := fi.color;
|
cf := cvs.font;
|
||||||
cvs.font.bkcolor := fi.bkcolor;
|
if ifnil(fi.bkcolor) then cf.bkmode := 1;
|
||||||
cvs.font.width := fi.size;
|
else cf.bkmode := 2;
|
||||||
cvs.font.height := fi.size*2;
|
bc := fi.bkcolor;
|
||||||
|
cf.bkcolor := bc;
|
||||||
|
if fi.color =tgc_complementary_color then
|
||||||
|
begin
|
||||||
|
if ifnil(bc) then cf.color := 0;
|
||||||
|
else
|
||||||
|
cf.color := calc_complementary_color(bc);
|
||||||
|
end else cf.color := fi.color;
|
||||||
|
cf.width := fi.size;
|
||||||
|
cf.height := fi.size*2;
|
||||||
end
|
end
|
||||||
function dispatchEvent(evt); //分发
|
function dispatchEvent(evt); //分发
|
||||||
begin
|
begin
|
||||||
|
|
@ -4496,7 +4485,8 @@ type tg_base = class(TNode,tg_evet_conainter) //
|
||||||
property enabled read fenabled write setenabled;
|
property enabled read fenabled write setenabled;
|
||||||
property lineinfo read flineinfo;
|
property lineinfo read flineinfo;
|
||||||
property markinfo read fmarkinfo;
|
property markinfo read fmarkinfo;
|
||||||
property fontinfo read ffontinfo;
|
property fontinfo read getfontinfo;
|
||||||
|
property ParentFont read fParentFont write setParentFont;
|
||||||
property change_locked read fchange_locked write fchange_locked;
|
property change_locked read fchange_locked write fchange_locked;
|
||||||
property onhit_at read fonhit_at write fonhit_at;
|
property onhit_at read fonhit_at write fonhit_at;
|
||||||
public
|
public
|
||||||
|
|
@ -4533,6 +4523,8 @@ type tg_base = class(TNode,tg_evet_conainter) //
|
||||||
end
|
end
|
||||||
return r;
|
return r;
|
||||||
end
|
end
|
||||||
|
protected
|
||||||
|
ffontinfo;
|
||||||
private
|
private
|
||||||
[weakref]fonhit_at;
|
[weakref]fonhit_at;
|
||||||
fclip_state;
|
fclip_state;
|
||||||
|
|
@ -4542,8 +4534,29 @@ type tg_base = class(TNode,tg_evet_conainter) //
|
||||||
fenabled;
|
fenabled;
|
||||||
flineinfo;
|
flineinfo;
|
||||||
fmarkinfo;
|
fmarkinfo;
|
||||||
ffontinfo;
|
|
||||||
fchange_locked;
|
fchange_locked;
|
||||||
|
fParentFont;
|
||||||
|
function getfontinfo();virtual;
|
||||||
|
begin
|
||||||
|
p := parent;
|
||||||
|
if p and (fParentFont=tgc_on) then
|
||||||
|
begin
|
||||||
|
r := p.fontinfo;
|
||||||
|
r.flinker := self(true);
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
ffontinfo.flinker := self(true);
|
||||||
|
return ffontinfo;
|
||||||
|
end
|
||||||
|
function setParentFont(v);
|
||||||
|
begin
|
||||||
|
if tg_boolen_value(v,nv) and nv <>fParentFont then
|
||||||
|
begin
|
||||||
|
fParentFont := nv;
|
||||||
|
prop_changed("parentfont",nv);
|
||||||
|
end
|
||||||
|
end
|
||||||
function set_clip_state(v);
|
function set_clip_state(v);
|
||||||
begin
|
begin
|
||||||
if tg_boolen_value(v,nv) and (nv<>fclip_state) then
|
if tg_boolen_value(v,nv) and (nv<>fclip_state) then
|
||||||
|
|
@ -4621,19 +4634,21 @@ type tg_const = class()
|
||||||
static const tgc_mks_triangle_down = "triangle_down";
|
static const tgc_mks_triangle_down = "triangle_down";
|
||||||
static const tgc_mks_triangle_left = "triangle_left";
|
static const tgc_mks_triangle_left = "triangle_left";
|
||||||
static const tgc_mks_triangle_right = "triangle_right";
|
static const tgc_mks_triangle_right = "triangle_right";
|
||||||
|
///////////点类型/////////////////////////////////////////////
|
||||||
static const tgc_mk_tabulated = "tabulated";
|
static const tgc_mk_tabulated = "tabulated";
|
||||||
static const tgc_mk_point = "point";
|
static const tgc_mk_point = "point";
|
||||||
/////////////////数据提示类型////////////////////////////////////
|
/////////////////数据提示类型////////////////////////////////////
|
||||||
static const tgc_DT_always = "always";
|
static const tgc_DT_always = "always";
|
||||||
static const tgc_DT_mouseclick = "mouseclick";
|
static const tgc_DT_mouseclick = "mouseclick";
|
||||||
static const tgc_DT_mouseover = "mouseover";
|
static const tgc_DT_mouseover = "mouseover";
|
||||||
////////////画笔画刷类型/////////////////////////////////
|
////////////线类型/////////////////////////////////
|
||||||
static const tgc_PS_SOLID=0x0;
|
static const tgc_PS_SOLID=0x0;
|
||||||
static const tgc_PS_DASH=0x1;
|
static const tgc_PS_DASH=0x1;
|
||||||
static const tgc_PS_DOT=0x2;
|
static const tgc_PS_DOT=0x2;
|
||||||
static const tgc_PS_DASHDOT=0x3;
|
static const tgc_PS_DASHDOT=0x3;
|
||||||
static const tgc_PS_DASHDOTDOT=0x4;
|
static const tgc_PS_DASHDOTDOT=0x4;
|
||||||
static const tgc_PS_NULL=0x5 ;
|
static const tgc_PS_NULL=0x5 ;
|
||||||
|
/////////////填充类型////////////////
|
||||||
static const tgc_BS_NULL=1;
|
static const tgc_BS_NULL=1;
|
||||||
static const tgc_BS_SOLID=0;
|
static const tgc_BS_SOLID=0;
|
||||||
|
|
||||||
|
|
@ -4674,6 +4689,9 @@ type tg_const = class()
|
||||||
static const cmd_figure_changed = "figure_changed";
|
static const cmd_figure_changed = "figure_changed";
|
||||||
static const cmd_data_changed = "data_changed";
|
static const cmd_data_changed = "data_changed";
|
||||||
static const cmd_node_add_in = "node_add_in";
|
static const cmd_node_add_in = "node_add_in";
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
static const tgc_complementary_color = "complementary_color"; //采用补色
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
end
|
end
|
||||||
type tg_evt =class() //消息
|
type tg_evt =class() //消息
|
||||||
|
|
@ -4796,12 +4814,12 @@ type tevent_item = class()
|
||||||
ename;
|
ename;
|
||||||
[weakref]efunc;
|
[weakref]efunc;
|
||||||
end
|
end
|
||||||
type tevent_list = class()
|
type tevent_list = class() //消息对象列表
|
||||||
function create();
|
function create();
|
||||||
begin
|
begin
|
||||||
FItems := array();
|
FItems := array();
|
||||||
end
|
end
|
||||||
function add(n,f);
|
function add(n,f); //添加
|
||||||
begin
|
begin
|
||||||
if not(ifstring(n) and n) then return 0;
|
if not(ifstring(n) and n) then return 0;
|
||||||
if not ifobj(f) then return 0;
|
if not ifobj(f) then return 0;
|
||||||
|
|
@ -4812,7 +4830,7 @@ type tevent_list = class()
|
||||||
FItems[length(FItems)] := new tevent_item(n,f);
|
FItems[length(FItems)] := new tevent_item(n,f);
|
||||||
return true;
|
return true;
|
||||||
end
|
end
|
||||||
function remove(n,f);
|
function remove(n,f);//移除
|
||||||
begin
|
begin
|
||||||
idx := -1;
|
idx := -1;
|
||||||
for i,v in FItems do
|
for i,v in FItems do
|
||||||
|
|
@ -4829,7 +4847,7 @@ type tevent_list = class()
|
||||||
remove(n,f);
|
remove(n,f);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function dispatch(e);
|
function dispatch(e);//分发
|
||||||
begin
|
begin
|
||||||
for i,it in FItems do
|
for i,it in FItems do
|
||||||
begin
|
begin
|
||||||
|
|
@ -4891,19 +4909,19 @@ begin
|
||||||
_x := x*cos(ag)+y*sin(ag);
|
_x := x*cos(ag)+y*sin(ag);
|
||||||
_y := -x*sin(ag)+y*cos(ag);
|
_y := -x*sin(ag)+y*cos(ag);
|
||||||
end
|
end
|
||||||
function graph_paint_lines(cvs,pls,xys,cls,ifo);
|
function graph_paint_lines(cvs,pls,xys,cls,ifo);//绘制线
|
||||||
begin
|
begin
|
||||||
return paint_lines(cvs,pls,xys,cls,ifo);
|
return paint_lines(cvs,pls,xys,cls,ifo);
|
||||||
end
|
end
|
||||||
function graph_paint_points(mk,dc,xys);
|
function graph_paint_points(mk,dc,xys);//绘制点
|
||||||
begin
|
begin
|
||||||
return paint_marks(mk,dc,xys);
|
return paint_marks(mk,dc,xys);
|
||||||
end
|
end
|
||||||
function graph_paint_boolen_value(n,v);
|
function graph_paint_boolen_value(n,v);//布尔类型格式化
|
||||||
begin
|
begin
|
||||||
return tg_boolen_value(n,v);
|
return tg_boolen_value(n,v);
|
||||||
end
|
end
|
||||||
function graph_paint_rec_to_points(rec);
|
function graph_paint_rec_to_points(rec);//将rect转换为点数组
|
||||||
begin
|
begin
|
||||||
return rec_to_points(rec);
|
return rec_to_points(rec);
|
||||||
end
|
end
|
||||||
|
|
@ -5247,7 +5265,7 @@ begin
|
||||||
end
|
end
|
||||||
return d;
|
return d;
|
||||||
end
|
end
|
||||||
function modify_text_pos(x_,y_,txtw,txth,al);
|
function modify_text_pos(x_,y_,txtw,txth,al);//修正对齐位置
|
||||||
begin
|
begin
|
||||||
case al of
|
case al of
|
||||||
2:
|
2:
|
||||||
|
|
@ -5424,7 +5442,7 @@ begin
|
||||||
pts[i] := array(x+px,y+py);
|
pts[i] := array(x+px,y+py);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function tg_get_true_idx(idx);
|
function tg_get_true_idx(idx);//坐标规范化
|
||||||
begin
|
begin
|
||||||
nidx := idx;
|
nidx := idx;
|
||||||
case idx of
|
case idx of
|
||||||
|
|
@ -5434,6 +5452,11 @@ begin
|
||||||
end ;
|
end ;
|
||||||
return nidx;
|
return nidx;
|
||||||
end
|
end
|
||||||
|
///////////////////////////////////////
|
||||||
|
function calc_complementary_color(c);//补色计算
|
||||||
|
begin
|
||||||
|
return rgb((255-GetRValue(c)),(255-GetgValue(c)),(255-GetbValue(c)));
|
||||||
|
end
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
initialization
|
initialization
|
||||||
finalization
|
finalization
|
||||||
|
|
|
||||||
|
|
@ -482,7 +482,7 @@ type tg_Polycandlestick = class(tg_graph) //k
|
||||||
end
|
end
|
||||||
function get_data_bounds();override; //边界
|
function get_data_bounds();override; //边界
|
||||||
begin
|
begin
|
||||||
fdata_bounds[0,1] := length(fgraph_data);
|
//fdata_bounds[0,1] := length(fgraph_data);
|
||||||
return fdata_bounds;
|
return fdata_bounds;
|
||||||
end
|
end
|
||||||
function paint(cvs);override; //绘制
|
function paint(cvs);override; //绘制
|
||||||
|
|
@ -579,11 +579,10 @@ type tg_Polycandlestick = class(tg_graph) //k
|
||||||
if d<>fgraph_data then
|
if d<>fgraph_data then
|
||||||
begin
|
begin
|
||||||
//fx := d[:,0];
|
//fx := d[:,0];
|
||||||
fy := d[:,3];
|
|
||||||
fdata_bounds[0,0] := 0;
|
fdata_bounds[0,0] := 0;
|
||||||
fdata_bounds[1,0] := minvalue(fy);
|
fdata_bounds[0,1] := length(d);
|
||||||
//fdata_bounds[0,1] := 10;
|
fdata_bounds[1,0] := minvalue(d[:,4]);
|
||||||
fdata_bounds[1,1] := maxvalue(fy);
|
fdata_bounds[1,1] := maxvalue(d[:,3]);
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -740,11 +739,11 @@ type tg_Polyboxplot = class(tg_graph) //
|
||||||
function get_legend_size(w,h);virtual; //??????????
|
function get_legend_size(w,h);virtual; //??????????
|
||||||
begin
|
begin
|
||||||
mk := markinfo;
|
mk := markinfo;
|
||||||
h := fontinfo.size+4;
|
h := fontinfo.size*2+4;
|
||||||
w := 100;
|
w := 100;
|
||||||
if mark_mode=tgc_on then
|
if mark_mode=tgc_on then
|
||||||
begin
|
begin
|
||||||
h := max(10,mk.size+4);
|
h := max(h,mk.size+4);
|
||||||
w := 5*h;
|
w := 5*h;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -806,16 +805,18 @@ end
|
||||||
type tg_Polypie = class(tg_graph) //饼图
|
type tg_Polypie = class(tg_graph) //饼图
|
||||||
function create(pms);
|
function create(pms);
|
||||||
begin
|
begin
|
||||||
|
ftexts := array();
|
||||||
|
fshow_text := 1;
|
||||||
|
pie_radian := array();
|
||||||
inherited;
|
inherited;
|
||||||
clip_state := tgc_on;
|
clip_state := tgc_on;
|
||||||
fcolormap := array(0xc67054, 0x75cc91, 0x58c8fa, 0x6666ee, 0xdec073, 0x72a23b, 0x5284fc, 0xb4609a, 0xcc7cea);
|
fcolormap := get_default_color_list();
|
||||||
line_mode := tgc_on;
|
line_mode := tgc_on;
|
||||||
mark_mode := tgc_off;
|
mark_mode := tgc_off;
|
||||||
fpie_type := 'pie';
|
fpie_type := 'pie';
|
||||||
fdata_bounds := array((0,1),(0,1),(0,1));
|
fdata_bounds := array((0,1),(0,1),(0,1));
|
||||||
fsection_info := array();
|
|
||||||
end
|
end
|
||||||
function get_data_bounds();override; //??????
|
function get_data_bounds();override; //
|
||||||
begin
|
begin
|
||||||
return fdata_bounds;
|
return fdata_bounds;
|
||||||
end
|
end
|
||||||
|
|
@ -825,7 +826,6 @@ type tg_Polypie = class(tg_graph) //
|
||||||
bx := axes.zoom_box;
|
bx := axes.zoom_box;
|
||||||
if clip_state=tgc_on then
|
if clip_state=tgc_on then
|
||||||
begin
|
begin
|
||||||
//cvs.axesclip();
|
|
||||||
pts := array();
|
pts := array();
|
||||||
for i,v in graph_paint_rec_to_points( array(bx[0,0],bx[1,0],bx[0,1],bx[1,1])) do
|
for i,v in graph_paint_rec_to_points( array(bx[0,0],bx[1,0],bx[0,1],bx[1,1])) do
|
||||||
begin
|
begin
|
||||||
|
|
@ -844,26 +844,13 @@ type tg_Polypie = class(tg_graph) //
|
||||||
inliers := array(());
|
inliers := array(());
|
||||||
set_lineinfo_to_canvas(cvs);
|
set_lineinfo_to_canvas(cvs);
|
||||||
ys := array();
|
ys := array();
|
||||||
total := 0;
|
prominentidx := 1;//
|
||||||
total_value_list := array();
|
prominentrate := 0; //
|
||||||
for i,v in fgraph_data do
|
|
||||||
begin
|
|
||||||
total := total + v['value'];
|
|
||||||
total_value_list[i] := v['value'];
|
|
||||||
end
|
|
||||||
pie_radian := data_process(fgraph_data, total);
|
|
||||||
prominentidx := 1;//-1; // ??????????
|
|
||||||
prominentrate := 0; // ??????????
|
|
||||||
pie_data := array();
|
|
||||||
fpei_parts_data := array();
|
fpei_parts_data := array();
|
||||||
for i,v in pie_radian do
|
for i,v in pie_radian do
|
||||||
begin
|
begin
|
||||||
if fpie_type='pie' then
|
if fpie_type='pie' then
|
||||||
begin
|
begin
|
||||||
fsection_info[i]['StartAngle'] := v[0];
|
|
||||||
fsection_info[i]['EndAngle'] := v[1];
|
|
||||||
fsection_info[i]['MinRadius'] := 0;
|
|
||||||
fsection_info[i]['MaxRadius' ] := 1.2;
|
|
||||||
pie_data := 1+get_pie_lines(v[0],v[1],i=prominentidx,prominentrate);
|
pie_data := 1+get_pie_lines(v[0],v[1],i=prominentidx,prominentrate);
|
||||||
end
|
end
|
||||||
else if fpie_type='ring' then
|
else if fpie_type='ring' then
|
||||||
|
|
@ -872,11 +859,9 @@ type tg_Polypie = class(tg_graph) //
|
||||||
end
|
end
|
||||||
else if fpie_type='rose' then
|
else if fpie_type='rose' then
|
||||||
begin
|
begin
|
||||||
proportion := total_value_list[i] / MaxValue(total_value_list);
|
pie_data := 1+get_rose_lines(v[0],v[1],i=prominentidx,prominentrate, v[3]);
|
||||||
pie_data := 1+get_rose_lines(v[0],v[1],i=prominentidx,prominentrate, proportion);
|
|
||||||
end
|
end
|
||||||
xys := array();
|
xys := array();
|
||||||
inner_xyz := array();
|
|
||||||
for j,v in pie_data do
|
for j,v in pie_data do
|
||||||
begin
|
begin
|
||||||
if not zoom_to_xyz(v[0],v[1],bx[2,0],x,y) then return ;
|
if not zoom_to_xyz(v[0],v[1],bx[2,0],x,y) then return ;
|
||||||
|
|
@ -884,13 +869,17 @@ type tg_Polypie = class(tg_graph) //
|
||||||
end
|
end
|
||||||
index := i%length(fcolormap);
|
index := i%length(fcolormap);
|
||||||
item_color := fcolormap[index];
|
item_color := fcolormap[index];
|
||||||
paint_pie(cvs,xys,array("line_mode":line_mode,"bar_width":tempbarw,"color":item_color,"bkcolor":item_color,"xy0":ys));
|
paint_pie(cvs,xys,array("line_mode":line_mode,"color":item_color,"bkcolor":item_color,"xy0":ys));
|
||||||
fpei_parts_data[i] := xys;
|
fpei_parts_data[i] := xys;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function executecommand(cmd,p);override;
|
function executecommand(cmd,p);override;
|
||||||
begin
|
begin
|
||||||
case cmd of
|
case cmd of
|
||||||
|
"get_texts":
|
||||||
|
begin
|
||||||
|
return ftexts;
|
||||||
|
end
|
||||||
"hit_part":
|
"hit_part":
|
||||||
begin
|
begin
|
||||||
for i,v in fpei_parts_data do
|
for i,v in fpei_parts_data do
|
||||||
|
|
@ -899,54 +888,54 @@ type tg_Polypie = class(tg_graph) //
|
||||||
end
|
end
|
||||||
return -1;
|
return -1;
|
||||||
end
|
end
|
||||||
"get_section_info":return (visible=tgc_on)? fsection_info:nil; //???????
|
|
||||||
"points_in_section":return (visible=tgc_on)? IsPointInPieSection(p):false; //???????
|
|
||||||
end;
|
end;
|
||||||
return inherited;
|
return inherited;
|
||||||
end
|
end
|
||||||
function get_legend_size(w,h);override; //??????????
|
function get_legend_size(w,h);override; //获取图例大小
|
||||||
begin
|
begin
|
||||||
|
if not pie_radian then return inherited;
|
||||||
sz := fontinfo.size;
|
sz := fontinfo.size;
|
||||||
h := (sz+6)*max(1,length(pie_radian))+5;
|
h := (sz*2+6)*max(1,length(pie_radian))+5;
|
||||||
w := 0;
|
w := 0;
|
||||||
ws := 5;
|
ws := 5;
|
||||||
for i,v in fgraph_data do
|
for i,v in pie_radian do
|
||||||
begin
|
begin
|
||||||
si :=v["name"];
|
si :=v[2];
|
||||||
if ifstring(si) then ws := max((length(si))*sz,ws);
|
if ifstring(si) then ws := max((length(si))*sz,ws);
|
||||||
end
|
end
|
||||||
w +=ws;
|
w +=ws;
|
||||||
w +=35;
|
w +=35;
|
||||||
end
|
end
|
||||||
function paint_legend(cvs,rec);override; //???????
|
function paint_legend(cvs,rec);override; //绘制图例
|
||||||
begin
|
begin
|
||||||
set_lineinfo_to_canvas(cvs);
|
set_lineinfo_to_canvas(cvs);
|
||||||
set_fontinfo_to_canvas(cvs);
|
set_fontinfo_to_canvas(cvs);
|
||||||
h := fontinfo.size+6;// + ((h-fontinfo.size)/2);
|
h := fontinfo.size*2+6;// + ((h-fontinfo.size)/2);
|
||||||
y0 := rec[1]+h;
|
y0 := rec[1]+h;
|
||||||
for i,v in fgraph_data do
|
for i,v in pie_radian do
|
||||||
begin
|
begin
|
||||||
index := i%length(fcolormap);
|
index := i%length(fcolormap);
|
||||||
item_color := fcolormap[index];
|
item_color := fcolormap[index];
|
||||||
xys := array((rec[0]+2,y0+i*h),(rec[0]+25,y0+i*h),(rec[0]+25,y0-fontinfo.size+i*h),(rec[0]+2,y0-fontinfo.size+i*h));
|
xys := array((rec[0]+2,y0+i*h-3),(rec[0]+25,y0+i*h-3),(rec[0]+25,y0-h+6+i*h),(rec[0]+2,y0-h+6+i*h));
|
||||||
paint_pie(cvs,xys,array("line_mode":line_mode,"bar_width":fbar_width,"color":item_color,"bkcolor":item_color));
|
paint_pie(cvs,xys,array("line_mode":line_mode,"bar_width":fbar_width,"color":item_color,"bkcolor":item_color));
|
||||||
cvs.textout(v["name"],array(rec[0]+30,y0+(i-1)*h));
|
cvs.textout(v[2],array(rec[0]+30,y0+(i-1)*h+3));
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
property color_map read fcolormap write set_colormap;// ???
|
property color_map read fcolormap write set_colormap;//颜色地图
|
||||||
property pie_type read fpie_type write fpie_type;// ???????
|
property pie_type read fpie_type write set_pie_type;//类型
|
||||||
property section_info read fsection_info;//= "0" ??????
|
property show_text read fshow_text write set_show_text;
|
||||||
private
|
private
|
||||||
|
ftexts;
|
||||||
|
fshow_text;
|
||||||
pie_radian;
|
pie_radian;
|
||||||
fpei_parts_data;
|
fpei_parts_data;
|
||||||
fdata_bounds;
|
fdata_bounds;
|
||||||
fpie_type;
|
fpie_type;
|
||||||
fforeground;
|
fforeground;
|
||||||
fbackground;
|
fbackground;
|
||||||
fsection_info;
|
|
||||||
fcolormap;
|
fcolormap;
|
||||||
protected
|
protected
|
||||||
function set_graph_data(d);override; //????????
|
function set_graph_data(d);override; //设置数据
|
||||||
begin
|
begin
|
||||||
if d<>fgraph_data then
|
if d<>fgraph_data then
|
||||||
begin
|
begin
|
||||||
|
|
@ -955,9 +944,26 @@ type tg_Polypie = class(tg_graph) //
|
||||||
fdata_bounds[0,1] := 2;
|
fdata_bounds[0,1] := 2;
|
||||||
fdata_bounds[1,1] := 2;
|
fdata_bounds[1,1] := 2;
|
||||||
inherited;
|
inherited;
|
||||||
|
data_process();
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
private
|
private
|
||||||
|
function set_pie_type(v);
|
||||||
|
begin
|
||||||
|
if v<>fpie_type and ( v in array("pie","rose","ring")) then
|
||||||
|
begin
|
||||||
|
fpie_type := v;
|
||||||
|
data_process();
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function set_show_text(v);
|
||||||
|
begin
|
||||||
|
if v<>fshow_text and (v in array(0,1,2,3)) then
|
||||||
|
begin
|
||||||
|
fshow_text := v;
|
||||||
|
data_process();
|
||||||
|
end
|
||||||
|
end
|
||||||
function set_colormap(v);
|
function set_colormap(v);
|
||||||
begin
|
begin
|
||||||
if ifarray(v) and v<>fcolormap then
|
if ifarray(v) and v<>fcolormap then
|
||||||
|
|
@ -965,53 +971,88 @@ type tg_Polypie = class(tg_graph) //
|
||||||
fcolormap := v;
|
fcolormap := v;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function IsPointInPieSection(opt);
|
function data_process(); //
|
||||||
begin
|
begin
|
||||||
px := opt[0]; // 鼠标的x坐标
|
total := 0;
|
||||||
py := opt[1]; // 鼠标的y坐标
|
total_value_list := array();
|
||||||
cx := opt[2]; // 圆心的x坐标
|
for i,v in fgraph_data do
|
||||||
cy := opt[3]; // 圆心的y坐标
|
|
||||||
arc := opt[4]; // 当前扇区的信息,包括起始和结束角度、最小和最大半径
|
|
||||||
xyz_to_zoom(opt[0], opt[1], z, px, py);
|
|
||||||
|
|
||||||
// 计算鼠标点相对于圆心的角度,范围在 [-π, π]
|
|
||||||
pointAngle := CalculateAngle(px, py, cx, cy);
|
|
||||||
// 将角度规范化到 [0, 2π),确保是从12点钟方向顺时针方向
|
|
||||||
if pointAngle < 0 then
|
|
||||||
pointAngle := pointAngle + 2 * pi();
|
|
||||||
// 计算鼠标点到圆心的距离
|
|
||||||
pointDistance := Sqrt(Sqr(px - cx) + Sqr(py - cy));
|
|
||||||
// 获取并规范化扇形的起始和结束角度到 [0, 2π)
|
|
||||||
normalizedArcStart := arc['StartAngle'] ;
|
|
||||||
normalizedArcEnd := arc['EndAngle'];
|
|
||||||
// 检查角度是否在扇形范围内
|
|
||||||
if normalizedArcStart > normalizedArcEnd then
|
|
||||||
// 处理跨越0度的情况
|
|
||||||
isInAngleRange := (pointAngle >= normalizedArcStart) or (pointAngle <= normalizedArcEnd)
|
|
||||||
else
|
|
||||||
// 正常情况
|
|
||||||
isInAngleRange := (pointAngle >= normalizedArcStart) and (pointAngle <= normalizedArcEnd);
|
|
||||||
// 检查点是否在扇形的半径范围内
|
|
||||||
isInRadiusRange := (pointDistance >= arc['MinRadius']) and (pointDistance <= arc['MaxRadius']);
|
|
||||||
// 综合判断鼠标点是否在当前扇区内
|
|
||||||
Result := isInAngleRange and isInRadiusRange;
|
|
||||||
return Result; // 返回最终判断结果
|
|
||||||
end;
|
|
||||||
function CalculateAngle(px, py, cx, cy: Real): Real;
|
|
||||||
begin
|
begin
|
||||||
return ArcTan2( px - cx,py - cy);
|
total := total + v['value'];
|
||||||
end;
|
total_value_list[i] := v['value'];
|
||||||
function data_process(data, total); //
|
|
||||||
begin
|
|
||||||
currentAngle := 0;
|
|
||||||
segments := array();
|
|
||||||
for i,v in data do
|
|
||||||
begin
|
|
||||||
segments[i][0] := currentAngle;
|
|
||||||
segments[i][1] := currentAngle + (v['value'] / total) * 2 * pi();
|
|
||||||
currentAngle := segments[i][1];
|
|
||||||
end
|
end
|
||||||
return segments;
|
maxt := maxvalue(total_value_list);
|
||||||
|
currentAngle := 0;
|
||||||
|
pie_radian := array();
|
||||||
|
for i,v in ftexts do //清空
|
||||||
|
begin
|
||||||
|
v.parent := false;
|
||||||
|
end
|
||||||
|
ftexts := array();
|
||||||
|
for i,v in fgraph_data do
|
||||||
|
begin
|
||||||
|
pie_radian[i][0] := currentAngle;
|
||||||
|
rs := v['value'] / total;
|
||||||
|
pie_radian[i][1] := currentAngle + (rs) * 2 * pi();
|
||||||
|
sri := format("%3f",rs*100)+"%";
|
||||||
|
pie_radian[i][2] := mult_str(" ",7-length(sri))$sri$" "$v["name"];
|
||||||
|
pie_radian[i][3] := v['value']/maxt;
|
||||||
|
pie_radian[i][4] := currentAngle + rs * pi();
|
||||||
|
pie_radian[i][5] := (rs) * 2 * pi();
|
||||||
|
carg := currentAngle + rs * pi();
|
||||||
|
currentAngle := pie_radian[i][1];
|
||||||
|
gtx := new tg_text();
|
||||||
|
gtx.parent := self;
|
||||||
|
gtx.clip_state :=false;
|
||||||
|
case pie_type of
|
||||||
|
"rose":
|
||||||
|
begin
|
||||||
|
gtx.data := 1+array(sin(pie_radian[i][4])*pie_radian[i][3],cos(pie_radian[i][4])*pie_radian[i][3]);
|
||||||
|
end
|
||||||
|
"ring":
|
||||||
|
begin
|
||||||
|
gtx.data := 1+array(sin(pie_radian[i][4])*0.7,cos(pie_radian[i][4])*0.7);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
gtx.data := 1+array(sin(pie_radian[i][4]),cos(pie_radian[i][4]))*0.8;
|
||||||
|
end
|
||||||
|
end ;
|
||||||
|
if carg<(pi()/4) then
|
||||||
|
begin
|
||||||
|
gtx.textalign := 8;
|
||||||
|
end else
|
||||||
|
if carg<(pi()*3/4) then
|
||||||
|
begin
|
||||||
|
gtx.textalign := 4;
|
||||||
|
end else
|
||||||
|
if carg<(pi()*5/4) then
|
||||||
|
begin
|
||||||
|
gtx.textalign := 2;
|
||||||
|
end else
|
||||||
|
if carg<(pi()*7/4) then
|
||||||
|
begin
|
||||||
|
gtx.textalign := 6;
|
||||||
|
end else gtx.textalign := 8;
|
||||||
|
case fshow_text of
|
||||||
|
1:
|
||||||
|
begin
|
||||||
|
gtx.text := array(sri);
|
||||||
|
end
|
||||||
|
2:
|
||||||
|
begin
|
||||||
|
gtx.text := array(v["name"]);
|
||||||
|
end
|
||||||
|
3:
|
||||||
|
begin
|
||||||
|
gtx.text := array(pie_radian[i][2]);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
gtx.text := array();
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
ftexts[i] := gtx;
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
function get_pie_lines(arg1,arg2,prominent,prominentrate); //?????????????
|
function get_pie_lines(arg1,arg2,prominent,prominentrate); //?????????????
|
||||||
begin
|
begin
|
||||||
|
|
@ -1020,7 +1061,7 @@ type tg_Polypie = class(tg_graph) //
|
||||||
r := array();
|
r := array();
|
||||||
r[0] := array(0,0);
|
r[0] := array(0,0);
|
||||||
idx := 1;
|
idx := 1;
|
||||||
for i:= arg1+(prominent?stp:0) to arg2-(prominent?stp:0) step stp do
|
for i:= arg1 to arg2 step stp do
|
||||||
begin
|
begin
|
||||||
r[idx++] := array(sin(i),cos(i));
|
r[idx++] := array(sin(i),cos(i));
|
||||||
end
|
end
|
||||||
|
|
@ -1033,34 +1074,7 @@ type tg_Polypie = class(tg_graph) //
|
||||||
r[i]+=rx;
|
r[i]+=rx;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return r;
|
return r*0.8;
|
||||||
end
|
|
||||||
function get_pie_points(arg1, arg2, prominent, prominentrate, num_radii, num_angles);
|
|
||||||
begin
|
|
||||||
stp_angle := (arg2 - arg1) / num_angles; // 根据角度范围划分的角度步长
|
|
||||||
r := array(); // 初始化结果数组
|
|
||||||
idx := 0;
|
|
||||||
// 遍历不同的半径
|
|
||||||
for radius_idx := 0 to num_radii do
|
|
||||||
begin
|
|
||||||
radius := radius_idx / num_radii; // 计算当前点的半径,范围在[0, 1]
|
|
||||||
|
|
||||||
// 遍历角度范围内的点
|
|
||||||
for angle := arg1 + (prominent ? stp_angle : 0) to arg2 - (prominent ? stp_angle : 0) step stp_angle do
|
|
||||||
begin
|
|
||||||
r[idx++] := array(sin(angle) * radius, cos(angle) * radius); // 生成点的坐标并存储
|
|
||||||
end
|
|
||||||
end
|
|
||||||
// 如果需要突出显示中间区域
|
|
||||||
if prominent then
|
|
||||||
begin
|
|
||||||
rx := r[integer(idx / 2)] * prominentrate; // 突出显示中间的点
|
|
||||||
for i := 0 to idx - 1 do
|
|
||||||
begin
|
|
||||||
r[i] += rx; // 偏移点位置,使其更突出
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return r; // 返回包围区域内的所有点
|
|
||||||
end
|
end
|
||||||
function get_rose_lines(arg1,arg2,prominent,prominentrate,proportion); //???????????????
|
function get_rose_lines(arg1,arg2,prominent,prominentrate,proportion); //???????????????
|
||||||
begin
|
begin
|
||||||
|
|
@ -1069,9 +1083,9 @@ type tg_Polypie = class(tg_graph) //
|
||||||
r := array();
|
r := array();
|
||||||
r[0] := array(0,0);
|
r[0] := array(0,0);
|
||||||
idx := 1;
|
idx := 1;
|
||||||
for i:= arg1+(prominent?stp:0) to arg2-(prominent?stp:0) step stp do
|
for i:= arg1 to arg2 step stp do
|
||||||
begin
|
begin
|
||||||
r[idx++] := array(sin(i)*proportion,cos(i)*proportion);
|
r[idx++] := array(sin(i),cos(i));
|
||||||
end
|
end
|
||||||
r[idx] :=array(0,0);
|
r[idx] :=array(0,0);
|
||||||
if prominent then
|
if prominent then
|
||||||
|
|
@ -1082,7 +1096,7 @@ type tg_Polypie = class(tg_graph) //
|
||||||
r[i]+=rx;
|
r[i]+=rx;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return r;
|
return r*proportion;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
type tg_Polyradar = class(tg_graph) //雷达图
|
type tg_Polyradar = class(tg_graph) //雷达图
|
||||||
|
|
@ -1091,7 +1105,7 @@ type tg_Polyradar = class(tg_graph) //
|
||||||
findicator_texts := array();
|
findicator_texts := array();
|
||||||
inherited;
|
inherited;
|
||||||
clip_state := tgc_on;
|
clip_state := tgc_on;
|
||||||
fcolormap := array(0xc67054, 0x75cc91, 0x58c8fa, 0x6666ee, 0xdec073, 0x72a23b, 0x5284fc, 0xb4609a, 0xcc7cea);
|
fcolormap := get_default_color_list();
|
||||||
line_mode := tgc_on;
|
line_mode := tgc_on;
|
||||||
mark_mode := tgc_off;
|
mark_mode := tgc_off;
|
||||||
fdata_bounds := array((0,1),(0,1),(0,1));
|
fdata_bounds := array((0,1),(0,1),(0,1));
|
||||||
|
|
@ -1161,7 +1175,7 @@ type tg_Polyradar = class(tg_graph) //
|
||||||
function get_legend_size(w,h);override; //图例大小
|
function get_legend_size(w,h);override; //图例大小
|
||||||
begin
|
begin
|
||||||
sz := fontinfo.size;
|
sz := fontinfo.size;
|
||||||
h := (sz+6)*max(1,length(fgraph_data))+5;
|
h := (sz*2+6)*max(1,length(fgraph_data))+5;
|
||||||
w := 0;
|
w := 0;
|
||||||
ws := 5;
|
ws := 5;
|
||||||
for i,v in fgraph_data do
|
for i,v in fgraph_data do
|
||||||
|
|
@ -1176,7 +1190,7 @@ type tg_Polyradar = class(tg_graph) //
|
||||||
begin
|
begin
|
||||||
set_lineinfo_to_canvas(cvs);
|
set_lineinfo_to_canvas(cvs);
|
||||||
set_fontinfo_to_canvas(cvs);
|
set_fontinfo_to_canvas(cvs);
|
||||||
h := fontinfo.size+6;// + ((h-fontinfo.size)/2);
|
h := fontinfo.size*2+6;// + ((h-fontinfo.size)/2);
|
||||||
y0 := rec[1]+h;
|
y0 := rec[1]+h;
|
||||||
for i,v in fgraph_data do
|
for i,v in fgraph_data do
|
||||||
begin
|
begin
|
||||||
|
|
@ -1537,20 +1551,32 @@ type tg_Polytree = class(tg_graph) //
|
||||||
set_lineinfo_to_canvas(cvs);
|
set_lineinfo_to_canvas(cvs);
|
||||||
ys := array();
|
ys := array();
|
||||||
//_data := array((Tree.X,Tree.Y),(Tree.X,(Tree.Y + Tree.GetNodeByIndex(j).Y) / 2),(Tree.GetNodeByIndex(j).X,(Tree.Y + Tree.GetNodeByIndex(j).Y) / 2),(Tree.GetNodeByIndex(j).X,Tree.GetNodeByIndex(j).Y));
|
//_data := array((Tree.X,Tree.Y),(Tree.X,(Tree.Y + Tree.GetNodeByIndex(j).Y) / 2),(Tree.GetNodeByIndex(j).X,(Tree.Y + Tree.GetNodeByIndex(j).Y) / 2),(Tree.GetNodeByIndex(j).X,Tree.GetNodeByIndex(j).Y));
|
||||||
|
TreeY := Tree.Y;
|
||||||
|
TreeX := Tree.X;
|
||||||
|
tndj := Tree.GetNodeByIndex(j);
|
||||||
|
Treejy := tndj.Y;
|
||||||
|
Treejx := tndj.x;
|
||||||
|
try2 := (TreeY + Treejy) / 2;
|
||||||
_data := array(
|
_data := array(
|
||||||
|
(TreeY, TreeX),
|
||||||
|
(try2, TreeX),
|
||||||
|
(try2, Treejx),
|
||||||
|
(Treejy, Treejx)
|
||||||
|
);
|
||||||
|
{_data := array(
|
||||||
(Tree.Y, Tree.X),
|
(Tree.Y, Tree.X),
|
||||||
((Tree.Y + Tree.GetNodeByIndex(j).Y) / 2, Tree.X),
|
((Tree.Y + Tree.GetNodeByIndex(j).Y) / 2, Tree.X),
|
||||||
((Tree.Y + Tree.GetNodeByIndex(j).Y) / 2, Tree.GetNodeByIndex(j).X),
|
((Tree.Y + Tree.GetNodeByIndex(j).Y) / 2, Tree.GetNodeByIndex(j).X),
|
||||||
(Tree.GetNodeByIndex(j).Y, Tree.GetNodeByIndex(j).X)
|
(Tree.GetNodeByIndex(j).Y, Tree.GetNodeByIndex(j).X)
|
||||||
);
|
);}
|
||||||
|
|
||||||
for i,v in _data do
|
for i,v in _data do
|
||||||
begin
|
begin
|
||||||
if not zoom_to_xyz(v[0],v[1],bx[2,0],x,y) then return ;
|
if not zoom_to_xyz(v[0],v[1],bx[2,0],x,y) then return ;
|
||||||
xys[i] := array(integer(x),integer(y));
|
xys[i] := array(integer(x),integer(y));
|
||||||
|
|
||||||
end
|
end
|
||||||
fline_points_in_canvas := xys;
|
fline_points_in_canvas := xys;
|
||||||
|
set_lineinfo_to_canvas(cvs);
|
||||||
paint_tree(cvs,xys,array("line_mode":line_mode,"bar_width":0,"color":lineinfo.color,"bkcolor":lineinfo.bkcolor,"xy0":ys));
|
paint_tree(cvs,xys,array("line_mode":line_mode,"bar_width":0,"color":lineinfo.color,"bkcolor":lineinfo.bkcolor,"xy0":ys));
|
||||||
mk := markinfo.clone();
|
mk := markinfo.clone();
|
||||||
if mark_mode=tgc_on and mk.size>2 then
|
if mark_mode=tgc_on and mk.size>2 then
|
||||||
|
|
@ -1582,8 +1608,8 @@ type tg_Polytree = class(tg_graph) //
|
||||||
handle_tree(Buchheim_tree);
|
handle_tree(Buchheim_tree);
|
||||||
fstructure_tree := Buchheim_tree;
|
fstructure_tree := Buchheim_tree;
|
||||||
find_data_bounds(fstructure_tree);
|
find_data_bounds(fstructure_tree);
|
||||||
fdata_bounds[0,1] := fdata_bounds[0,1] +fnode_space_x;
|
//fdata_bounds[0,1] := fdata_bounds[0,1] +fnode_space_x;
|
||||||
fdata_bounds[1,1] := fdata_bounds[1,1] +fnode_space_x;
|
//fdata_bounds[1,1] := fdata_bounds[1,1] +fnode_space_x;
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -1622,7 +1648,7 @@ type tg_Polytree = class(tg_graph) //
|
||||||
end else
|
end else
|
||||||
begin
|
begin
|
||||||
gtx := new tg_text();
|
gtx := new tg_text();
|
||||||
gtx.clip_state := tgc_on;
|
gtx.clip_state := tgc_off;
|
||||||
gtx.parent := self;
|
gtx.parent := self;
|
||||||
gtx.text := array(n);
|
gtx.text := array(n);
|
||||||
gtx.data := array(Tree.Y, Tree.X);
|
gtx.data := array(Tree.Y, Tree.X);
|
||||||
|
|
@ -1641,11 +1667,12 @@ type tg_Polytree = class(tg_graph) //
|
||||||
begin
|
begin
|
||||||
for j := 0 to Tree.NodeCount-1 do
|
for j := 0 to Tree.NodeCount-1 do
|
||||||
begin
|
begin
|
||||||
fdata_bounds[0,0] := 0;
|
ndj := Tree.GetNodeByIndex(j);
|
||||||
fdata_bounds[1,0] := 0;
|
//fdata_bounds[0,0] := 0;
|
||||||
fdata_bounds[0,1] := Max(fdata_bounds[0,1],Tree.GetNodeByIndex(j).Y);
|
//fdata_bounds[1,0] := 0;
|
||||||
fdata_bounds[1,1] := Max(fdata_bounds[1,1],Tree.GetNodeByIndex(j).X);
|
fdata_bounds[0,1] := Max(fdata_bounds[0,1],ndj.Y);
|
||||||
find_data_bounds(Tree.GetNodeByIndex(j));
|
fdata_bounds[1,1] := Max(fdata_bounds[1,1],ndj.X);
|
||||||
|
find_data_bounds(ndj);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -1657,7 +1684,7 @@ type tg_Polysunburst = class(tg_graph) //
|
||||||
inherited;
|
inherited;
|
||||||
ftext_container := array();
|
ftext_container := array();
|
||||||
clip_state := tgc_on;
|
clip_state := tgc_on;
|
||||||
fcolormap := array(0xc67054, 0x75cc91, 0x58c8fa, 0x6666ee, 0xdec073, 0x72a23b, 0x5284fc, 0xb4609a, 0xcc7cea);
|
fcolormap := get_default_color_list();
|
||||||
line_mode := tgc_on;
|
line_mode := tgc_on;
|
||||||
mark_mode := tgc_off;
|
mark_mode := tgc_off;
|
||||||
fbar_width := 0;
|
fbar_width := 0;
|
||||||
|
|
@ -1692,8 +1719,6 @@ type tg_Polysunburst = class(tg_graph) //
|
||||||
inliers := array(());
|
inliers := array(());
|
||||||
set_lineinfo_to_canvas(cvs);
|
set_lineinfo_to_canvas(cvs);
|
||||||
ys := array();
|
ys := array();
|
||||||
axes.axises(0).tics_coord := x_coord;
|
|
||||||
axes.axises(0).tics_labels := x_label;
|
|
||||||
CalculateCoordinates(1.0, 10.0, 0.4, 0.7, 0, 360, fgraph_data, cvs, bx);
|
CalculateCoordinates(1.0, 10.0, 0.4, 0.7, 0, 360, fgraph_data, cvs, bx);
|
||||||
inherited;
|
inherited;
|
||||||
end
|
end
|
||||||
|
|
@ -1710,13 +1735,14 @@ type tg_Polysunburst = class(tg_graph) //
|
||||||
angle := startAngle;
|
angle := startAngle;
|
||||||
_r3 := r1 + (r2 - r1);
|
_r3 := r1 + (r2 - r1);
|
||||||
_r4 := r2 + (r2 - r1);
|
_r4 := r2 + (r2 - r1);
|
||||||
if ifarray(node['children']) then
|
ndc := node['children'];
|
||||||
|
if ndc and ifarray(ndc) then
|
||||||
begin
|
begin
|
||||||
for i := 0 to length(node['children'])-1 do
|
for i := 0 to length(ndc)-1 do
|
||||||
begin
|
begin
|
||||||
childStartAngle := angle;
|
childStartAngle := angle;
|
||||||
xys := array();
|
xys := array();
|
||||||
_portion := CalculateTotalValue(node['children'][i]) / totalValue;
|
_portion := CalculateTotalValue(ndc[i]) / totalValue;
|
||||||
childEndAngle := angle +_portion * 2 * pi() * x1;
|
childEndAngle := angle +_portion * 2 * pi() * x1;
|
||||||
pie_data := fcenter+get_pie_ring_lines(childStartAngle,childEndAngle,r2,r1,0,0);
|
pie_data := fcenter+get_pie_ring_lines(childStartAngle,childEndAngle,r2,r1,0,0);
|
||||||
for j,v in pie_data do
|
for j,v in pie_data do
|
||||||
|
|
@ -1726,44 +1752,42 @@ type tg_Polysunburst = class(tg_graph) //
|
||||||
zoom_to_xyz(v[0],0,0,x,y) ;
|
zoom_to_xyz(v[0],0,0,x,y) ;
|
||||||
end
|
end
|
||||||
fline_points_in_canvas := xys;
|
fline_points_in_canvas := xys;
|
||||||
its := node['children'][i]['itemstyle']['color'];
|
its := ndc[i]['itemstyle']['color'];
|
||||||
item_color := ifnumber(its)?its: fcolormap[1];
|
item_color := ifnumber(its)?its: fcolormap[1];
|
||||||
paint_sunburst(cvs,xys,array("line_mode":line_mode,"bar_width":0,"color":0xffffff,"bkcolor":item_color,"xy0":ys));
|
paint_sunburst(cvs,xys,array("line_mode":line_mode,"bar_width":0,"color":0xffffff,"bkcolor":item_color,"xy0":ys));
|
||||||
CalculateCoordinates(_portion * x1, y1, _r3, _r4, childStartAngle, childEndAngle, node['children'][i], cvs, bx);
|
CalculateCoordinates(_portion * x1, y1, _r3, _r4, childStartAngle, childEndAngle, ndc[i], cvs, bx);
|
||||||
angle := childEndAngle;
|
angle := childEndAngle;
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
function CalculateTotalValue(node); //设置数据
|
function CalculateTotalValue(node); //设置数据
|
||||||
begin
|
begin
|
||||||
if node = nil then
|
if node = nil then return 0;
|
||||||
return 0;
|
|
||||||
pv := 0;
|
pv := 0;
|
||||||
if node['value'] <> nil then pv := node['value'];
|
if node['value'] <> nil then pv := node['value'];
|
||||||
//return node['value'];
|
//return node['value'];
|
||||||
|
|
||||||
totalValue := 0;
|
totalValue := 0;
|
||||||
if node['children'] <> nil then
|
ndc := node['children'];
|
||||||
|
if ifarray(ndc) and ndc then
|
||||||
begin
|
begin
|
||||||
for i := 0 to length(node['children'])-1 do
|
for i := 0 to length(ndc)-1 do
|
||||||
begin
|
begin
|
||||||
totalValue := totalValue + CalculateTotalValue(node['children'][i]);
|
totalValue := totalValue + CalculateTotalValue(ndc[i]);
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
return max(pv,totalValue);
|
return max(pv,totalValue);
|
||||||
node['value'] := totalValue;
|
|
||||||
return node['value'];
|
|
||||||
end;
|
end;
|
||||||
function getTreeDepth(node); //获取深度
|
function getTreeDepth(node); //获取深度
|
||||||
begin
|
begin
|
||||||
if node['children'] = nil then
|
ndc := node['children'];
|
||||||
|
if not(ifarray(ndc) and ndc) then
|
||||||
begin
|
begin
|
||||||
return 0;
|
return 0;
|
||||||
end
|
end
|
||||||
_deep := 0;
|
_deep := 0;
|
||||||
for i := 0 to length(node['children'])-1 do
|
for i := 0 to length(ndc)-1 do
|
||||||
begin
|
begin
|
||||||
_deep := Max(_deep, getTreeDepth(node['children'][i]));
|
_deep := Max(_deep, getTreeDepth(ndc[i]));
|
||||||
end
|
end
|
||||||
return _deep + 1;
|
return _deep + 1;
|
||||||
end
|
end
|
||||||
|
|
@ -1842,27 +1866,36 @@ type tg_Polysunburst = class(tg_graph) //
|
||||||
angle := startAngle;
|
angle := startAngle;
|
||||||
_r3 := r1 + (r2 - r1);
|
_r3 := r1 + (r2 - r1);
|
||||||
_r4 := r2 + (r2 - r1);
|
_r4 := r2 + (r2 - r1);
|
||||||
|
textct := length(ftext_container)>0;
|
||||||
if ifarray(node) and node["name"] and ifstring(node["name"]) then
|
if ifarray(node) and node["name"] and ifstring(node["name"]) then
|
||||||
begin
|
begin
|
||||||
text_data := fcenter+get_pie_ring_center(startAngle,endAngle,r1,r2,0,0);
|
|
||||||
gtx := new tg_text();
|
gtx := new tg_text();
|
||||||
gtx.clip_state := tgc_on;
|
gtx.clip_state := tgc_on;
|
||||||
gtx.line_mode := 0;
|
gtx.line_mode := 0;
|
||||||
if length(ftext_container)>0 then
|
if textct then
|
||||||
|
begin
|
||||||
gtx.font_angle := ((startAngle + endAngle) / 2) - pi()/2;
|
gtx.font_angle := ((startAngle + endAngle) / 2) - pi()/2;
|
||||||
|
text_data := fcenter+get_pie_ring_center(startAngle,endAngle,r1,r2,0,0);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
gtx.textalign := 5;
|
||||||
|
text_data := fcenter+get_pie_ring_center(startAngle,endAngle,r1/2,r2,0,0);
|
||||||
|
end
|
||||||
|
gtx.data := text_data;
|
||||||
gtx.parent := self;
|
gtx.parent := self;
|
||||||
gtx.text := array(node['name']);
|
gtx.text := array(node['name']);
|
||||||
gtx.data := text_data;
|
|
||||||
ftext_container[length(ftext_container)] := gtx;
|
ftext_container[length(ftext_container)] := gtx;
|
||||||
end
|
end
|
||||||
if ifarray(node['children']) then
|
ndc := node['children'];
|
||||||
|
if ifarray(ndc) and ndc then
|
||||||
begin
|
begin
|
||||||
for i := 0 to length(node['children'])-1 do
|
for i := 0 to length(ndc)-1 do
|
||||||
begin
|
begin
|
||||||
childStartAngle := angle;
|
childStartAngle := angle;
|
||||||
_portion := CalculateTotalValue(node['children'][i]) / totalValue;
|
_portion := CalculateTotalValue(ndc[i]) / totalValue;
|
||||||
childEndAngle := angle +_portion * 2 * pi() * x1;
|
childEndAngle := angle +_portion * 2 * pi() * x1;
|
||||||
CalculateTextCoordinates(_portion * x1, y1, _r3, _r4, childStartAngle, childEndAngle, node['children'][i]);
|
CalculateTextCoordinates(_portion * x1, y1, _r3, _r4, childStartAngle, childEndAngle, ndc[i]);
|
||||||
angle := childEndAngle;
|
angle := childEndAngle;
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
|
|
@ -1889,13 +1922,17 @@ type tg_tree_node = class(TNode)
|
||||||
begin
|
begin
|
||||||
class(TNode).create();
|
class(TNode).create();
|
||||||
fName := tree['name'];
|
fName := tree['name'];
|
||||||
for i,v in tree['children'] do
|
ndc := tree['children'];
|
||||||
|
if ifarray(ndc) and ndc then
|
||||||
|
begin
|
||||||
|
for i,v in ndc do
|
||||||
begin
|
begin
|
||||||
it := new tg_tree_node(v,self,depth+1, i+1) ;
|
it := new tg_tree_node(v,self,depth+1, i+1) ;
|
||||||
it.parent := self;
|
it.parent := self;
|
||||||
AppendNode(it);
|
AppendNode(it);
|
||||||
//self(true).fChildren := it;
|
//self(true).fChildren := it;
|
||||||
end
|
end
|
||||||
|
end
|
||||||
X := -1;
|
X := -1;
|
||||||
Y := Depth;
|
Y := Depth;
|
||||||
Thread := nil;
|
Thread := nil;
|
||||||
|
|
@ -2012,14 +2049,14 @@ begin
|
||||||
upper_wick_start := fdata[i][2]>= fdata[i][1]?ifo["xy0",i]:v;
|
upper_wick_start := fdata[i][2]>= fdata[i][1]?ifo["xy0",i]:v;
|
||||||
lower_wick_start := fdata[i][2]>= fdata[i][1]?v:ifo["xy0",i];
|
lower_wick_start := fdata[i][2]>= fdata[i][1]?v:ifo["xy0",i];
|
||||||
cvs.brush.color := fdata[i][2]>= fdata[i][1]?ifo["bullcolor"]:ifo["bearcolor"];
|
cvs.brush.color := fdata[i][2]>= fdata[i][1]?ifo["bullcolor"]:ifo["bearcolor"];
|
||||||
cvs.pen.color := cvs.brush.color; // ???????????
|
cvs.pen.color := cvs.brush.color;
|
||||||
v1234 := array(v1,v2,v3,v4);
|
v1234 := array(v1,v2,v3,v4);
|
||||||
barrgn[i] := v1234;
|
barrgn[i] := v1234;
|
||||||
cvs.draw_polygon().points(v1234).draw();
|
cvs.draw_polygon().points(v1234).draw();
|
||||||
cvs.moveto(upper_wick_start);
|
cvs.moveto(upper_wick_start);
|
||||||
cvs.lineto(ifo["wick_y",i,0]); // ?????10???????????????????????????wick_y
|
cvs.lineto(ifo["wick_y",i,0]); //
|
||||||
cvs.moveto(lower_wick_start);
|
cvs.moveto(lower_wick_start);
|
||||||
cvs.lineto(ifo["wick_y",i,1]); // ?????10???????????????????????????
|
cvs.lineto(ifo["wick_y",i,1]); //
|
||||||
end else
|
end else
|
||||||
begin
|
begin
|
||||||
cvs.moveto(array(ifo["xy0",i,0],ifo["xy0",i,1]));
|
cvs.moveto(array(ifo["xy0",i,0],ifo["xy0",i,1]));
|
||||||
|
|
@ -2028,7 +2065,7 @@ begin
|
||||||
end
|
end
|
||||||
ifo["barrgn"] := barrgn;
|
ifo["barrgn"] := barrgn;
|
||||||
end
|
end
|
||||||
function paint_boxplot(cvs,pls,xys,cls,ifo); //??????
|
function paint_boxplot(cvs,pls,xys,cls,ifo); //
|
||||||
begin
|
begin
|
||||||
o := static new tg_const();
|
o := static new tg_const();
|
||||||
b_w_x := integer(ifo["bar_width"][0]/2);
|
b_w_x := integer(ifo["bar_width"][0]/2);
|
||||||
|
|
@ -2088,28 +2125,35 @@ end
|
||||||
function paint_sunburst(cvs,xys,ifo);//画饼
|
function paint_sunburst(cvs,xys,ifo);//画饼
|
||||||
begin
|
begin
|
||||||
return paint_pie(cvs,xys,ifo);
|
return paint_pie(cvs,xys,ifo);
|
||||||
cvs.brush.color := ifo["bkcolor"];
|
|
||||||
//cvs.brush.color := 0x0000ff;
|
|
||||||
cvs.brush.style := tgc_BS_SOLID;
|
|
||||||
cvs.pen.style := 0;
|
|
||||||
cvs.pen.color := ifo["color"];
|
|
||||||
cvs.draw_polygon().points(xys).draw();
|
|
||||||
end
|
end
|
||||||
function paint_tree(cvs,xys,ifo); //画树
|
function paint_tree(cvs,xys,ifo); //画树
|
||||||
begin
|
begin
|
||||||
cvs.brush.color := ifo["bkcolor"];
|
//cvs.brush.color := ifo["bkcolor"];
|
||||||
cvs.pen.style := 0;
|
//cvs.pen.style := 0;
|
||||||
//cvs.pen.color := ifo["color"];
|
//cvs.pen.color := ifo["color"];
|
||||||
//cvs.pen.color := 0x0000ff;
|
//cvs.pen.color := 0x0000ff;
|
||||||
tree := cvs.draw_bezier();
|
tree := cvs.draw_bezier();
|
||||||
tree.startpoint(xys[0]);
|
//tree.startpoint(xys[0]);
|
||||||
tree.addpoints(array(xys[1]));
|
tree.addpoints(xys);
|
||||||
tree.addpoints(array(xys[2]));
|
//tree.addpoints(array(xys[1]));
|
||||||
tree.addpoints(array(xys[3]));
|
//tree.addpoints(array(xys[2]));
|
||||||
|
//tree.addpoints(array(xys[3]));
|
||||||
tree.draw();
|
tree.draw();
|
||||||
end
|
end
|
||||||
|
function mult_str(s,n);
|
||||||
|
begin
|
||||||
|
r := s;
|
||||||
|
for i := 2 to n do //exp
|
||||||
|
begin
|
||||||
|
r+=s;
|
||||||
|
end
|
||||||
|
return r;
|
||||||
|
end
|
||||||
|
function get_default_color_list(); //获取默认的颜色列表
|
||||||
|
begin
|
||||||
|
//return array(0xc67054, 0x75cc91, 0x58c8fa, 0x6666ee, 0xdec073, 0x72a23b, 0x5284fc, 0xb4609a, 0xcc7cea);
|
||||||
|
return array(0x00CED1,0xFA8072,0x00BFFF,0xFFFFE0,0xF0FFFF,0xFDF5E6,0xFAF0E6,0xFF8C00,0xC0C0C0,0x008B8B,0xE6E6FA,0xF5DEB3,0xE9967A,0xFF00FF,0x9400D3,0x00FF00,0xDC143C,0xFF4500,0xD8BFD8,0x6B8E23,0x1E90FF,0x708090,0x00FA9A,0xFAEBD7,0xADD8E6,0x8B4513,0xFFFAFA,0x8A2BE2,0x4169E1,0x000080,0xF0FFF0,0x191970,0xF4A460,0xFFDEAD,0x0000CD,0xF5FFFA,0x8B0000,0xFF7F50,0xBA55D3,0x7CFC00,0xFFE4C4,0xDCDCDC,0x87CEEB,0x696969,0x808080,0xFF1493,0x48D1CC,0xFFF0F5,0x00008B,0xDDA0DD,0xFFA07A,0x4682B4,0xFFDAB9,0x6495ED,0xFFC0CB,0x008000,0xADFF2F,0xBDB76B,0x66CDAA,0xEE82EE,0xFFFF00,0x556B2F,0xFFB6C1,0x20B2AA,0xDB7093,0xFFFAF0,0xB22222,0x6A5ACD,0xFF6347,0x778899,0xFAFAD2,0x800080,0x00FFFF,0x006400,0x8FBC8F,0xFFFFFF,0x40E0D0,0xFFD700,0x00FF7F,0xF8F8FF,0xA0522D,0x87CEFA,0xDEB887,0x000000,0x0000FF,0xD2691E,0xFF00FF,0xF5F5F5,0xFFF5EE,0x98FB98,0xFFF8DC,0xF0F8FF,0x800000,0xBC8F8F,0x8B008B,0xD3D3D3,0x9ACD32,0xA9A9A9,0xFF69B4,0xAFEEEE,0xB8860B,0xD2B48C,0xF5F5DC,0x5F9EA0,0x228B22,0x2F4F4F,0xA52A2A,0x7FFFD4,0x90EE90,0x7B68EE,0xB0C4DE,0xF08080,0x32CD32,0x483D8B,0x9370DB,0xCD5C5C,0xDA70D6,0x808000,0x008080,0xFFE4B5,0xC71585,0x9932CC,0xFFEBCD,0xE0FFFF,0x00FFFF,0x4B0082,0xEEE8AA,0xFFE4E1,0xFFEFD5,0xDAA520,0x2E8B57,0xF0E68C,0x7FFF00,0xB0E0E6,0xFFFFF0,0xFFA500,0xFF0000,0xCD853F,0x3CB371,0xFFFACD);
|
||||||
|
end
|
||||||
initialization
|
initialization
|
||||||
finalization
|
finalization
|
||||||
end.
|
end.
|
||||||
|
|
|
||||||
|
|
@ -523,6 +523,9 @@ type twindowsapi = class()
|
||||||
If the function succeeds, the return value is the handle to a memory DC.
|
If the function succeeds, the return value is the handle to a memory DC.
|
||||||
If the function fails, the return value is NULL.
|
If the function fails, the return value is NULL.
|
||||||
}
|
}
|
||||||
|
function CreateEnhMetaFileA(hdc:pointer;fn:string;lprc:array of integer;lpdesc:pointer):pointer;stdcall;external "Gdi32.dll" name "CreateEnhMetaFileA";
|
||||||
|
function CloseEnhMetaFile(hdc:pointer):pointer;stdcall;external "Gdi32.dll" name "CloseEnhMetaFile";
|
||||||
|
function DeleteEnhMetaFile(hdc:pointer):integer;stdcall;external "Gdi32.dll" name "DeleteEnhMetaFile";
|
||||||
function CreateCompatibleDC(hdc :pointer):pointer;stdcall;external "Gdi32.dll" name "CreateCompatibleDC";
|
function CreateCompatibleDC(hdc :pointer):pointer;stdcall;external "Gdi32.dll" name "CreateCompatibleDC";
|
||||||
{
|
{
|
||||||
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(WINGDI%2FGetTextColor);k(GetTextColor);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
|
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(WINGDI%2FGetTextColor);k(GetTextColor);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
|
||||||
|
|
|
||||||
BIN
tsleditor.exe
BIN
tsleditor.exe
Binary file not shown.
BIN
tslvcltool.exe
BIN
tslvcltool.exe
Binary file not shown.
Loading…
Reference in New Issue