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

如何把自訂的Form當成參數傳入Procedure(TMyForm)?

答題得分者是:eaglewolf
douglas
初階會員


發表:24
回覆:42
積分:38
註冊:2008-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-03-09 17:55:54 IP:59.125.xxx.xxx 未訂閱
 請教諸位大大:

描述結構如下
我有多個報表列印表單, 每個報表在列印的時候都需要參考同一個項目清單
例:
列印各國獅子的出生率, 那就是要參考到國家項目清單;
列印某國流浪狗數量統計, 也是需要參考國家項目清單.

各個報表列印表單都可以共用此項目清單
但是項目清單又需要根據不同的報表表單進行初始化設定
所以我在這些報表表單、項目表單之外, 另外於一個空白的unit撰寫一段Procedure
用以敘述建立此項目表單以及初始化的程式

因為初始化需要根據不同的報表列印表單進行設定
所以才嘗試直接把報表列印表單的主體當成參數傳入
Procedure Mathodaaa(var MainForm: Type);


這樣報表列印表單要使用項目表單的時候只需要引用第三方unit
然後呼叫Mathodaaa一行敘述就可以完成建立、初始化設定
日後維護亦只需修改此第三方unit

請教這個觀念不知是否有誤? @~@|||

還是自訂的視窗物件是沒有一個共用的型態可以定義的嗎?
目前是改以Procedure Methodaaa(參數1; 參數2; 參數3....);
把項目表單初始化所需的資訊全部帶入解決
編輯記錄
douglas 重新編輯於 2010-03-10 14:15:11, 註解 無‧
douglas 重新編輯於 2010-03-11 10:12:40, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-03-10 09:22:47 IP:211.75.xxx.xxx 訂閱
就看你的myMainForm的type是如何宣告的
假設是
type
TmyMainForm = class(TForm)

end;
那就是
uses myMainForm;
Procedure Methodaaa(form:TmyMainForm);

===================引 用 douglas 文 章===================
請教諸位大大:

我把一段程式寫在一個獨立的unit裡當做Procedure
當myMainForm呼叫這個Procedure會動態建立一個mySubForm並完成初始化
我想要在這個Procedure裡帶入myMainForm當作參數
請教該如何設定參數的型態?Procedure Methodaaa(var myMainForm: Type); ?
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
douglas
初階會員


發表:24
回覆:42
積分:38
註冊:2008-03-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-03-10 13:58:37 IP:59.125.xxx.xxx 未訂閱
eaglewolf 您好:

因為mySubForm是想要設計成共用的
就是可能會有myMainForm1, myMainForm2, myMainForm3...去呼叫使用

若是以大大的建議, 是否必須在每個MainForm都要引用還有撰寫呼叫的敘述?
或是需要針對每個自訂視窗都要有一個對應的多載敘述(overload)?

我就嘗試在第三方unit裡撰寫這段Procedure
把主視窗當成參數傳入
這樣要使用mySubForm的時候只需要引用第三方unit, 然後一行敘述就可以完成
所以才會有 Procedure Methodaaa(Type); 這樣的想法
請教這個觀念不知是否有誤? @~@|||

還是自訂的視窗物件是沒有一個共用的型態可以定義的嗎?
目前是改以Procedure Methodaaa(參數1; 參數2; 參數3....);
把mySubFrom所需的資訊全部帶入解決

===================引 用 eaglewolf 文 章===================
就看你的myMainForm的type是如何宣告的
假設是
type
TmyMainForm = class(TForm)

end;
那就是
uses myMainForm;
Procedure Methodaaa(form:TmyMainForm);
編輯記錄
douglas 重新編輯於 2010-03-10 14:03:01, 註解 無‧
douglas 重新編輯於 2010-03-10 14:19:55, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-03-10 22:55:09 IP:122.116.xxx.xxx 訂閱
不是很確定你的需要
我猜一下
你想要有一個表單 放置了一些 控制項 ,而這些是其他表單 都會需要用到的?
如果是的話
那麼 其他表單應該直接繼承該表單
以你的例子來說:

myMainForm1 應該類似底下的宣告

type
TmyMainForm1 = class(TmySubForm)


end;

