如何定制工具栏的按钮(100分)

  • 主题发起人 主题发起人 woodstock
  • 开始时间 开始时间
W

woodstock

Unregistered / Unconfirmed
GUEST, unregistred user!
现在很多流行的软件都允许自己定制工具栏的按钮,
但是我不知道如何做好些。
请大虾们谈谈看法和经验。
多谢。
 
你要怎样定制?

用VC很简单。
 
就象Delphi一样,可以把一个按钮拖到工具栏上,可以把一个按钮从工具栏上拉走。
并且在程序里很好地控制。比如记录位置,自动在下次启动时载入等。
 

Delphi里可以把某个单独的按钮拖到工具栏上吗?
如果是想把一组按钮从工具栏上拖来拖去或拖成一个工具窗口倒很容易,用
ControlBar就行了,用CoolBar也很好,单独定制某个按钮肯定要自己编程
实现的吧。记录位置肯定也是要编程的。
 
不客气:
1:自己动手: 用ToolBar 和 TCoolBar
2: 第三方控件: 工具条(ToolBar)控件库
地址:http://www.csdn.net/Delphi/index.htm

 
to xinhe:
Delphi中可以的, 在Delphi的工具栏单击右键,在弹出菜单中选择“customize...”,
就可以拖了。
我特别喜欢这样的功能。
 
1、把常用的button放在toolbar上,提供弹出式菜单,根据选择将设置相应button的visible
2、三方控件dev express中有保存控件属性的控件,请在inprises.com中下载
 
我有办法做到,不过不能做到一个按钮拖访那种形式,我可以做的像Winzip7,要吗,
要的话我就把源程序贴上来。
 
to CaoAizu: 如果代码不多就请贴上来,否则请发到woodstock@staff.soim.com的信箱。
多谢。
 
我是这样做的:
建一个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,内有完整的源程序。
 
to CaoAizu: 您的这种程序的思路我觉得不太好,不符合软件设计的方法,因为这样的极限性
太大了,
我自己有这样的思路,其实可以仿照skin制作的那种思路。
就是记录每个事件的id和自己一些特性(如图标,caption等),所有的按钮都是动态生成的,
所有的按扭都是指向同一个事件,然后才在事件里判断。究竟是点击了哪个按钮。

这个问题先暂时放着,看看哪位大虾还有别的好方法。
 
tb97就可以实现啊。
 
附加功能 将问题提前
 
woodstock:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部