Runtime 設計 Form 元件的最新發展及Demo (不含元件) |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
繼『在 Runtime 讓使用者自由的拉動所有元件的位置和大小』
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31513
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31557
後 現已將那些功能改進及與我的其他部份元件連結,做了一個叫 JMFormDesigner 的元件出來,功能亦加強了不少 先此聲明,這些元件暫時沒打算免費開放,而正考盧以低價位商用元件的形式來發售(但未定實)。 簡介 :
這個是我的元件的 Properties :
unit JMDesignerForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Math, Grids, Menus, JMFormDesign, LPFunc; type TSG = class(TStringGrid); TForm1 = class(TForm) JMFD: TJMFormDesign; {Any Components} MainMenu1: TMainMenu; {Menu Items} procedure Button1Click(Sender: TObject); procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure miClick(Sender: TObject); private Cur, Def : String; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // 測試用,非必要 ShowMessage('onClick functioning'); ShowMessage(Format('.3n',[12.34])); end; procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // 測試用,非必要 Label1.Caption := Format('%d,%d',[X,Y]); end; procedure TForm1.miClick(Sender: TObject); begin // 處理選單項目; Case TMenuItem(Sender).Tag of 1 : JMFD.SaveLoad(smDefault); // 還原為IDE設計時樣式 2 : JMFD.SaveLoad(smSave,Self,JMFD.FileName); // 儲存到預設檔名 3 : JMFD.SaveLoad(smSave,Self); // 讓使用者選檔名來儲存 4 : JMFD.SaveLoad(smLoad,Self); // 讓使用者選檔名來還原 5 : JMFD.SaveLoad(smSave,JMFD.StartControl); // 從 StartControl 起儲存 6 : JMFD.SaveLoad(smLoad,JMFD.StartControl); // 從 StartControl 起還原 (要配合 5) 11 : JMFD.OptionsDlg; // 顯示 Option Form 12 : JMFD.StartDesign; // 進入設計模式 13 : JMFD.EndDesign; // 離開設計模式 14 : if miInsp.Checked then // 顯示/隱藏 Property Editor JMFD.Options := JMFD.Options + [joShowEditor] else JMFD.Options := JMFD.Options - [joShowEditor]; end; end; end.上面三個 Method 裡二個是試驗用只有一個是操作 Menu Items 你可看到絕大部份動作都是一句達成。 由於這些少量碼只要在 MainForm (或一特定的 Form/Unit) 寫好便可應用到所有 Form,在不需要持別處理的情況下十多行程式碼便可使你整個 Application 加上使用者自行設計介面的功能。 預算會加入
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言: 繼『在 Runtime 讓使用者自由的拉動所有元件的位置和大小』 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31513 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31557 後 現已將那些功能改進及與我的其他部份元件連結,做了一個叫 JMFormDesigner 的元件出來,功能亦加強了不少 先此聲明,這些元件暫時沒打算免費開放,而正考盧以低價位商用元件的形式來發售(但未定實)。 簡介 : 這個是我的元件的 Properties :這種東西,跟 Delphi 的 IDE 介面幾乎是一樣的喔!要注意是否有侵權之嫌疑喔!如果沒有商業行為,那就不用太注意了! 只是做一個跟 Delphi 一樣功能/類似的東西,那用處在哪裡呢!什麼時機使用呢? 能否跟好奇的小弟說明一下啊? |
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
更新 :Component Palette :1. 設計時加上一個 PageControl 及 一個 ImageList 並設定在 TFormDesigner 的 PaletteContainer 及 Images 屬性 2. 在PageControl 開 Pages, 埴上 Caption, 放任你要讓使用者可加上的可視元件 Run Time 便會自動制成 Component Palette : 上面看到的 Component Palette 只是現時粗糙的版本,會慢慢改善。 若你不喜觀使用預設的 Palette 你亦可自行制作 Component Palette 而完全不用預設的,方法如下 : 1. 一次要是 TForm 或其後代 2. 要支援 IJMFDPalette Interface, 其宣告如下 :IJMFDPalette = Interface ['{4CC77957-FC54-42BD-91A8-3EBAB80F2896}'] function GetActiveClassName: String; procedure SetActiveClassName(const Value: String); Property ActiveClassName : String read GetActiveClassName write SetActiveClassName; procedure SetImages(const Value: TImageList); procedure AddPage(TabCaption : String); procedure AddItem(AName : String; ImageIndex : integer=-1); end;3. Initialization 要 Register Class 4. 在 TJMFormDesign 的 PaletteForm 屬性輸入你的 FormClass 即可 Object Inspector :1. 仍然借用 JVCL 的 Inspector,不過改了使用上面的形式,即可換掉 Property Editor 用完全不同的元件來做 2. 加上了 Event 頁但未能設定 3. 加上了 ComboBox 可直接選取元件 4. 自定的 Object Inspector 要支援 IJMFDObjInsp Interface, 其宣告如下 :IJMFDObjInsp = Interface ['{E3EF0C2F-8157-4E32-8EB3-BC86BAAD58CF}'] procedure SetonComListChanged(Value : TNotifyEvent); procedure SetOnDataChanged(Value : TObjInspDataChanged); function GetSelectedIndex : Integer; procedure AddCompName(AName : String); procedure ClearCompNames; procedure Select(Comp : TComponent); end; 自定 Component Palette / Object Inspector要方便的可用預設的全不用寫碼,要自由度高可自行設計這些 Form 可參考附上的 JMFDPalette.pas / JMFDObjInsp.pas Component Palette / Object Inspector 的大小及位置可在 TFormDesign 的 PaletteSize 及 ObjInspSize 設定,另外也外 RunTime 直接操控這些 Form 甚至 RunTime 置換 Option Form 亦會改成這種形式加入新元件● 圖示的 Hints 為元件的 Class ● 在 Palette 按你要加入的元件,圖示會顯示到最左邊 ● 要加入在 Form 你要加入的地方 Click ● 要取消的話按一下最左方的圖示KeyBoard 操作移動 : 按上下左右-->移一點 加 Ctrl -->移五點 大小 : 按 Shift 上下左右 --> 增減一點 加 Ctrl -->增減五點 Delete : 刪除元件 (在Designtime 設的不能刪除,但可在 Property Editor 設 Visible = false) Ctrl-X : 前下 Ctrl-C : 複製 Ctrl-V : 貼上 (連事件也會複製的)Demo 程式碼差不多沒變,只因應多了 Component Palette 所以改了一點加上開關 :procedure TForm1.miClick(Sender: TObject); var JMFDO : TJMFDOptions; begin Case TMenuItem(Sender).Tag of 1 : JMFD.SaveLoad(smDefault); 2 : JMFD.SaveLoad(smSave,Self,JMFD.FileName); 3 : JMFD.SaveLoad(smSave,Self); 4 : JMFD.SaveLoad(smLoad,Self); 5 : JMFD.SaveLoad(smSave,JMFD.StartControl); 6 : JMFD.SaveLoad(smLoad,JMFD.StartControl); 11 : JMFD.OptionsDlg; 12 : JMFD.StartDesign; 13 : JMFD.EndDesign; end; JMFDO := JMFD.Options - [joShowEditor,joShowPalette]; if miInsp.Checked then JMFDO := JMFDO + [joShowEditor]; if miPalette.Checked then JMFDO := JMFDO + [joShowPalette]; if JMFD.Options <> JMFDO then JMFD.Options := JMFDO; end; 其他可放的元件並不限放 Demo 中的元件,基本上大部份可視原件包括第三者原件均可放上,但有些會有點問題,由其是需要 Design Time 設定及使用特殊 Property Editor / Component Editor 那些原件。 若能加點程式碼便可處理的,常用的元件 JMFormDesigner 應會內部處理,其他的使用者可以通過 Event 作處理,若一定要 IDE 在才能設定的便要另想辦法或放棄了(這佔極少數)。 下一步會加上可在那些備用元件寫事件碼,使用者新增元件時都會指定那些事件,不過要留意物件名稱可能不同所以要用 Sender 不能直接用名字。 |
strans
一般會員 發表:0 回覆:2 積分:0 註冊:2002-07-16 發送簡訊給我 |
有,這個東西有特殊的價值!
那就是對於某些開發簡易繪圖軟體的人,或是某些軟體內附簡易的繪圖功能,都可以用這個東西快速的開發! 甚至於可以開發像是carlDRAW這類的「物件化」繪圖軟體,因為只要我們把視覺化元件設計好,就可以用拖拉、擊點的方式來控制該物件,那真的可以減少很多程式開發的時間喔~ 我之前就開發過一個工程用的山坡地分析軟體,在山坡地的坡形繪製部分,就是想開發成「物件化」的介面,不過公力太差了,最後只好用簡易的滑鼠擊點、座標輸入來完成,如果那時早見到這個東西,或許就不會那麼累了! 加油加油!!!
祝原作者開發順利、商業化順利!
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
新版簡單說明 (我再做一個全新 Demo 時再詳細點解說) :
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |