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

如何共用PopupMenu菜单!

尚未結案
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-17 14:46:52 IP:61.146.xxx.xxx 未訂閱
我有多个同样的frame,想共用一个菜单, 怎样才能对发生事件的组件操作? 例如: frame里有一个edit1组件,这个edit1共用PopupMenu菜单是form1里的PopupMenu1, form1里动态产生几frame,我想在edit1里弹出菜单, 操作相应的edit1的text属性。 DT520 @>>>-->>---------一路风尘一路歌!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-17 15:42:40 IP:218.16.xxx.xxx 未訂閱
若 1. Edit1 的 Owner 是 Frame (任何名字) 2. Frame1 的 Owner 是 Form (任何名字) 3. Form 裡有個叫 PopupMenu1 的 PopupMenu 那你可用 : Edit1.PopupMenu := TPopupMenu(Edit1.Owner.Owner.FindComponent('PopupMenu1'));
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-18 11:47:16 IP:61.146.xxx.xxx 未訂閱
对不起,Justmade! 我主要是想知道,"这个edit1共用PopupMenu菜单是form1里的PopupMenu1" 这个form1.PopupMenu1是怎样编写? 才能"在edit1里弹出菜单,操作相应的edit1的text属性。" DT520 @>>>-->>---------一路风尘一路歌!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-18 12:52:23 IP:218.16.xxx.xxx 未訂閱
若只用在 TEdit : TEdit(Sender).Text := 'xyz';
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-18 13:50:08 IP:61.146.xxx.xxx 未訂閱
TEdit(Sender).Text := 'xyz'; 这样也不行, 它下一句end;就停下来了,说是内存问题.    其它的XXXX(sender)则没有这种用法.    我想用一种通用的办法,也不要case,因为菜单的项多,不够效率. DT520 @>>>-->>---------一路风尘一路歌!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-18 14:40:18 IP:218.16.xxx.xxx 未訂閱
引言: TEdit(Sender).Text := 'xyz'; 这样也不行, 它下一句end;就停下来了,说是内存问题.
若那個是 TEdit 不會錯丫,除非你自己其他部份出錯。
引言: 其它的XXXX(sender)则没有这种用法. 我想用一种通用的办法,也不要case,因为菜单的项多,不够效率.
那便用絕招罷 : uses typInfo if IsPublishedProp(Sender,'Text') then SetPropValue(Sender,'Text','xyz')); 不過若你自己的程式其他碼錯也是會出錯的啦。你想想找 typInfo 的資料到 Google 找 RTTI 罷。
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-18 20:28:45 IP:61.146.xxx.xxx 未訂閱
谢谢你的绝招!! 但我现在更关心的是怎么样用一种通用的办法,(也不要case,) 来对listbox,shelllistview等等常用组件的操作. DT520 @>>>-->>---------一路风尘一路歌!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-18 20:40:49 IP:218.16.xxx.xxx 未訂閱
你到底有沒試過????    我說的方式凡是有 Text 這個屬性的元件都可設,沒 Text 屬性的元件當然不可設啦但也不會出錯。 無論是 TEdit, TComboBox 等都可設 如用 Caption 即 TLable, TPanel, TButton, TForm, 等所有有 Caption 屬性的都可設 同樣道理亦可設其他不同元件共通的屬性。    你還想甚樣 ?    要完全不寫程式碼,你心想電腦甚樣運行就甚樣運行嗎?    你是否看 Matrix 太多了以為自己是 The One 罷  發表人 -
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-18 21:05:18 IP:61.146.xxx.xxx 未訂閱
Justmade版主 : 你误会了.    我看了其它的高手,他用的是BC,他说可以,但我不用BC,没法试,也没法用他说的方法.    +++++++++++++++++++++++++++++++++++++++++++ 我有多个同样的frame,想共用一个菜单, 怎样才能对发生事件的组件操作? 例如: frame里有一个shelllistview组件,这个shelllistview共用PopupMenu菜单是form1里的PopupMenu1, form1里动态产生几同样的frame,我想在shelllistview里弹出菜单, 操作相应的shelllistview来打开PopupMenu1里的path,path是 放在PopupMenu1的一个子菜单的hint里(我还没想到path放在哪里更好). 我这样说,清楚了吗? DT520 @>>>-->>---------一路风尘一路歌!!
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-18 21:18:05 IP:61.146.xxx.xxx 未訂閱
我测试出错!! 测试环境:win2k server,delphi7. 程式如下: 设置: //edit1.PopupMenu :=PopupMenu1; //edit1.OEMConvert :=false; unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; PopupMenu1: TPopupMenu; Button1: TButton; test1: TMenuItem; procedure test1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.test1Click(Sender: TObject); begin TEdit(Sender).Text := 'xyz'; end;//这一句出错! end. DT520 @>>>-->>---------一路风尘一路歌!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-18 21:41:15 IP:218.16.xxx.xxx 未訂閱
對不起,是我錯。 Sender 在這個情況是 MenuItem 而非 Edit1 所以轉成 : TEdit(ActiveControl).Text := 'xyz'; 便可 我亦試過多放幾個 Panel 及 TEdit 並將所有 TEdit 的 popupmenu 設 PropUpMenu1,在所有不同地方的 TEdit 都可行。我也試過 ShellListView 也可行。 如你想安全點,可改成 if ActiveControl is TShellListView then TShellListView(ActiveControl).AlphaSort;
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-19 08:37:35 IP:61.146.xxx.xxx 未訂閱
我回家试试! 如果这样类似这样TEdit(ActiveControl).Text := 'xyz';行的话, 程式就简洁多了,执行效率也很高. 谢谢! DT520 @>>>-->>---------一路风尘一路歌!!
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-06-19 15:31:56 IP:61.146.xxx.xxx 未訂閱
在frame中测试通不过!!!    测试环境:win2k server,delphi7.     TShellListView(ActiveControl).AlphaSort;// [Error] Unit2.pas(28): Undeclared identifier: 'ActiveControl'    在form中TShellListView(ActiveControl).AlphaSort不提示出错,但很多属性不见了(等于不用).(可能是我不会用.)    对于tedit,TButton可以.但右键不会改变ActiveControl. 所以if 这一句不能省.    Justmade版主 : 想想办法!!     操作相应的shelllistview来打开PopupMenu1里的path,path是 放在PopupMenu1的一个子菜单的hint里(我还没想到path放在哪里更好). DT520 @>>>-->>---------一路风尘一路歌!!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-06-20 12:41:00 IP:218.16.xxx.xxx 未訂閱
在 Frame 裡 Form 的 Active Control 應是變成 Frame 而不是 Frame 裡的 Control 那改用 Screen.ActiveControl 罷
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  TShellListView(Screen.ActiveControl).Root := 'C:\';
end;
用TShellListView(ActiveControl) 不會有屬性不見了,你是只用了一次次後沒加 TShellListView 罷,每次用都要加的否則 Delphi 不知他是 ShellListView 甚知可用甚麼屬性。
dt520
一般會員


發表:11
回覆:61
積分:14
註冊:2003-05-13

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-06-20 15:10:55 IP:61.146.xxx.xxx 未訂閱
如Justmade版主所说,一切OK!!!    谢谢! 经这次问答,知道有一种 > 以前知道有 > 还有版主的绝招. >>>--&>---------一路风尘一路歌!!
系統時間:2024-05-02 13:13:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!