Ну вот можно сделать по аналогии | Код | type tfunc=function(AOwner: TComponent;txt:string):tcontrol; tcall=record cond:string; func:tfunc; end;
var mcall:array of tcall;
function _label(AOwner: TComponent;txt:string):tcontrol; begin result:=tlabel.Create(AOwner); (result as tlabel).Caption:=txt; end; function _button(AOwner: TComponent;txt:string):tcontrol; begin result:=tbutton.Create(AOwner); (result as tbutton).Caption:=txt; end; function _edit(AOwner: TComponent;txt:string):tcontrol; begin result:=tedit.Create(AOwner); (result as tedit).Text:=txt; end; function _panel(AOwner: TComponent;txt:string):tcontrol; begin result:=tpanel.Create(AOwner); (result as tpanel).Caption:=txt; end; function _else(AOwner: TComponent;txt:string):tcontrol; begin result:=nil; end;
function call(v:string;AOwner: TComponent;txt:string):tcontrol; var min,max,center,oldcenter,cr:integer; begin min:=0; max:=length(mcall); oldcenter:=0; while true do begin center:=min +((max-min) shr 1); if center=oldcenter then begin result:=_else(AOwner,txt); break; end; oldcenter:=center; cr:=strcomp(pchar(mcall[center].cond),pchar(v)); if cr=0 then begin result:=mcall[center].func(AOwner,txt); break; end else if cr<0 then min:=center else max:=center; end; end;
procedure TForm1.FormCreate(Sender: TObject); var i,j,min:integer; tmp:tcall; begin setlength(mcall,4); mcall[0].cond:='label'; mcall[0].func:=_label; mcall[1].cond:='button'; mcall[1].func:=_button; mcall[2].cond:='edit'; mcall[2].func:=_edit; mcall[3].cond:='panel'; mcall[3].func:=_panel;
for i:=0 to length(mcall)-2 do begin min:=i; for j:=i+1 to length(mcall)-1 do if 0<StrComp(pchar(mcall[min].cond),pchar(mcall[j].cond)) then min:=j; if min<>i then begin tmp:=mcall[min]; mcall[min]:=mcall[i]; mcall[i]:=tmp; end; end;
end;
procedure TForm1.Button1Click(Sender: TObject); var cmp:tcontrol; begin cmp:=call(edit1.Text,form1,'Ïðóâåò'); if cmp<>nil then begin cmp.Visible:=true; form1.InsertControl(cmp); end; end;
|
--------------------
умную мысль держи при себе, а дурной - поделись с другими
|