我是这样做的:
建一个ToolBar,两个Listbox,四个Button。
ToolBar上有三个按钮,分别是新建、打开、保存,Listbox1和ToolBar的DragMode设为dmAutomatic。
四个按钮依次是添加,删除,应用,保存。
第一个Listbox是所有的按钮列表,还多一个工具栏,内容为:
文件工具栏、新建、打开、保存。
第二个Listbox是要显示的工具按钮和工具栏。
源程序如下:
procedure TForm1.Button1Click(Sender: TObject);
Var S:string;
begin
S:=Listbox1.Items.Strings[Listbox1.Itemindex];
if Listbox2.Items.IndexOf(S)=-1 then Listbox2.Items.Add(S);
//添加按钮
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Listbox2.Items.Delete(Listbox2.Itemindex);
//删除按钮
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Listbox2.Items.IndexOf('文件工具栏')<>-1 then ToolBar1.Visible:=True
else ToolBar1.Visible:=False;
if Listbox2.Items.IndexOf('新建')<>-1 then Toolbutton1.Visible:=True
else ToolButton1.Visible:=False;
if Listbox2.Items.IndexOf('打开')<>-1 then Toolbutton2.Visible:=True
else ToolButton2.Visible:=False;
if Listbox2.Items.IndexOf('保存')<>-1 then Toolbutton3.Visible:=True
else ToolButton3.Visible:=False;
//刷新工具栏
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Listbox2.Items.SaveToFile(ExtractFileDir(Application.Exename)+'/Button.ini');
//把使用按钮的名字(Listbox2的内容)保存在程序所在的文件夹下的Button.ini
//不要在根目录下运行程序,否则这行会出错!!!
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if FileExists(ExtractFileDir(Application.Exename)+'/Button.ini')=True then begin
//判断Button.ini是否存在
Listbox2.Items.LoadFromFile(ExtractFileDir(Application.Exename)+'/Button.ini');
Button3.Click;
//读入Button.ini并刷新工具栏
end;
end;
procedure TForm1.ToolBar1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Listbox2.Items.IndexOf(Listbox1.Items.Strings[Listbox1.Itemindex])=-1 then begin
listbox2.Items.Add(Listbox1.Items.Strings[Listbox1.Itemindex]);
Button3.Click;
//拖放按钮
end;
end;
end.
//End of source
在Button3的Click事件中看似需要很多语句很麻烦,但用了Copy/Paste就很简单
了。
不知道是否符合woodstock的要求。
不知道各位能看懂吗,我的语言表达能力不太好。
woodstock兄,我给你发了个Email,内有完整的源程序。