我的一个小程式,是这样的: 将某一目录底下所有的 *.txt 动态地建立於 某个menuitem下。
例如: c:/test 下有三个.txt , 分别是 aa.txt , bb.txt , cc.txt 。 当使用者点下 " 档案 " 的功能选单时,会出现
___________________________
档案(F)
---------------------------
| aa |
| bb |
| cc |
----------
如果又多一个档案 dd.txt ,则功能选单就多显示dd 。
你问的问题...牵涉到的观念与技术蛮广的, 包括: 动态产生物件与其事件处理事件的指定, 另外就是找出指定目录中的所有档案. 您应该都可以在我的学习笔记(http://www.geocities.com/~wchien)找到相关的说明.
以下是针对这次你问题所提出的例子:
1. Form 的设计
object mnuMain: TMainMenu
Left = 4
Top = 4
object mnuFile: TMenuItem
Caption = '档案'
ShortCut = 0
end
end
object Button1: TButton
Left = 176
Top = 56
Width = 75
Height = 25
Caption = 'Refresh menu'
TabOrder = 0
OnClick = Button1Click
end
2. 程式部分
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls;
type
TForm1 = class(TForm)
mnuMain: TMainMenu;
mnuFile: TMenuItem;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FDir: string;
procedure MenuClick(Sender: TObject);
procedure UpdateFileMenu;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FDir := 'C:/TEMP/';
UpdateFileMenu;
end;
procedure TForm1.MenuClick(Sender: TObject);
begin
if Sender is TMenuItem then
WinExec(pchar('Notepad.exe ' + FDir + TMenuItem(Sender).Caption),
sw_Normal);
end;
procedure TForm1.UpdateFileMenu;
var
i: integer;
SearchRec: TSearchRec;
iFindResult: integer;
mnuNew: TMenuItem;
begin
// 先将 File 下的 MenuItem 砍光
for i := mnuFile.Count - 1 downto 0 do
mnuFile.Items[i].Free;
// 逐一搜寻指定目录的 .TXT 档案
iFindResult := FindFirst(FDir + '*.TXT', faAnyFile, SearchRec);
while iFindResult = 0 do
begin
// 动态产生一个 TMenuItem
mnuNew := TMenuItem.Create(Self);
with mnuNew do
begin
Caption := SearchRec.Name; // 以档案作为 Menu 的 Caption
OnClick := MenuClick; // 在这 指定 OnClick 事件
end;
mnuFile.Add(mnuNew); // 加到[档案]这个选单项目下
iFindResult := FindNext(SearchRec); // 继续找下一个 .TXT 档
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
UpdateFileMenu;
end;
end.