線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2387
推到 Plurk!
推到 Facebook!

Runtime 設計 Form 元件的最新發展及Demo (不含元件)

 
Justmade
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-09 20:17:22 IP:218.16.xxx.xxx 未訂閱
繼『在 Runtime 讓使用者自由的拉動所有元件的位置和大小』 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31513 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31557 後    現已將那些功能改進及與我的其他部份元件連結,做了一個叫 JMFormDesigner 的元件出來,功能亦加強了不少    先此聲明,這些元件暫時沒打算免費開放,而正考盧以低價位商用元件的形式來發售(但未定實)。    簡介 : 這個是我的元件的 Properties :
  • FileName 是自動儲存讀取的 FileName
  • Form 是指定操作的 Form, 不一定要是現在的 Form, 所以一個 JMFormDesigner 元件可處理個系統的所有 Form。
  • StartControl 是指定可設計的起始元件,預設是 Form,也可設定成其他 Container 或單一元件。
  • OptionFormProp 是建立 Option Form 的設定(像 DFM),可直接輸入或 LoadFromFile
  • PropEditorProp 是建立 Property Editor的設定
  • Options 是一些操作上的選項 : - joStartControl → StartControl 本身 (如 Panel1) 是否可設計 - joSubControls → StartControl 的子元件 (若有的話) 是否可設計 - joCanMove → 設計時是否可 Drag 移動元件 - joCanResize → 設計時是否可 Drag 改變元件大小 - joAutoSave → 是否自動存讀 Form 的設計 - joShowEditor → 是否顯示 Property Editor
這是 Runtime 以剛才 OptionFormProp 建立的給使用者選 StartControl 及選項的 Option Form 這是 Runtime 以剛才 PropEditorProp 建立的 Property Editor,暫時借用 JEDI 的 Inspector, 將會換成我自己開發的 Property Editor。 這個元件的特別之處是使用非常簡單,大部份操作均可一句完成,而且沒限制只可用在甚麼元件,可說是任何元件都可以在 Runtime 設定及儲存(這個範例只處理視覺元件),可參看附上範例的程式碼 :
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 加上使用者自行設計介面的功能。 預算會加入
  1. Componets Palette 程式員在 IDE 將要給使用者可動態新增的元件放進一個 Container (如 TPanel 或另一獨立 Form) 並指給 JMFormDesigner 便可以在 Runtime 叫出 Componets Palette 讓使用者加入元件 這部份要多謝 ccchen 大師給與以 Container 來處理 Componets Palette 的提議
  2. Event Editor 讓使用者可像在 Object Inspector 裡選已寫好的 Event
  3. Runtime Interpretator 這個我應會找網上現成的來配合,讓使用者以自行作簡單編程並配合 Event Editor 使用
有興趣的歡迎提出建議及臭蟲報告,若你想要在發行前先取得測試版本 (DCU Only,暫沒有) 亦可聯絡我,若真的能發行我將會免費發放給有實質幫助開發的人。
附加檔案:32021_JMDesignerDemo.zip
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-10 23:21:59 IP:61.70.xxx.xxx 未訂閱
引言: 繼『在 Runtime 讓使用者自由的拉動所有元件的位置和大小』 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31513 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31557 後 現已將那些功能改進及與我的其他部份元件連結,做了一個叫 JMFormDesigner 的元件出來,功能亦加強了不少 先此聲明,這些元件暫時沒打算免費開放,而正考盧以低價位商用元件的形式來發售(但未定實)。 簡介 : 這個是我的元件的 Properties :
  • FileName 是自動儲存讀取的 FileName
  • Form 是指定操作的 Form, 不一定要是現在的 Form, 所以一個 JMFormDesigner 元件可處理個系統的所有 Form。
  • StartControl 是指定可設計的起始元件,預設是 Form,也可設定成其他 Container 或單一元件。
  • OptionFormProp 是建立 Option Form 的設定(像 DFM),可直接輸入或 LoadFromFile
  • PropEditorProp 是建立 Property Editor的設定
  • Options 是一些操作上的選項 : - joStartControl → StartControl 本身 (如 Panel1) 是否可設計 - joSubControls → StartControl 的子元件 (若有的話) 是否可設計 - joCanMove → 設計時是否可 Drag 移動元件 - joCanResize → 設計時是否可 Drag 改變元件大小 - joAutoSave → 是否自動存讀 Form 的設計 - joShowEditor → 是否顯示 Property Editor
