2011-10-01 90 views
3

我有一個包含16個TCheckBox和32個TEditBox的窗體。 每2個TEditBox en-ability取決於checkBox狀態。 所以我使用這個代碼太長:如何使用SENDER優化此代碼?

//T1 
procedure TOFAddForm.T1Click(Sender: TObject); 
begin 
    Q1.Enabled:=T1.Checked; 
    P1.Enabled:=T1.Checked; 
    Q1.OnChange(Sender); 
end; 

. 
. 
. 

//T16 
procedure TOFAddForm.T16Click(Sender: TObject); 
begin 
    Q16.Enabled:=T16.Checked; 
    P16.Enabled:=T16.Checked; 
    Q1.OnChange(Sender); 
end;` 

我用這個代碼,但沒有發生:

procedure TOFAddForm.T1Click(Sender: TObject); 
var Q, P: TEdit; 
begin 
    with Sender as TCheckBox do begin 
      Q.Name:='Q'+copy(Name,1,2); 
      P.Name:='P'+Copy(Name,1,2); 
      Q.Enabled:=Checked; 
      P.Enabled:=Checked; 
    end; 
    Q1.OnChange(Sender); 
end; 

謝謝。

回答

9

如果所有的複選框,編輯命名也是一致的,你可以在此OnClick事件添加到所有複選框:

procedure TOFAddForm.TClick(Sender: TObject); 
var 
    C: TCheckBox; 
    Q, P: TEdit; 
    N: string; 
begin 
    C := Sender as TCheckBox; 
    N := Copy(C.Name, 2, Length(C.Name)); 
    Q := FindComponent('Q' + N) as TEdit; 
    P := FindComponent('P' + N) as TEdit; 
    Q.Enabled := C.Checked; 
    P.Enabled := C.Checked; 
    Q.OnChange(Sender); 
end; 
+0

謝謝GolezTrol。 這就是我要找的。 –

+3

不要忘記接受答案,它會幫助他人,它會顯示你對GolezTrol的感激 – ComputerSaysNo

+1

你可以省略第二個參數複製,因爲默認是「到源的結尾」。除此之外:您的解決方案有效,但使用FindComponent總是讓我覺得骯髒。我通常會搜索一系列記錄,並使用索引的「Tag屬性」複選框。 (哎呀,雷米打敗了我)。不是「純」的。 – dummzeuch

3

我建議你TEdit指針存儲到一個數組,然後使用TCheckBox.Tag屬性作爲一個指標進入陣列,例如:

var 
    Edits: array[0..15, 0..1] of TEdit; 

procedure TOFAddForm.FormCreate(Sender: TObject); 
var 
    K: Integer; 
begin 
    for k := 0 to 15 do 
    begin 
    Edits[k, 0] := FindComponent('Q' + IntToStr(k+1)) as TEdit; 
    Edits[k, 1] := FindComponent('P' + IntToStr(k+1)) as TEdit; 
    (FindComponent('T' + IntToStr(k+1)) as TCheckBox).Tag := k; 
end; 

procedure TOFAddForm.T1Click(Sender: TObject); 
begin 
    with Sender as TCheckBox do 
    begin 
    Edits[Tag, 0].Enabled := Checked; 
    Edits[Tag, 1].Enabled := Checked; 
    Edits[Tag, 0].OnChange(Sender); 
    end; 
end; 
1

我強烈建議在這種情況下自己創建控件。在OnCreate事件處理程序中,調用TEdit.Create(Self),將對象引用存儲在您自己管理的數據結構中,例如一個動態數組,在您的對象引用集合(可選地取決於Tag的值)中設置像Parent,SetBounds,SetBounds和eventhandlers以及查找Sender這樣的屬性,這幾乎總是比使用FindComponent更高效。

增加的優點是你可以很容易地改變重複控件的數量(甚至在運行時使它變爲動態!)和dfm代碼(嵌入到最終的可執行文件中)包含的幾乎完全相同的重複數據。