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

多個物件如何應用同一個方法

答題得分者是:herbert2
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-01 15:40:45 IP:60.251.xxx.xxx 訂閱
請問各位大大:
若有一個方法想應用在多個物件上,請問應如何達成。
如:有三個Edit(Edit1、Edit2與Edit3),想在其KeyPress事件中撰寫一段相同的程式,但又不想每個Edit都寫一次KeyPress事件(想以一個KeyPress事件就可以達成),請問有其他方法可以達成嗎?
小弟有個想法,但不知可不可以實現,就是在Form的KeyPress事件中,先判斷若有包含Edit這些元件(這裡不是全部的Edit元件,是部分而已)再進行動作,不知這想法是否可行,煩請各位大大指教一下小弟也請各位大大給小弟更好的想法與方向,謝謝。
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-01 16:00:22 IP:59.112.xxx.xxx 訂閱
在Edit1.KeyPress 事件裏寫好後, 點選Edit2,Edit3 從event 頁中把Edit2,3的KeyPress設定成 Edit1KeyPress 就可以

------
額有朝天骨,眼中有靈光
HikaruGo
中階會員


發表:22
回覆:69
積分:88
註冊:2007-12-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-01 16:25:56 IP:61.62.xxx.xxx 訂閱
另一參考
用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. CommEditKeyPress;
Edit2. CommEditKeyPress;
Edit3. CommEditKeyPress;

end;
end.


[/code]
P.D.
版主


發表:571
回覆:3887
積分:3677
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-02 12:11:37 IP:61.67.xxx.xxx 未訂閱
補充說明:
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-08 16:08:03 IP:60.251.xxx.xxx 訂閱
不好意思,這麼久才回覆,一直測試還是不行,才想起我有詢問此問題的文章。
首先小弟碰到了兩個問題:
第一、就是如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
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-08 23:40:22 IP:211.72.xxx.xxx 訂閱

===================引 用 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.
版主


發表:571
回覆:3887
積分:3677
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-09 00:11:53 IP:61.67.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-09 08:55:49 IP:60.251.xxx.xxx 訂閱
謝謝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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-09 09:36:44 IP:60.251.xxx.xxx 訂閱
不好意思,多PO了一篇,SORRY
編輯記錄
lasterliu 重新編輯於 2009-04-09 11:20:30, 註解 無‧
lasterliu 重新編輯於 2009-04-09 11:21:43, 註解 無‧
pcplayer99
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-04-09 13:48:05 IP:116.24.xxx.xxx 訂閱
先清理一下概念。

第一:
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-04-09 15:45:40 IP:60.251.xxx.xxx 訂閱
先謝謝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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-04-09 15:58:24 IP:60.251.xxx.xxx 訂閱
各位大大,小弟發現問題所在了,但還是不知道原理@@?謝謝各位大大的指教~~

以下說明一下,讓各位參考一下我的例子:
小弟想在DataSource的Event(OnStateChange)中寫進當進入INSERT狀態時,可以將欄位型態是數字方面的欄位,都先帶初始值(0)進去。
但是這樣的話,好像在我新增時,帶進去的值都無法儲存起來,個人覺得很像pcplayer99大大,是不是我代初始值時,狀態尚未進入編輯狀態,所以才會造成這結果呢?(因為小弟後來測試在ADOQuery.Append;之後加上一條帶初始值的程式碼DataSource1.DataSet.Fields.Fields[2].AsInteger:=1;,就可以儲存耶,但這段若放在nStateChange,就不行喔!!)。以上是我的說明,若有需要修正的觀念,在煩請大大指點,小弟會盡快更正。
系統時間:2017-12-12 12:17:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!