2016-11-11 1 views
-2

양식이 사용 중이거나 유휴 상태임을 나타내는 사용/사용 안 함 컨트롤이있는 양식이 있습니다. 일부 프로세스를 중단하기 위해 비활성화 된 경우에만 하나의 컨트롤 (단추 일 수도 있지만 그 외에있을 수도 있음)을 활성화해야합니다. 버튼 캡션을 '중단'으로 변경합니다.컨트롤 캡션 찾기 및 상태 변경

버튼 A를 클릭하면 버튼 A의 캡션이 'ABORT'로 변경됩니다. 다른 모든 컨트롤을 사용할 수 없게되지만 'ABORT'캡션이있는 단추를 계속 사용할 수 있습니다.

procedure F1.FormBusy (sender); 
var 
    a: Integer; 
begin 
    for a := 0 to TabSheet1.ControlCount - 1 do 
    begin 
    TabSheet1.Controls[a].Enabled := False; 
    (* if TabSheet1.Controls[a] caption := 'ABORT' then 
     TabSheet1.Controls[a].Enabled := True 
     < how to do this ? *) 
    end; 
end; 

사용 예 :

procedure F1.LB1Click(sender: TObject); 
begin 
    FormBusy(sender); 
    try 
    // do something 
    finally 
    FormIdle(sender); 
    end; 
end; 
+0

@TomBrunberg 'TComboBox'클릭을 사용하는 경우가 있습니다. – Bianca

+1

컨트롤 참조를 직접 사용하지 않는 것이 가장 좋은 이유는 무엇입니까? –

+0

@DavidHeffernan @Owen 주어진 답변과 비슷합니까? 예, 이것은 저에게 새로운 것입니다. 그것은 잘 작동하고 있습니다. 그러나 formbusy와 formdile처럼 더 간단한 방법이 있습니까? – Bianca

답변

5

은 오히려 Caption 속성에 의해 버튼을 찾기 위해 노력보다, 왜 배열에서 직접 액세스 할?

for a := 0 to TabSheet1.ControlCount - 1 do 
begin 
    TabSheet1.Controls[a].Enabled := TabSheet1.Controls[a] = Button1; 
end; 

각 TControl은 사용할 수있는 Button1을 제외하고는 비활성화됩니다.

+0

FormBusy (발신자) 및 FormIdle (발신자)에 의해 내 양식이 통화 중/유휴 상태를 관리합니다. 이제 각 버튼에 코드를 삽입해야합니다. 맞습니까? – Bianca

+0

해당 코드는 FormBusy() 메서드 내부에 있으므로 양식을 "사용 중"상태로 전환하면 "ABORT"이외의 컨트롤은 사용할 수 없게됩니다. "유휴 상태"로 다시 이동할 때 적절한 컨트롤을 다시 사용하려면 FormIdle() 메서드에 코드를 추가해야합니다. – Owen

+0

잘 작동하고 있습니다, 오웬. 감사. 하지만 버튼이 많습니다. FormBusy()에 코드를 두는 방법은 무엇입니까? – Bianca

1

당신은 바쁜 매개 변수를 지정하는 다른 방법을 정의 할 수 있습니다

procedure F1.MAJIHM(const isBusy : Boolean); 
var a: Integer; 
begin 
    for a := 0 to TabSheet1.ControlCount - 1 do 
    begin 
    TabSheet1.Controls[a].Enabled := isBusy; 
    end; 
    btnABORT.enabled := not isBusy; 
end; 

procedure F1.FormBusy (sender); 
begin 
    MAJIHM(True); 
end; 

procedure F1.FormIdle (sender); 
begin 
    MAJIHM(False); 
end; 
0

당신은 말했다 :

내가 A 버튼을 클릭, 내가 'ABORT'에 버튼 A의 캡션을 변경합니다. 모두 다른 컨트롤을 사용할 수 없게되지만 캡션이 포함 된 단추가 필요합니다. 'ABORT'가 계속 사용됩니다. 당신은 단순히 모든 컨트롤을 가능하게하는 FormIdle() 함수에서

procedure F1.FormBusy(sender: TObject); 
var 
    a: Integer; 
begin 
    for a := 0 to TabSheet1.ControlCount - 1 do 
    TabSheet1.Controls[a].Enabled := TabSheet1.Controls[a] = sender; 
end; 

을 :

그리고 당신의 사용 예제는 당신이 sender 매개 변수로 참조 할 수 있습니다 어디 F1.FormBusy() 해당 버튼을 통과 할 것이 분명하다

.