pagecontrolでページからページへ移動するときに前のタブシートを確認する方法?

StackOverflow https://stackoverflow.com/questions/1316974

質問

私は、彼らが積み重ねられているように見える含むフレームを持って、その過程でさまざまな段階で異なるフレームを表示することで、ウィザードのいくつかの種類を構築するように隠されたTTabsheets'タブでは、TPageControlを使用しています。

問題は呼び出した後、ある "PageControl1.ActivePageIndex:= xを、"すなわち、かつて私は、私がここに来たかを知る必要があり、新たなフレームで、次のフレームを表示するには、どのフレームが以前に表示されていました。

他の誰かが、ウィザードを構築するためにpagecontrolでフレームを使用している場合、どのようにあなたは前/次のフレームを追跡するのですか?

ありがとうございます。

役に立ちましたか?

解決

は、TPageControlは、変更前に呼び出されOnChangingと呼ばれるイベントがあり、あなたはパラメータをfalseに設定することで、変更をキャンセルすることができます。

また、変更前にアクティブだった何ページ記録するには、このイベントを使用することができます。

私はしかし、として強くGUIコンポーネントに結合されていない何かを作ることをお勧めします。フレームを保持し、一方から他方へ変化するが、そうで許可されるべきかどうかをチェックするためのクラスのいくつかの種類が責任を作るにしてください。これは、それが簡単にあなたがウィザードを視覚化するために使用するGUIコントロールの種類を切り替えることになるだろう。そして、それは確かに、それははるかに簡単にあなたのウィザードでは、検証ルールがように強制している場合、あなたが、欲しいステップ・バイ・ステップの進行を与えるかどうかを確認するためにテストすることになるだろう。

他のヒント

あなたがページを変更するには、右の方法を使用している場合、

ナットの答えに反して、tpagecontrol.onchangingイベントはうまく動作します。

VCLフォームアプリケーションを作成し、TPageControlにドロップし、alTopにプロパティを合わせ、以下のいくつかの余地を残す設定。 PageControlを右クリックし、それぞれのTabVisible:=falseを設定し、いくつかのページを追加します。今すぐ下のボタンのカップルを追加します。

:下記のそれぞれのコードに、PageControlのonchangingイベントを取り付け、ボタンのonclickイベント
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;
(BDS2006、RAD2009)予想通り

これは動作します。

また、JEDI VCLライブラリの一部だウィザードのコンポーネントを見てみたいことがあります。

私はあなたがやろうと、ほとんど何をウィザードフレームワークを書かれています。それのほとんどは私のブログの上で文書化されています。私が使用される溶液は、(インターフェースを使用して)、フレーム自体に次/前のページのためのリクエストをプッシュすることで、フレームが次のフレームがどうあるべきかを決定させます。

あなたは(あるとして、あなたは、TPageControlを維持)2つのアイデアをマージしたい場合は、

、あなただけのルートtPageControl.ActivePageにリクエストをすることができ、かつNavigateToPageの実施のためにあなたがむしろへの試みよりも、命名したページへの検索を行うことができます特定のクラスを見つけます。

私のウィザードフレームワークの設計は、道に沿って行われた決定に基づいて、複数のパスが含まれていくつかの複雑なウィザードを処理することでした。私は、リスト内の前のフレームを格納し、各フレームの「状態」ウィザードがキャンセル/終了後にクリアされたグローバルにアクセス可能なクラスに格納されていました。

あなたは手動で、前のページのインデックスを追跡する必要があります。たとえば、あなたの次と前のボタンのOnClickイベントハンドラでは、あなたはこのような何かを行うことができます:

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;

か、その効果に何か。 :)

編集のArgalatyrが正しい、と私はあなたが私は場合はここにあると仮定します順番にウィザードを介して、移動したい場合には、間違っています。

OnChangingハンドラは実際に火、あなたは(まだ)からアクティブなページをされて来ているページを行います。

あなたは私の例のように、直接ページインデックスを設定するときに、古いページインデックスを追跡する必要がありますので、

OnChangingイベントは、発生しません。これはオプションのページ(連続していない)で、ウィザードを起動コーディングから来ています。

私は投稿する前に

私は少し良くチェックしているはずです。不正解のためAppologiesます。

N @

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top