2011-10-01 5 views
3

16 TCheckBox 및 32 TEditBox가 포함 된 양식이 있습니다. 두 개의 TEditBox 실행 기능은 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

을 나는 당신이 인덱스로 TCheckBox.Tag 속성을 사용하여 다음 배열에 TEdit 포인터를 저장하고 제안 예 :

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)으로 호출하고 직접 관리하는 데이터 구조에 객체 참조를 저장합니다. 동적 배열을 사용하고 Parent, SetBounds 및 이벤트 처리기와 같은 속성을 설정하고 객체 참조 모음에서 Tag의 값에 따라 선택적으로 Sender을 조회하면 FindComponent을 사용하는 것보다 거의 항상 더 효과적입니다.

반복 컨트롤의 수를 쉽게 변경할 수 있습니다 (실행시 동적으로 만들 수도 있습니다!). 그리고 dfm 코드 (최종 실행 파일에 포함됨)는 반복되는 데이터가 거의 동일하지 않습니다.

관련 문제