IDE上的操作
不要直接新增表單
而是新增其他 然後切換到 你專案名稱的頁籤
再選擇mySubForm

p.s. 你可能須要重新命名表單名稱及Type名稱...比較不會造成混淆.

===================引 用 douglas 文 章===================
eaglewolf您好:

因為mySubForm是想要設計成共用的
就是可能會有myMainForm1,myMainForm2,myMainForm3...去呼叫使用

若是以大大的建議, 是否必須在每個MainForm都要引用還有撰寫呼叫的敘述?
或是需要針對每個自訂視窗都要有一個對應的多載敘述(overload)?

我就嘗試在第三方unit裡撰寫這段Procedure
把主視窗當成參數傳入
這樣要使用mySubForm的時候只需要引用第三方unit,然後一行敘述就可以完成
所以才會有 Procedure Methodaaa(Type); 這樣的想法
請教這個觀念不知是否有誤? @~@|||

還是自訂的視窗物件是沒有一個共用的型態可以定義的嗎?
目前是改以Procedure Methodaaa(參數1; 參數2; 參數3....);
把mySubFrom所需的資訊全部帶入解決

===================引 用 eaglewolf 文 章===================
就看你的myMainForm的type是如何宣告的
假設是
type
TmyMainForm = class(TForm)

end;
那就是
uses myMainForm;
Procedure Methodaaa(form:TmyMainForm);
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
syntax
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-03-11 08:17:07 IP:59.125.xxx.xxx 訂閱
1. 注意循環參照
2. Procedure Methodaaa(TForm: aForm) and your form must be a descendant of TForm
===================引 用 douglas 文 章===================
eaglewolf您好:

因為mySubForm是想要設計成共用的
就是可能會有myMainForm1,myMainForm2,myMainForm3...去呼叫使用

若是以大大的建議, 是否必須在每個MainForm都要引用還有撰寫呼叫的敘述?
或是需要針對每個自訂視窗都要有一個對應的多載敘述(overload)?

我就嘗試在第三方unit裡撰寫這段Procedure
把主視窗當成參數傳入
這樣要使用mySubForm的時候只需要引用第三方unit,然後一行敘述就可以完成
所以才會有 Procedure Methodaaa(Type); 這樣的想法
請教這個觀念不知是否有誤? @~@|||

還是自訂的視窗物件是沒有一個共用的型態可以定義的嗎?
目前是改以Procedure Methodaaa(參數1; 參數2; 參數3....);
把mySubFrom所需的資訊全部帶入解決

===================引 用 eaglewolf 文 章===================
就看你的myMainForm的type是如何宣告的
假設是
type
TmyMainForm = class(TForm)

end;
那就是
uses myMainForm;
Procedure Methodaaa(form:TmyMainForm);
douglas
初階會員


發表:24
回覆:42
積分:38
註冊:2008-03-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-03-11 09:51:32 IP:59.125.xxx.xxx 未訂閱
我描述一下結構
我有多個報表列印表單, 每個報表在列印的時候都需要參考同一個項目清單
例:
列印各國獅子的出生率, 那就是要參考到國家項目清單;
列印某國流浪狗數量統計, 也是需要參考國家項目清單.

各個報表列印表單都可以共用此項目清單
但是項目清單又需要根據不同的報表表單進行初始化設定(如: 表單顯示位置...)
所以我在這些報表表單、項目表單之外, 另外於一個空白的unit撰寫一段Procedure
用以敘述建立此項目表單以及初始化的程式

因為初始化需要根據不同的報表列印表單進行設定
所以才嘗試直接把報表列印表單的主體當成參數傳入
Procedure Mathodaaa(var MainForm: Type);

不過大大您的建議卻讓我有意外的收穫
感謝感謝 ^_^

===================引 用 eaglewolf 文 章===================
不是很確定你的需要
我猜一下
你想要有一個表單 放置了一些 控制項 ,而這些是其他表單 都會需要用到的?
如果是的話
那麼 其他表單應該直接繼承該表單
以你的例子來說:

myMainForm1 應該類似底下的宣告

type
TmyMainForm1 = class(TmySubForm)


end;