這是 Runtime 以剛才 OptionFormProp 建立的給使用者選 StartControl 及選項的 Option Form 這是 Runtime 以剛才 PropEditorProp 建立的 Property Editor,暫時借用 JEDI 的 Inspector, 將會換成我自己開發的 Property Editor。 這個元件的特別之處是使用非常簡單,大部份操作均可一句完成,而且沒限制只可用在甚麼元件,可說是任何元件都可以在 Runtime 設定及儲存(這個範例只處理視覺元件),可參看附上範例的程式碼 :
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 加上使用者自行設計介面的功能。 預算會加入
  1. Componets Palette 程式員在 IDE 將要給使用者可動態新增的元件放進一個 Container (如 TPanel 或另一獨立 Form) 並指給 JMFormDesigner 便可以在 Runtime 叫出 Componets Palette 讓使用者加入元件 這部份要多謝 ccchen 大師給與以 Container 來處理 Componets Palette 的提議
  2. Event Editor 讓使用者可像在 Object Inspector 裡選已寫好的 Event
  3. Runtime Interpretator 這個我應會找網上現成的來配合,讓使用者以自行作簡單編程並配合 Event Editor 使用
有興趣的歡迎提出建議及臭蟲報告,若你想要在發行前先取得測試版本 (DCU Only,暫沒有) 亦可聯絡我,若真的能發行我將會免費發放給有實質幫助開發的人。
這種東西,跟 Delphi 的 IDE 介面幾乎是一樣的喔!要注意是否有侵權之嫌疑喔!如果沒有商業行為,那就不用太注意了! 只是做一個跟 Delphi 一樣功能/類似的東西,那用處在哪裡呢!什麼時機使用呢? 能否跟好奇的小弟說明一下啊?
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-11 10:16:47 IP:211.76.xxx.xxx 未訂閱
引言:這種東西,跟 Delphi 的 IDE 介面幾乎是一樣的喔!要注意是否有侵權之嫌疑喔!如果沒有商業行為,那就不用太注意了!
這部份應該沒有侵權的問題 ... 其實這類元件也有其他公司發展 http://www.greatis.com Form Designer Object Inspector http://www.greatis.com/objinsp.htm Runtime Fusion
------
將問題盡快結案也是一種禮貌!
Justmade
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-13 00:42:25 IP:218.16.xxx.xxx 未訂閱

更新 :

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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-13 22:15:55 IP:61.228.xxx.xxx 未訂閱
有,這個東西有特殊的價值! 那就是對於某些開發簡易繪圖軟體的人,或是某些軟體內附簡易的繪圖功能,都可以用這個東西快速的開發! 甚至於可以開發像是carlDRAW這類的「物件化」繪圖軟體,因為只要我們把視覺化元件設計好,就可以用拖拉、擊點的方式來控制該物件,那真的可以減少很多程式開發的時間喔~ 我之前就開發過一個工程用的山坡地分析軟體,在山坡地的坡形繪製部分,就是想開發成「物件化」的介面,不過公力太差了,最後只好用簡易的滑鼠擊點、座標輸入來完成,如果那時早見到這個東西,或許就不會那麼累了! 加油加油!!! 祝原作者開發順利、商業化順利!
Justmade
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-18 12:36:03 IP:218.16.xxx.xxx 未訂閱
新版簡單說明 (我再做一個全新 Demo 時再詳細點解說) :
  1. 差不多整個重寫,以支援 Component (非 Control)
  2. 若設定了 autoGetIcon 及 autoGetMethod,不用 Property/Component Editor / Wizard 即可在元件自動抓 Icon 及 已存在於 Form 的 Method
  3. Icon 可自行修改成別的,但一定要對號入座別弄亂了次序,一個 ComponentClass 只能有一個 Icon
  4. 在PaletteContainer 的元件在 RunTime 會自動被製成 Palette,而你可在DesignTime 先設好屬性/事件,在Runtime 時使用者新增時便預設是你的設定了。
  5. 你亦可以用同一ComponentClass 放多個做不同設定,如範例中的 Panel 及 Blue Panel
  6. 非視覺元件亦支援,如範例中的 Timer,由於這些元件不能放到 PageControl 中,你要將元件Name 打在 ComponentPage 屬性中。
  7. PaletteContainer 及 在 ComponentPage 列出 的元件全都會在 RunTime 自動被 Free 掉,所以不要將有用的非視覺元件列在ComponentPage中
  8. 不要被使用者修改的元件可加進 ExludeList 屬性
  9. 也可針對某些元件設成不能修改 Properties / Events 等等,見範例中的 Group Box,只能移動不能修改別的
由於沒時間整理所有很多資料沒列出,遲些罷。 另外還有些不易找的 Bug, 間中程式關閉時會 AV (是發生在 Form 的元件全 Free 了之後所以找不出那裡發出的,應是某些 Resources 沒釋放好),容後再 fix。 歡迎回文給與意見、建議或指出錯誤。
系統時間:2024-10-02 4:26:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!