如何動態建立 Menuitem

2021-04-03 00:29:17 字數 2629 閱讀 9450

我的乙個小程式,是這樣的: 將某一目錄底下所有的 *.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

endend

object button1: tbutton

left = 176

top = 56

width = 75

height = 25

caption = 'refresh menu'

taborder = 0

onclick = button1click

end2. 程式部分

unit unit1;

inte***ce

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

fdir: string;

procedure menuclick(sender: tobject);

procedure updatefilemenu;

public

end;

varform1: tform1;

implementation

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;

vari: 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.

MenuItem建立注意事項

01 前幾天在弄那個setvisible的時候,那個getchildbytag需要型別轉換,否則會報錯!於是不經意間,將menuitem項從menu中提出來,後來沒有報錯,但也隨之出現乙個問題就是menuitem不能響應事件。換句話說,它變成了乙個精靈,所以才可以呼叫setvisible方法。02 ...

如何動態建立控制項

分配乙個控制項物件的例項並呼叫其create成員函式。開發者最容易忽略兩件 事 忘記指定ws visble標籤和在棧中分配控制項物件。下例動態地建立乙個下壓按 鈕控制項 in class declaration h file private cbutton m pbutton in class im...

如何釋放動態建立的TXMLDocument

如何動態建立,使用和釋放txmldocument 不出現訪問違例錯誤 如果您需要使用動態建立txmldocument元件,一旦您試圖釋放物件時您也許會得到訪問違例錯誤 access violations 如果txmldocument被作為元件使用,那麼它的生存期由它的所有者控制 您放置元件的窗體 如...