IDE上的操作
不要直接新增表單
而是新增其他 然後切換到 你專案名稱的頁籤
再選擇mySubForm

p.s. 你可能須要重新命名表單名稱及Type名稱...比較不會造成混淆.
douglas
初階會員


發表:24
回覆:42
積分:38
註冊:2008-03-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-03-11 10:06:57 IP:59.125.xxx.xxx 未訂閱
syntax您好:

我提出我理解的想法再請您指教

若是我要把這些Procedure擠在同一個uinit敘述程式
是否要針對不同的myFormX進行多載描述?
Procedure Methodaaa(var tmpForm: TmyFormA) overload;
Procedure Methodaaa(var tmpForm: TmyFormB) overload;
...TFormX 等等

所以每個自訂的myFromX就是獨立一個TmyFormX型別, 而不能當作一般的TForm這個型別嗎?
===================引 用 syntax 文 章===================
1. 注意循環參照
2. Procedure Methodaaa(TForm: aForm) and your form must be a descendant of TForm

編輯記錄
douglas 重新編輯於 2010-03-11 10:07:32, 註解 無‧
douglas 重新編輯於 2010-03-11 10:17:24, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-03-11 22:15:54 IP:122.116.xxx.xxx 訂閱
以你舉的例子
我大概會這樣做
(1) 建一個QueryBaseForm
放三個標籤 分別為 國別 起始日期 結束日期
放一個下拉式選單 存放國別資料
放兩個 datetimepicker 存放查詢/統計的起迄日期
放兩個按鈕 分別為 查詢/統計 及 離開
(2) 建兩個表單 繼承自 QueryBaseForm
分別為 QueryLionBornRateForm, QueryStrayDogCountForm
(3) 在兩個子表單 調整控制項的位置 或增加各自所需的控制項
以及完成各自的查詢/統計功能


===================引 用 douglas 文 章===================
我描述一下結構
我有多個報表列印表單, 每個報表在列印的時候都需要參考同一個項目清單
例:
列印各國獅子的出生率, 那就是要參考到國家項目清單;
列印某國流浪狗數量統計, 也是需要參考國家項目清單.

各個報表列印表單都可以共用此項目清單
但是項目清單又需要根據不同的報表表單進行初始化設定(如: 表單顯示位置...)
所以我在這些報表表單、項目表單之外, 另外於一個空白的unit撰寫一段Procedure
用以敘述建立此項目表單以及初始化的程式

因為初始化需要根據不同的報表列印表單進行設定
所以才嘗試直接把報表列印表單的主體當成參數傳入
Procedure Mathodaaa(var MainForm: Type);

不過大大您的建議卻讓我有意外的收穫
感謝感謝 ^_^

===================引 用 eaglewolf 文 章===================
不是很確定你的需要
我猜一下
你想要有一個表單 放置了一些 控制項 ,而這些是其他表單 都會需要用到的?
如果是的話
那麼 其他表單應該直接繼承該表單
以你的例子來說:

myMainForm1 應該類似底下的宣告

type
TmyMainForm1 = class(TmySubForm)


end;

IDE上的操作
不要直接新增表單
而是新增其他 然後切換到 你專案名稱的頁籤
再選擇mySubForm

p.s. 你可能須要重新命名表單名稱及Type名稱...比較不會造成混淆.
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2010-03-11 22:23:46, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-03-11 22:27:22 IP:122.116.xxx.xxx 訂閱
若不使用多載的方式
就必須在Methodaaa中加以轉型

(tmpForm as TmyFormA)

===================引 用 douglas 文 章===================
syntax您好:

我提出我理解的想法再請您指教

若是我要把這些Procedure擠在同一個uinit敘述程式
是否要針對不同的myFormX進行多載描述?
Procedure Methodaaa(var tmpForm: TmyFormA) overload;
Procedure Methodaaa(var tmpForm: TmyFormB) overload;
...TFormX 等等

所以每個自訂的myFromX就是獨立一個TmyFormX型別, 而不能當作一般的TForm這個型別嗎?
===================引 用 syntax 文 章===================
1. 注意循環參照
2. Procedure Methodaaa(TForm: aForm) and your form must be a descendant of TForm

------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
系統時間:2024-04-25 22:56:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!