tslediter/designer/ctl_mgr/t_function_finder.tsf

127 lines
3.1 KiB
Plaintext

type t_function_finder=class(tdcreateform)
uses tslvcl;
findpal:tpanel;
edfind:tedit;
btfind:tbtn;
listfunc:tlistview;
popupmenu1:tpopupmenu;
mufind:tmenu;
sbfind:tstatusbar;
ck_prev:tcheckbtn;
function Create(AOwner);override; //构造
begin
fformatdata := array();
inherited;
ActiveControl := edfind;
p := AOwner;
parent := p;
d := p.GetFreeSynObjectByName("tsl");
if d then ffcomp := d[1];
end
function listfunc_ondblclick(o;e);
begin
openthefile();
end
function functionfinder_close(o;e);
begin
e.skip := true;
o.Visible := false;
end
function mufind_clk(o;e); //打开文件夹
begin
openthefile();
//echo dak
end
function openthefile();
begin
d := listfunc.SelectedValue;
if not d then return ;
f := ffcomp.GetFileFullPath(d[1]);
Owner.OpenAndGotoFileByName(f,d[3]);
end
function show_finder();
begin
if Visible then return ;
if ffcomp then setdata(ffcomp.getjumpinfo());
show();
end
function btfind_clk(o;e);
begin
dofind();
end
function edfind_keydown(o;e);
begin
if e.charcode=13 then
begin
dofind();
end
end
function dofind();
begin
s := lowercase(trim(edfind.text));
if not s then return setlists(fformatdata);
r := array();
cp := ck_prev.Checked;
for i,v in fformatdata do
begin
if cp then
begin
if 1=pos(s,v[2]) then r[idx++]:= v;
end else
begin
if pos(s,v[2]) then r[idx++]:= v;
end
end
setlists(r);
end
function setdata(d);
begin
if ifarray(d) and (ffuncdata<>d) then //设置数据
begin
ffuncdata := d;
formatdata(d);
setlists(fformatdata);
end
end
function setlists(d);
begin
if fcurrentdata=d then return ;
listfunc.DeleteAllItems();
listfunc.AppendItems(d);
fcurrentdata := d;
listfunc.SelectedId := 0;
sbfind.SetItemText(("总共:"$length(d)$" 处"),0);
end
function Recycling();override; //回收变量
begin
inherited;
ci := self.classinfo(); //将成员变量赋值为nil避免循环引用
for i,v in ci["members"] do
begin
if v["const"] then continue;
if v["static"] then continue;
invoke(self,v["name"],nil);
end
end
private
function formatdata(d);
begin
fformatdata := array();
idx := 0;
for i,v in d do
begin
if not ifarray(d) then continue;
if not v["file"] then continue;
fformatdata[idx,0] := v["caption"];
fformatdata[idx,1] := v["file"];
fformatdata[idx,2] := v["lvalue"];
fformatdata[idx,3] := v["line"];
idx++;
end
end
[weakref]ffcomp;
fformatdata;
ffuncdata;
fcurrentdata;
end