ONClick 後,取得完整的輸入物件名稱及寫共用函式 |
答題得分者是:P.D.
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
如畫面所示,僅列出 4 戶, 住戶可能有幾百戶
每一住戶就是一組,有 CHECK_BOX 及 3 個 EDIT 當點選 "參加" 的 CHECK_BOX 時,後面的三組輸入 EDIT 欄位才會顯示, 若沒點選,後面的三組輸入 EDIT 欄位就隱藏. CHECK_BOX 的欄位名稱 CHECK_BOX001,CHECK_BOX002,CHECK_BOX003......等 EDIT 的欄位名稱 EDIT_A001,EDIT_B001,EDIT_C001, EDIT_A002,EDIT_B002,EDIT_C002, EDIT_A003,EDIT_B003,EDIT_C003,..........等 當 CHECK_BOX 點選後,觸發 OnClick 事件,每一個 CHECK_BOX 都有自己的事件,要寫很多程式碼,沒完沒了 以下是 CHECK_BOX001 的範例 procedure TFORM1.CheckBox001Click(Sender: TObject); begin if Check_Box001.Checked then begin EDIT_B001.Visible := true; EDIT_A001.Visible := false; EDIT_C001.Visible := false; end; // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 問題: 是否有可能寫一個共用 OnClick事件(假設是 MyAAAClick ), 可識別那一個 CHECK_BOXnnn 所觸發,然後針對 該 CHECK_BOXnnn 及 相對應的 EDIT_Annn/ EDIT_Bnnn /EDIT_Cnnn 做輸入控制 // 例如: 共用 OnClick 事件 procedure TFORM1.MyAAAClick(Sender: TObject); var nnn : integer; // 對照第幾個輸入 cbName := .Components...( .... ); ..Components..['EDIT_A' sss].Visible := true; ..Components..['EDIT_C' sss].Visible := true; ..Components..['EDIT_A' sss].Visible := false; ..Components..['EDIT_C' sss].Visible := false; SENDER.ClassParent.QualifiedClassName; SENDER.ClassParent.UnitScope; Components[ ComponentIndex ].Name .......等, 就是無法取得,正在輸入的 Check_Box 名稱.
------
--------------------------------------- 偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩. 編輯記錄
ANDY8C 重新編輯於 2012-06-21 11:42:32, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我沒有做太多的修飾, 時間不夠 , 這只是一個sample, 可以延伸很多想法
[code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure CheckBox1Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); private { Private declarations } myedit: TEdit; procedure changeEdit(checking: boolean; editno: string); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.changeEdit(checking: boolean; editno: string); begin myedit:= TEdit(self.FindComponent('Edit' editno)); if myedit <> nil then myedit.Visible:= checking; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin changeEdit(CheckBox1.Checked, '1'); end; procedure TForm1.CheckBox2Click(Sender: TObject); begin changeEdit(CheckBox2.Checked, '2'); end; end. [/code] |
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
剛看一下 PO 的原文
明明是 ......共用 OnClick 事件 但網頁自己卻顯示 ....共用 forbidden 事件( forbidden 取代好幾個 OnClick 進入編輯模式,它又顯示 OnClick 這樣算正常嗎 ???
------
--------------------------------------- 偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
編輯記錄
ANDY8C 重新編輯於 2012-06-21 11:39:46, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
再給你進階版, 因為我在撞牆期, 所以時間多多, 這個絕對是你要的, Trust me, you can make it!
[code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure CheckBox1Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); procedure CheckBox3Click(Sender: TObject); private { Private declarations } mcheck: TCheckBox; myedit: TEdit; procedure changeEdit; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.changeEdit; var chkno: string; begin chkno:= Form1.Components[ActiveControl.componentIndex].Name; Delete(chkno,1,8); myedit:= TEdit(self.FindComponent('Edit' chkno)); mcheck:= TCheckBox(self.Findcomponent('CheckBox' chkno)); if myedit <> nil then myedit.Visible:= mcheck.Checked; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin changeEdit; end; procedure TForm1.CheckBox2Click(Sender: TObject); begin changeEdit; end; procedure TForm1.CheckBox3Click(Sender: TObject); begin changeEdit; end; end. [/code] 請改用 O n C l i c k (每個字空一格, 不要用全形) ===================引 用 ANDY8C 文 章=================== 剛看一下 PO 的原文 明明是 ......共用 OnClick 事件 但網頁自己卻顯示 ....共用 forbidden 事件( forbidden 取代好幾個 OnClick 進入編輯模式,它又顯示 OnClick 這樣算正常嗎 ???
編輯記錄
P.D. 重新編輯於 2012-06-21 11:47:31, 註解 無‧
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
PD 大大, 這就是我要的, 您真是太強了,
在您 "五七" 的階段,還如此打擾您,真的太感恩了 雖然您的問題,小弟幫不上忙,相信您一定能如寫程式般, 找到最適的答案. PS. O n C l i c k 改用 全形,是要避開 forbidden 聞題, 用空格也是不錯的解法. 謝謝您. ===================引 用 P.D. 文 章=================== 再給你進階版, 因為我在撞牆期, 所以時間多多, 這個絕對是你要的, Trust me, you can make it! [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure CheckBox1Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); procedure CheckBox3Click(Sender: TObject); private { Private declarations } mcheck: TCheckBox; myedit: TEdit; procedure changeEdit; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.changeEdit; var chkno: string; begin chkno:= Form1.Components[ActiveControl.componentIndex].Name; Delete(chkno,1,8); myedit:= TEdit(self.FindComponent('Edit' chkno)); mcheck:= TCheckBox(self.Findcomponent('CheckBox' chkno)); if myedit <> nil then myedit.Visible:= mcheck.Checked; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin changeEdit; end; procedure TForm1.CheckBox2Click(Sender: TObject); begin changeEdit; end; procedure TForm1.CheckBox3Click(Sender: TObject); begin changeEdit; end; end. [/code] 請改用 O n C l i c k (每個字空一格, 不要用全形) ===================引 用 ANDY8C 文 章=================== 剛看一下 PO 的原文 明明是 ......共用 OnClick 事件 但網頁自己卻顯示 ....共用 forbidden 事件( forbidden 取代好幾個 OnClick 進入編輯模式,它又顯示 OnClick 這樣算正常嗎 ???
------
--------------------------------------- 偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩. |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
|
senso
高階會員 發表:5 回覆:126 積分:226 註冊:2003-11-27 發送簡訊給我 |
用c++寫..delphi不熟~
[code cpp] //loop Create TCheckBox,Create TEdit,略.. myechkbox->ONCLICK = MyCheckBoxClick(Sender); //end loop void __fasetcall MyCheckBoxClick(TObject *Sender) { AnsiString chkboxName = ((TComponent*)Sender)->Name; //接下來參考P.D.大 ^_^ //set Visible } [/code] ===================引 用 ANDY8C 文 章=================== PD 感恩, 這是一個好方法, 但我想是否還有更 "懶" 及 "環保" 的寫法 不然幾百個 CHECK_BOX ,程式碼是有點長. 謝謝您 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
既然有這麼多相同物件的需求,那麼包成一個 class,或是使用 Frame 來處理應該是一個好方法 [code delphi] interface TRoomPanel = class(TPanel) private Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; CheckBox1: TCheckBox; procedure CheckBoxClick(Sender: TObject); function GetChecked: boolean; function GetText(const index: integer): string; procedure SetChecked(const Value: boolean); procedure SetText(const index: integer; const Value: string); public constructor Create(AOwner: TComponent); override; property Text1: string index 1 read GetText write SetText; property Text2: string index 2 read GetText write SetText; property Text3: string index 3 read GetText write SetText; property Checked: boolean read GetChecked write SetChecked; end; implementation { TRoomPanel } procedure TRoomPanel.CheckBoxClick(Sender: TObject); begin Edit1.Enabled := CheckBox1.Checked; Edit2.Enabled := CheckBox1.Checked; Edit3.Enabled := CheckBox1.Checked; end; constructor TRoomPanel.Create(AOwner: TComponent); begin inherited; Font.Name := 'Tahoma'; Font.Size := 10; Width := 120; Height := 120; Edit1 := TEdit.Create(Self); with Edit1 do begin Name := 'Edit1'; Parent := Self; Left := 10; Top := 10; Width := 100; Text := ''; Enabled := False; end; Edit2 := TEdit.Create(Self); with Edit2 do begin Name := 'Edit2'; Parent := Self; Left := 10; Top := Edit1.Top Edit1.Height 5; Width := 100; Text := ''; Enabled := False; end; Edit3 := TEdit.Create(Self); with Edit3 do begin Name := 'Edit3'; Parent := Self; Left := 10; Top := Edit2.Top Edit2.Height 5; Width := 100; Text := ''; Enabled := False; end; CheckBox1 := TCheckBox.Create(Self); with CheckBox1 do begin Name := 'CheckBox1'; Parent := Self; Left := 10; Top := Edit3.Top Edit3.Height 8; Width := 100; Caption := '使用中'; OnClick := CheckBoxClick; Checked := False; end; end; function TRoomPanel.GetChecked: boolean; begin Result := Checkbox1.Checked; end; function TRoomPanel.GetText(const index: integer): string; begin case index of 1: Result := Edit1.Text; 2: Result := Edit2.Text; 3: Result := Edit3.Text; end; end; procedure TRoomPanel.SetChecked(const Value: boolean); begin Checkbox1.Checked := Value; end; procedure TRoomPanel.SetText(const index: integer; const Value: string); begin case index of 1: Edit1.Text := Value; 2: Edit2.Text := Value; 3: Edit3.Text := Value; end; end; [/code] 使用例: [code delphi] interface TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private RoomPanels: Array[0..9] of TRoomPanel; public end; implementation procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin for i := Low(RoomPanels) to High(RoomPanels) do begin RoomPanels[i] := TRoomPanel.Create(Self); with RoomPanels[i] do begin Parent := Self; Left := (i mod 5) * Width; // 一列 5 個 Top := (i div 5) * Height; end; end; end; [/code] <embed width="0" hidden="true" height="0" type="application/lingoes-npruntime-capture-word-plugin" id="lingoes_plugin_object"></embed>
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |