2009-08-22 11 views
2

Tage 시트의 탭이 숨겨진 상태로 TPageControl을 사용하여 포함 된 프레임을 쌓아 놓은 것처럼 보이게하고 프로세스의 다른 단계에서 다른 프레임을 표시하여 일종의 마법사를 만듭니다.페이지 컨트롤에서 페이지간에 이동할 때 이전 탭 시트를 확인하는 방법은 무엇입니까?

"PageControl1.ActivePageIndex : = x;"호출 후 문제가 발생합니다. 다음 프레임을 표시하려면 새 프레임에 한 번 내가 여기에 어떻게 도착했는지, 즉 어떤 프레임이 이전에 표시되었는지를 알아야합니다.

다른 사람이 pagecontrol에서 프레임을 사용하여 마법사를 만든 경우 이전/다음 프레임을 어떻게 추적합니까?

감사합니다.

+0

필드에 이전 페이지 색인의 값을 저장할 수 없습니까? – idursun

+0

이 질문은 실제로 프레임과 관련이 없습니다. 그것들은 당신이 탭 시트에 가지고있는 구성 요소 일뿐입니다. 당신이 요구하는 것은 pagecontrol이며 페이지 변경 후 어떤 탭 시트가 이전에 활성화되었는지 기록하는 것입니다. onchanging 이벤트는 당신이 원하는 것입니다. – Argalatyr

+0

제목과 텍스트가 이전에 작성한 의견을 반영하도록 편집 됨 – Argalatyr

답변

5

TPageControl에는 변경 전에 호출되는 OnChanging이라는 이벤트가 있으며 매개 변수를 false로 설정하여 변경 내용을 취소 할 수 있습니다.

또한이 이벤트를 사용하여 변경 이전에 활성화 된 페이지를 기록 할 수 있습니다.

나는 gui 구성 요소와 강력하게 결합되지 않은 것을 만들 것을 권장합니다. 프레임을 유지하고 하나에서 다른 것으로 변경하는 것이 허용되어야하는지 등을 확인하는 일종의 클래스를 만들도록하십시오. 이렇게하면 마법사를 시각화하는 데 사용할 GUI 컨트롤 유형을 쉽게 전환 할 수 있습니다. 또한 유효성 검사 규칙이 적용되는 경우 마법사가 원하는 단계별 진행을 제공하는지 테스트하기가 훨씬 쉬워집니다.

+0

실제로 페이지에 대해 TabVisible 속성을 false로 설정하면 OnChanging 이벤트가 호출되지 않습니다. (페이지 * – Nat

+0

@Nat가 아닌 * 탭 *과 관련되어 있으므로 주석은 특정 메서드 변경에만 적용됩니다. activepage.이 질문에 대한 답변에 나와있는 것처럼 tabvisible = false를 사용하여 _does_ fire를 OnChange하십시오. – Argalatyr

1

delphi.about.com에서 마법사와 비슷한 사용자 인터페이스를 만드는 방법은 article입니다. TPageControl.SelectNextPage 메서드를 사용하면 일련의 페이지를 앞뒤로 이동할 수 있습니다.

0

JEDI VCL 라이브러리의 일부인 마법사 구성 요소를 살펴볼 수도 있습니다.

0

나는 당신의 노력과 거의 같은 wizard framework을 작성했습니다. 대부분은 내 blog에 문서화되어 있습니다. 내가 사용한 솔루션은 다음/이전 페이지에 대한 요청을 프레임 자체 (인터페이스 사용)로 푸시하고 프레임이 다음 프레임이 무엇인지 결정하도록했습니다.

tPageControl을 그대로 유지하면서 두 아이디어를 병합하려면 tPageControl.ActivePage로 요청을 라우팅하면되고 NavigateToPage를 구현하면 시도하지 않고 명명 된 페이지를 조회 할 수 있습니다 특정 클래스를 찾으려면.

내 마법사 프레임 워크의 디자인은 길을 따라 결정된 여러 경로를 포함하는 몇 가지 복잡한 마법사를 처리하는 것이 었습니다. 이전 프레임을 목록에 저장하고 각 프레임의 "상태"는 마법사가 완료/취소 된 후 지워진 전체 액세스 가능 클래스에 저장되었습니다.

0

이전 페이지 색인을 수동으로 추적해야합니다. 다음과 같이 보일 것이다

procedure TWizardForm.NextClick(ASender: TObject); 
begin 
    SwitchPage(True); 
end; 

procedure TWizardForm.PreviousClick(ASender: TObject); 
begin 
    SwitchPage(False); 
end; 

SwitchPage을() :

procedure TWizardForm.SwitchPage(AForward: boolean); 
var 
    LGotoPage: integer; 
begin 
    LGotoPage := PageControl.ActivePageIndex; 

    if AForward and (PageControl.ActivePageIndex < PageControl.PageCount) then 
    inc(LGotoPage) 
    else if PageControl.PageIndex > 0 then 
    dec(LGotoPage); 

    if (LGotoPage <> PageControl.ActivePageIndex) 
    and AllowSwitchFrom(ActivePageIndex) then 
    begin 
    FPreviousPage := PageControl.ActivePageIndex; 
    PageControl.ActivePageIndex := LGotoPage; 
    end; 

end; 

또는 그 효과에 뭔가 예를 들어, 다음 및 이전 단추의 OnClick 이벤트 핸들러에서, 당신이 뭔가를 할 수 있습니다.:)

편집 : 마법사가 순차적 인 순서로 이동하려는 경우 Argalatyr이 정확하고 잘못된 경우입니다. 여기서 가정합니다.

OnChanging 처리기가 실제로 실행되며 사용자가 보낸 페이지가 활성 페이지 (여전히)입니다.

예제에서와 같이 페이지 인덱스를 직접 설정하면 OnChanging 이벤트가 발생하지 않으므로 이전 페이지 인덱스를 추적해야합니다. 이는 옵션 페이지 (순차적이지 않은)로 마법사를 코딩 할 때 발생합니다.

내가 게시하기 전에 좀 더 잘 확인 했어야합니다. 오답에 대한 사과. 정렬을 VCL이 형성 응용 프로그램을 만듭니다

을하고 설정하는 TPageControl에 드롭 :

N 당신이 페이지를 변경하는 올바른 방법을 사용하는 경우

+0

내 대답을 참조하십시오. – Argalatyr

1

은 냇의 대답 반대로, tpagecontrol.onchanging 이벤트가 잘 작동합니다 @ 속성을 아래쪽으로두고 일부 방을 남겨 둡니다. PageControl을 마우스 오른쪽 버튼으로 클릭하고 각각에 대해 TabVisible:=false을 설정하여 일부 페이지를 추가하십시오. 이제 아래에 몇 개의 버튼을 추가하십시오. 아래 각각의 코드에의 PageControl의 onchanging 이벤트를 부착하고 버튼 'onclick 이벤트 : (BDS2006, RAD2009) 예상대로이 작동

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if PageControl1.ActivePageIndex < PageControl1.PageCount - 1 then 
    PageControl1.SelectNextPage(true, false); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    if PageControl1.ActivePageIndex > 0 then 
    PageControl1.SelectNextPage(false, false); 
end; 

procedure TForm1.PageControl1Changing(Sender: TObject; 
    var AllowChange: Boolean); 
begin 
    showmessage(format('now leaving page number %d', [PageControl1.ActivePageIndex])); 
end; 

합니다.

+0

분명히 OnChange 이벤트를 후킹하여 사용할 수 있습니다. – Argalatyr