2011-09-21 1 views
3

Delphi에서 구현 된 GUI 인 Windows XP 임베디드 용 RadStudio2007을 상속받습니다. I는 다음과 같습니다 코드를 많이보고 있어요 : 내가 찾았어요Delphi ObjectPascal을 사용하는 Guis의 경우, (잠재적으로) 변경하기 전에 .Visible을 확인하는 것이 유용한 목적을 제공합니까?

procedure TStatusForm.Status_refresh; 

begin 
    if DataModel.CommStatus = COMM_OK then begin 
     if CommStatusOKImage.Visible<>True then CommStatusOKImage.Visible:=True; 
     if CommStatusErrorImage.Visible<>False then CommStatusErrorImage.Visible:=False; 
    end else begin 
     if CommStatusOKImage.Visible<>False then CommStatusOKImage.Visible:=False; 
     if CommStatusErrorImage.Visible<>True then CommStatusErrorImage.Visible:=True; 
    end; 
end 

을이 code sample on the Embarcadero site : 그것을 변경하기 전에 가시의 수표를 보여 주지만 무엇인지 아무런 설명이없는

procedure TForm1.ShowPaletteButtonClick(Sender: TObject); 
begin 
    if Form2.Visible = False then Form2.Visible := True; 
    Form2.BringToFront; 
end; 

그것을 먼저 점검함으로써 도움을 받았다.

procedure TStatusForm.Status_refresh; 

begin 
    CommStatusOKImage.Visible := DataModel.CommStatus = COMM_OK; 
    CommStatusErrorImage.Visible := not CommStatusOKImage.Visible; 
end 

가 있습니까 : 나는 원래 개발자 만 보이는 플래그를 설정하는 것이 변경할 수 있다면 그것이 필요하다고 느낀 이유를 이해하려고 노력하고, 그리고 그것을 대신이 방법을 코딩 선택하지 않은

내가 알고 있어야 할 성능 문제 또는 외관상의 문제 (예 : 화면 깜박임)가 있습니까?

+4

코드 줄로 수익을 올릴 경우 이점이있을 것이라고 상상해보십시오. –

+0

'Visible <> False', 진지하게? –

+0

@Downvoter - 예, 진지하게 :-(상속 된 코드의 기쁨입니다. 한숨. –

답변

8

Remy Lebeau가 말했듯이 Visible 설정자는 이미 새 값이 다른지 확인합니다. XE에서 예를 들어 는 TImage의, 눈에 보이는 실제로 상속 호출합니다 코드 할당을 위해 :

procedure TControl.SetVisible(Value: Boolean); 
begin 
    if FVisible <> Value then 
    begin 
    VisibleChanging; 
    FVisible := Value; 
    Perform(CM_VISIBLECHANGED, Ord(Value), 0); 
    RequestAlign; 
    end; 
end; 

그래서 그것을 확인의 어떤 혜택이 없습니다. 그러나 코드에 제 3 자 또는 희귀 한 구성 요소가 사용될 수 있습니다. 모든 구성 요소가 다를 수 있으므로 의심 스럽습니다.

편집기에서 "Find Declaration"컨텍스트 메뉴 항목 (또는 단순히 Ctrl + 클릭)을 사용하거나 "Debug dcus 사용"컴파일러 옵션이 켜져있는 VCL 코드를 사용하여 직접 조사 할 수 있습니다.

6

많은 속성과 마찬가지로 Visible 속성 설정자는 아무것도 수행하기 전에 새 값이 현재 값과 다른지 확인합니다. 현재 속성 값을 수동으로 확인할 필요가 없습니다.

0

글쎄, 필자는 의심 스럽지만 어쩌면 최신 델파이 버전의 폼에 문제가있을 수 있습니다. 가시성을 설정하기 전에 Visible 속성이 TCustomForm에 다시 선언되어 OnCreate 이벤트의 실행을 보장합니다. TControl.SetVisible 가상 아니기 때문에 그것은 기술적으로 오버라이드 (override)되어 있지 않은 경우,하지만 같은 결과가되어,

procedure TCustomForm.SetVisible(Value: Boolean); 
begin 
    if fsCreating in FFormState then 
    if Value then 
     Include(FFormState, fsVisible) else 
     Exclude(FFormState, fsVisible) 
    else 
    begin 
    if Value and (Visible <> Value) then SetWindowToMonitor; 
    inherited Visible := Value; 
    end; 
end; 

델파이 7이 구현은 수동으로 가시성을 확인해야하지만 최신 버전이 자신을 확인하지 않습니다.

또한 Larry Lustig의 의견에 동의합니다. 제공된 코드가 허용 된 구문을 증명하지 못하기 때문입니다.

procedure TForm1.ShowPaletteButtonClick(Sender: TObject); 
begin 
    if not Form2.Visible then Form2.Visible := True; 
    Form2.BringToFront; 
end; 
관련 문제