全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3895
推到 Plurk!
推到 Facebook!

動態產生多個 TMenuItem

答題得分者是:dan59314
ken_huang
一般會員


發表:3
回覆:2
積分:1
註冊:2003-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-16 09:59:30 IP:210.66.xxx.xxx 未訂閱
請問如何動態產生 TMenuItem TMenuItem *mnuItem[myVar]; myVar 為變數
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-16 10:30:57 IP:211.23.xxx.xxx 未訂閱
需動態配置。    TMenuItem *mnuItem;    mnuItem=new TMenuItem [myVar];
ken_huang
一般會員


發表:3
回覆:2
積分:1
註冊:2003-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-16 10:41:23 IP:210.66.xxx.xxx 未訂閱
引言: 需動態配置。 TMenuItem *mnuItem; mnuItem=new TMenuItem [myVar]; < face="Verdana, Arial, Helvetica"> 這樣寫我試過了 但是compiler出現 Cannot find default constructor to initialize array element of type 'TMenuItem'
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-16 10:54:37 IP:211.23.xxx.xxx 未訂閱
Sorry, 應該宣告為 pointer Array,修正如下 TMenuItem **mnu; mnu=new TMenuItem*[2]; 另外補充,下面是 BCB Help 裡面的應用解說 //************************************ TMenuItem *NewItem = new TMenuItem; // create the separator NewItem->Caption = "-"; Window1->Add(NewItem); // add it to the Window menu // now create and add a menu item for each form for (int I = 0; i < Screen->FormCount; I ) { NewItem = new TMenuItem; NewItem->Caption = Screen->Forms[I]->Name; Window1->Add(NewItem); }
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-16 10:54:57 IP:61.218.xxx.xxx 未訂閱
Ken Huang:    您參考這一篇Delphi的Add a MenuItem to a menu dynamically http://greatis.com/delphi/components-addmenuitem.html 改寫成BCB試試,裡頭有範例可以參考!有問題再討論! 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/04/16 10:59:46
ken_huang
一般會員


發表:3
回覆:2
積分:1
註冊:2003-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-16 12:20:06 IP:210.66.xxx.xxx 未訂閱
引言: Sorry, 應該宣告為 pointer Array,修正如下 TMenuItem **mnu; mnu=new TMenuItem*[2]; 另外補充,下面是 BCB Help 裡面的應用解說 //************************************ TMenuItem *NewItem = new TMenuItem; // create the separator NewItem->Caption = "-"; Window1->Add(NewItem); // add it to the Window menu // now create and add a menu item for each form for (int I = 0; i < Screen->FormCount; I ) { NewItem = new TMenuItem; NewItem->Caption = Screen->Forms[I]->Name; Window1->Add(NewItem); }
感謝大家 我已經找到了 TPrinter *prn; prn = Printer(); int numPrinters = prn->Printers->Count; TStrings *allPnt = prn->Printers; for(int i=0;iInsert(i, NewItem); N3->Items[i]->Caption = allPnt->Strings[i]; }
firewing
一般會員


發表:23
回覆:47
積分:19
註冊:2002-12-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-12-11 14:22:06 IP:220.128.xxx.xxx 訂閱
請問各位大大~如何實現作者所要求的呢( 動態產生多個 TMenuItem )?
我看不懂作者最後的答覆~
謝謝~
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-12-11 15:11:17 IP:210.66.xxx.xxx 訂閱
提供給你參考參考...

[code cpp]
//---------------------------------------------------------------------------
#ifndef fMainH
#define fMainH
//---------------------------------------------------------------------------
#include
#include
#include
#include <Forms.hpp><br />#include
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:
TButton *Button1;
TMainMenu *MainMenu1;
void __fastcall Button1Click(TObject *Sender);
private:
void __fastcall DO_OnMenuItemClick(TObject *Sender);
public:
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
[/code]


[code cpp]
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "fMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Menu = NULL;
try{
MainMenu1->Items->Clear();
TMenuItem *A = new TMenuItem(this);
A->Caption = "Dynamic Created MenuItem";
for(int i=0; i<5; i ){
String S;
TMenuItem *B = new TMenuItem(this);
B->Caption = S.sprintf("Sub-MenuItem%d", i);
B->OnClick = DO_OnMenuItemClick;
A->Add(B);
}
MainMenu1->Items->Add(A);
}
__finally{
Menu = MainMenu1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DO_OnMenuItemClick(TObject *Sender)
{
TMenuItem *mi = (TMenuItem*)Sender;
ShowMessage(mi->Caption);
}
//---------------------------------------------------------------------------

[/code]

===================引 用 firewing 文 章===================
請問各位大大~如何實現作者所要求的呢( 動態產生多個 TMenuItem )?
我看不懂作者最後的答覆~
謝謝~
編輯記錄
jow 重新編輯於 2007-12-11 16:15:22, 註解 無‧
firewing
一般會員


發表:23
回覆:47
積分:19
註冊:2002-12-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-12-11 15:59:21 IP:220.128.xxx.xxx 訂閱
jow 大大謝謝你的回覆~你貼的我有看過~但我有一個問題:
for 迴圈內 TMenuItem *B = new TMenuItem(this);
會不會造成記憶體遺失? 因為 前幾次使用的 B 並無被釋放


===================引 用 jow 文 章===================
提供給你參考參考...

[code cpp]
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "fMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Menu = NULL;
try{
MainMenu1->Items->Clear();
TMenuItem *A = new TMenuItem(this);
A->Caption = "Dynamic Created MenuItem";
for(int i=0; i<5; i ){
String S;
TMenuItem *B = new TMenuItem(this);
B->Caption = S.sprintf("Sub-MenuItem%d", i);
B->OnClick = DO_OnMenuItemClick;
A->Add(B);
}
MainMenu1->Items->Add(A);
}
__finally{
Menu = MainMenu1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DO_OnMenuItemClick(TObject *Sender)
{
TMenuItem *mi = (TMenuItem*)Sender;
ShowMessage(mi->Caption);
}
//---------------------------------------------------------------------------

[/code]

===================引 用 firewing 文 章===================
請問各位大大~如何實現作者所要求的呢( 動態產生多個 TMenuItem )?
我看不懂作者最後的答覆~
謝謝~
編輯記錄
firewing 重新編輯於 2007-12-11 16:11:53, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-12-11 16:12:07 IP:210.66.xxx.xxx 訂閱
(1)MainMenu1->Items->Clear(); 這裡應該就會先清除之前產生的TMenuItem, 包含用A產生的.
(2)因為在Create TMenuItem時, 指定 Owner 為 this, 意即 TForm1, 所以當程式結束時, 由Owner
負責將最後產生的MenuItem 釋放
(3)當程式離開Button1Click()後, A, B 便會失效, 因為離開了它們被宣告的範圍,
(所以在程式其他地方, 也就不能以這些物件指標來引用TMenuItem了)

所以我認為不會有記憶體遺漏的問題

個人看法, 謹供參考...

===================引 用 firewing 文 章===================
jow 大大謝謝你的回覆~你貼的我有看過~但我有一個問題:
for 迴圈內 TMenuItem *B = new TMenuItem(this);
會不會造成記憶體遺失? 因為 前幾次使用的 B 並無被釋放

編輯記錄
jow 重新編輯於 2007-12-11 16:13:00, 註解 無‧
jow 重新編輯於 2007-12-11 16:13:30, 註解 無‧
系統時間:2024-04-26 4:43:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!