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

ONClick 後,取得完整的輸入物件名稱及寫共用函式

答題得分者是:P.D.
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-06-21 20:55:45 IP:210.66.xxx.xxx 未訂閱
 如畫面所示,僅列出 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-06-22 00:54:18 IP:118.160.xxx.xxx 未訂閱
我沒有做太多的修飾, 時間不夠  , 這只是一個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]

編輯記錄
P.D. 重新編輯於 2012-06-21 10:55:14, 註解 無‧
P.D. 重新編輯於 2012-06-21 10:56:29, 註解 無‧
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-06-22 01:32:09 IP:210.66.xxx.xxx 未訂閱
PD 感恩, 這是一個好方法, 

但我想是否還有更 "懶" 及 "環保" 的寫法

不然幾百個 CHECK_BOX ,程式碼是有點長.

謝謝您
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-06-22 01:37:33 IP:210.66.xxx.xxx 未訂閱
 剛看一下 PO 的原文
明明是 ......共用 OnClick 事件
但網頁自己卻顯示 ....共用 forbidden 事件(
forbidden 取代好幾個 OnClick
進入編輯模式,它又顯示 OnClick
這樣算正常嗎 ???
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
編輯記錄
ANDY8C 重新編輯於 2012-06-21 11:39:46, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-06-22 01:45:29 IP:118.160.xxx.xxx 未訂閱
再給你進階版, 因為我在撞牆期, 所以時間多多, 這個絕對是你要的, 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-06-22 06:56:42 IP:210.66.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-06-22 07:02:17 IP:111.240.xxx.xxx 訂閱
轉個型會更簡潔

TCheckBox(Sender).Name
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-06-22 08:32:44 IP:210.66.xxx.xxx 未訂閱
贊 1
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-06-22 10:38:17 IP:210.71.xxx.xxx 訂閱
用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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-06-26 07:56:32 IP:114.35.xxx.xxx 訂閱
既然有這麼多相同物件的需求,那麼包成一個 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/
編輯記錄
sryang 重新編輯於 2012-06-25 19:01:19, 註解 無‧
sryang 重新編輯於 2012-06-25 19:01:47, 註解 無‧
sryang 重新編輯於 2012-06-25 19:04:53, 註解 無‧
sryang 重新編輯於 2012-06-25 19:06:43, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-06-26 09:36:03 IP:118.160.xxx.xxx 未訂閱
對於如何創建一個class出來, 我始終是知道的不多, 這一篇範例, 提出了完整如何自建一個class出來, 相當不錯的內容, 感恩~~~
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2012-06-26 10:10:41 IP:210.66.xxx.xxx 未訂閱
 聰明的人還是很多,各位就是
感謝
P.D. , LEVEON ,SENSO, SRYANG
的無私
謝謝各位
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
系統時間:2024-04-24 16:44:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!