多個物件如何應用同一個方法 |
答題得分者是:herbert2
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
請問各位大大:
若有一個方法想應用在多個物件上,請問應如何達成。 如:有三個Edit(Edit1、Edit2與Edit3),想在其KeyPress事件中撰寫一段相同的程式,但又不想每個Edit都寫一次KeyPress事件(想以一個KeyPress事件就可以達成),請問有其他方法可以達成嗎? 小弟有個想法,但不知可不可以實現,就是在Form的KeyPress事件中,先判斷若有包含Edit這些元件(這裡不是全部的Edit元件,是部分而已)再進行動作,不知這想法是否可行,煩請各位大大指教一下小弟也請各位大大給小弟更好的想法與方向,謝謝。 |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
|
HikaruGo
中階會員 發表:22 回覆:69 積分:88 註冊:2007-12-09 發送簡訊給我 |
另一參考
用Code 會精準點,不會怕User 點錯 [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure CommEditKeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.CommEditKeyPress(Sender: TObject; var Key: Char); begin // if Sender is TEdit then //判斷來源是 TEdit begin //共同的RULE Showmessage( TEdit(sender).Name ',Press Key:' Key); //CUSTOM RULE if TEdit(sender).Name = Edit1.Name then begin Showmessage( 'Edit1 專屬的Rule' ); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin //掛EVENT Edit1.OnKeyPress := CommEditKeyPress; Edit2.OnKeyPress := CommEditKeyPress; Edit3.OnKeyPress := CommEditKeyPress; end; end. [/code] |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
補充說明:
1. HikaruGo兄所列出的 forbidden 這個字原意應該是 .onkeypress, 是因為本站對一些 . on的字會當成保留字之類的, 而被轉換, 特此告知一下 2.有關 H兄的寫法, 另一個方式就是在每一個 Edit 的 onkeypress上寫 begin CommEditKeypress; end; 這樣也可以的 3.不過有一點不明, 你放在KeyPress的事件上是否恰當, KeyPress每按下一個按鍵就會成立執行, 不知你Edit 是要KeyPress做啥事? 是要判斷edit 不可以按下那些按鍵嗎? ===================引 用 lasterliu 文 章=================== 請問各位大大: 若有一個方法想應用在多個物件上,請問應如何達成。 如:有三個Edit(Edit1、Edit2與Edit3),想在其KeyPress事件中撰寫一段相同的程式,但又不想每個Edit都寫一次KeyPress事件(想以一個KeyPress事件就可以達成),請問有其他方法可以達成嗎? 小弟有個想法,但不知可不可以實現,就是在Form的KeyPress事件中,先判斷若有包含Edit這些元件(這裡不是全部的Edit元件,是部分而已)再進行動作,不知這想法是否可行,煩請各位大大指教一下小弟也請各位大大給小弟更好的想法與方向,謝謝。
編輯記錄
P.D. 重新編輯於 2009-04-02 12:12:20, 註解 無‧
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
不好意思,這麼久才回覆,一直測試還是不行,才想起我有詢問此問題的文章。
首先小弟碰到了兩個問題: 第一、就是如P.D大大所說的,小弟想要在這些欄位中進行判斷不可輸入哪些鍵值。 如: DBEdit3、DBEdit5與DBEdit8這三個欄位經過判斷後是屬於浮點數。 因為可能會有輸入錯誤的值(--9.9之類的),所以要做些預防。 但是因為每個名稱都不一樣,所以我程序中的程式在名稱上也會不同,如此一來,就無法以一條程序套在各個物件上使用了。 第二、就是小弟使用DBEdit,為什麼在一開始即給它的值,無法儲存進去DB中,都須有經過KEY IN這手續才行呢? 如: DBEdit3.field.text:='3'; OR DBEdit3.field.AsString:='3'; 若我直接儲存,則這個直就無法儲存進DB中。(但儲存過程依然是都OK的) 若我有進去此欄位進行修改,則可以儲存至DB中。 想請問各位大大,小弟應該怎麼做,才能在一開始給值,而不用再經過任何KEY IN即可儲存至DB中呢?? 若有任何描述不清的地方,請各位大大多多包含,小弟會盡快更正。 再次為太晚回覆跟各位大大說聲抱歉。
編輯記錄
lasterliu 重新編輯於 2009-04-08 16:19:48, 註解 無‧
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
===================引 用 lasterliu 文 章=================== 不好意思,這麼久才回覆,一直測試還是不行,才想起我有詢問此問題的文章。 首先小弟碰到了兩個問題: 第一、就是如P.D大大所說的,小弟想要在這些欄位中進行判斷不可輸入哪些鍵值。 如: DBEdit3、DBEdit5與DBEdit8這三個欄位經過判斷後是屬於浮點數。 因為可能會有輸入錯誤的值(--9.9之類的),所以要做些預防。 但是因為每個名稱都不一樣,所以我程序中的程式在名稱上也會不同,如此一來,就無法以一條程序套在各個物件上使用了。 // TObject Sender 可以強迫轉型為 TDBEdit, 然後用 TDBEdit 之 Name 或 TDBEdit 之 Field 之 Name 便可判斷. 第二、就是小弟使用DBEdit,為什麼在一開始即給它的值,無法儲存進去DB中,都須有經過KEY IN這手續才行呢? 如: DBEdit3.field.text:='3'; OR DBEdit3.field.AsString:='3'; 若我直接儲存,則這個直就無法儲存進DB中。(但儲存過程依然是都OK的) 若我有進去此欄位進行修改,則可以儲存至DB中。 想請問各位大大,小弟應該怎麼做,才能在一開始給值,而不用再經過任何KEY IN即可儲存至DB中呢?? // 在 TDataSet->State == dsInsert 或 == dsEdit 時, 於 AfterEdit 填值於 TDataSet (不是 TDBEdit) 之 Field 便可. 若有任何描述不清的地方,請各位大大多多包含,小弟會盡快更正。 再次為太晚回覆跟各位大大說聲抱歉。 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
1.關於第一項, 不管有幾個 dbedit , 我上面有提到, 你就是寫一支function或 procedure 來做這個判斷
function(xxx:string) , 這裡可以傳入值, 例如 function(dbedit3.text) , 再於你的function中判斷yes, no 回值回來在 dbedit3 的事件上, ok的話就過, 不ok就警告不過, 其實你對物件不熟, 那就不要硬用物件方式來做, 被迫陷入牛角尖中 2.關於第二項, dbedit 是與 db 直接連結的, 為什麼大家都要直接指定值給 dbedit呢? 直接把值指定給 db 的欄位上, dbedit 自然就會反應出初值, 這個做法真是脫褲子放屁! ===================引 用 lasterliu 文 章===================DBEdit3、DBEdit5與DBEdit8這三個欄位經過判斷後是屬於浮點數。 因為可能會有輸入錯誤的值(--9.9之類的),所以要做些預防。 但是因為每個名稱都不一樣,所以我程序中的程式在名稱上也會不同,如此一來,就無法以一條程序套在各個物件上使用了。 第二、就是小弟使用DBEdit,為什麼在一開始即給它的值,無法儲存進去DB中,都須有經過KEY IN這手續才行呢? 如: DBEdit3.field.text:='3'; OR DBEdit3.field.AsString:='3'; 若我直接儲存,則這個直就無法儲存進DB中。(但儲存過程依然是都OK的) 若我有進去此欄位進行修改,則可以儲存至DB中。 想請問各位大大,小弟應該怎麼做,才能在一開始給值,而不用再經過任何KEY IN即可儲存至DB中呢?? 若有任何描述不清的地方,請各位大大多多包含,小弟會盡快更正。 再次為太晚回覆跟各位大大說聲抱歉。 |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
謝謝herbert2與P.D大大的指教。
第一點對於各個物件的判斷,小弟知道該怎麼應用了,之前都沒有想到直接傳物件的值去函數或程序進行判斷。 另外P.D大大有提到不要應用物件方式來做,是大大有其他方法可以達成嗎,可以指點一下小弟嗎?謝謝。 第二點不能儲存的問題,小弟還是不明白,還煩請大大在跟小弟解說一下,大大所說的直接寫在DB的FIELD中或者DATESET的FIELD中, 是不是像小弟以下所舉例的程式碼: [code delphi] // first ADOQuery1.Fields.Fields[i-1].AsString:='1'; // second DataSource1.DataSet.Fields.Fields[i-1].AsString:='1'; [/code] 因為以上兩種方式小弟都有測試過,都依然不行耶,一開始帶1進去,明明欄位內都有顯示1,但儲存時卻都沒存進DB中,DB中的欄位都是NULL,所以想在煩請大大們跟小弟講解一下那邊有問題,謝謝。 P.S 在測試時,新增方式是以ADOQuery1.Append接著ADOQuery1.Post,沒做其他判斷。
編輯記錄
lasterliu 重新編輯於 2009-04-09 09:39:30, 註解 無‧
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
先清理一下概念。
第一: DBEdit, DBGrid 等东西,它们显示的值是来自它们连接的 DataSet 的。假设你的 DBEdit --> DataSource1 --> ClientDataSet1.Fields[2]。那么,你需要更改的是 ClientDataSet1.Fields[2] 的值,而不是 DBEdit 的值。这个 DBEdit 仅仅是用作给用户输入的界面。 第二: DataSet 是一个有多条 RECORD 的数据集合。你的 DBEdit 当前的值,是 DataSet 当前 RECORD 的值。如果 DataSet 当前没有 RECORD,你必须先 DataSet.Insert 插入一条新的 RECORD,然后才能对 DataSet 各个 Field 的值进行编辑;如果 DataSet 当前有记录,那你必须让 DataSet 进入编辑状态,也就是:DataSet.Edit ,然后才能编辑它的值。 第三: 如果那个 Field 是数字,你可以直接写: ClientDataSet1.Fields[2].AsInteger := 1; 没有必要写 Fields[2].AsString := '1'; ===================引 用 lasterliu 文 章=================== 謝謝herbert2與P.D大大的指教。 第一點對於各個物件的判斷,小弟知道該怎麼應用了,之前都沒有想到直接傳物件的值去函數或程序進行判斷。 另外P.D大大有提到不要應用物件方式來做,是大大有其他方法可以達成嗎,可以指點一下小弟嗎?謝謝。 第二點不能儲存的問題,小弟還是不明白,還煩請大大在跟小弟解說一下,大大所說的直接寫在DB的FIELD中或者DATESET的FIELD中, 是不是像小弟以下所舉例的程式碼: [code delphi] // first ADOQuery1.Fields.Fields[i-1].AsString:='1'; // second DataSource1.DataSet.Fields.Fields[i-1].AsString:='1'; [/code] 因為以上兩種方式小弟都有測試過,都依然不行耶,一開始帶1進去,明明欄位內都有顯示1,但儲存時卻都沒存進DB中,DB中的欄位都是NULL,所以想在煩請大大們跟小弟講解一下那邊有問題,謝謝。 P.S 在測試時,新增方式是以ADOQuery1.Append接著ADOQuery1.Post,沒做其他判斷。 |
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
先謝謝pcplayer99大大。
===================引 用 pcplayer99 文 章=================== 先清理一下概念。 第一: DBEdit, DBGrid 等东西,它们显示的值是来自它们连接的 DataSet 的。假设你的 DBEdit --> DataSource1 --> ClientDataSet1.Fields[2]。那么,你需要更改的是 ClientDataSet1.Fields[2] 的值,而不是 DBEdit 的值。这个 DBEdit 仅仅是用作给用户输入的界面。 第一點了解了^^,謝謝大大,小弟以後知道如何使用了。 第二: DataSet 是一个有多条 RECORD 的数据集合。你的 DBEdit 当前的值,是 DataSet 当前 RECORD 的值。如果 DataSet 当前没有 RECORD,你必须先 DataSet.Insert 插入一条新的 RECORD,然后才能对 DataSet 各个 Field 的值进行编辑;如果 DataSet 当前有记录,那你必须让 DataSet 进入编辑状态,也就是:DataSet.Edit ,然后才能编辑它的值。 第二點就不太清楚了,小弟沒有使用ClientDataSet1,只有用ADOConnection、ADOQuery、DataSource1及DBGrid1,小弟有先進行新增的動作(ADOQuery1.Append),進行編輯在ADOQuery1.Post可儲存紀錄,但問題是一開始用代的資料卻無法儲存起來!! 第三: 如果那个 Field 是数字,你可以直接写: ClientDataSet1.Fields[2].AsInteger := 1; 没有必要写 Fields[2].AsString := '1'; 了解^^ ===================引 用 lasterliu 文 章=================== 謝謝herbert2與P.D大大的指教。 第一點對於各個物件的判斷,小弟知道該怎麼應用了,之前都沒有想到直接傳物件的值去函數或程序進行判斷。 另外P.D大大有提到不要應用物件方式來做,是大大有其他方法可以達成嗎,可以指點一下小弟嗎?謝謝。 第二點不能儲存的問題,小弟還是不明白,還煩請大大在跟小弟解說一下,大大所說的直接寫在DB的FIELD中或者DATESET的FIELD中, 是不是像小弟以下所舉例的程式碼: [code delphi] // first ADOQuery1.Fields.Fields[i-1].AsString:='1'; // second DataSource1.DataSet.Fields.Fields[i-1].AsString:='1'; [/code] 因為以上兩種方式小弟都有測試過,都依然不行耶,一開始帶1進去,明明欄位內都有顯示1,但儲存時卻都沒存進DB中,DB中的欄位都是NULL,所以想在煩請大大們跟小弟講解一下那邊有問題,謝謝。 P.S 在測試時,新增方式是以ADOQuery1.Append接著ADOQuery1.Post,沒做其他判斷。
編輯記錄
lasterliu 重新編輯於 2009-04-09 15:48:26, 註解 無‧
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
各位大大,小弟發現問題所在了,但還是不知道原理@@?謝謝各位大大的指教~~
以下說明一下,讓各位參考一下我的例子: 小弟想在DataSource的Event(OnStateChange)中寫進當進入INSERT狀態時,可以將欄位型態是數字方面的欄位,都先帶初始值(0)進去。 但是這樣的話,好像在我新增時,帶進去的值都無法儲存起來,個人覺得很像pcplayer99大大,是不是我代初始值時,狀態尚未進入編輯狀態,所以才會造成這結果呢?(因為小弟後來測試在ADOQuery.Append;之後加上一條帶初始值的程式碼DataSource1.DataSet.Fields.Fields[2].AsInteger:=1;,就可以儲存耶,但這段若放在nStateChange,就不行喔!!)。以上是我的說明,若有需要修正的觀念,在煩請大大指點,小弟會盡快更正。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |