pagecontrolでページからページへ移動するときに前のタブシートを確認する方法?
-
19-09-2019 - |
質問
私は、彼らが積み重ねられているように見える含むフレームを持って、その過程でさまざまな段階で異なるフレームを表示することで、ウィザードのいくつかの種類を構築するように隠されたTTabsheets'タブでは、TPageControlを使用しています。
問題は呼び出した後、ある "PageControl1.ActivePageIndex:= xを、"すなわち、かつて私は、私がここに来たかを知る必要があり、新たなフレームで、次のフレームを表示するには、どのフレームが以前に表示されていました。
他の誰かが、ウィザードを構築するためにpagecontrolでフレームを使用している場合、どのようにあなたは前/次のフレームを追跡するのですか?
ありがとうございます。
解決
は、TPageControlは、変更前に呼び出されOnChangingと呼ばれるイベントがあり、あなたはパラメータをfalseに設定することで、変更をキャンセルすることができます。
また、変更前にアクティブだった何ページ記録するには、このイベントを使用することができます。
私はしかし、として強くGUIコンポーネントに結合されていない何かを作ることをお勧めします。フレームを保持し、一方から他方へ変化するが、そうで許可されるべきかどうかをチェックするためのクラスのいくつかの種類が責任を作るにしてください。これは、それが簡単にあなたがウィザードを視覚化するために使用するGUIコントロールの種類を切り替えることになるだろう。そして、それは確かに、それははるかに簡単にあなたのウィザードでは、検証ルールがように強制している場合、あなたが、欲しいステップ・バイ・ステップの進行を与えるかどうかを確認するためにテストすることになるだろう。
他のヒント
delphi.about.comではどのようにする 品ですウィザードのようなユーザーインターフェースを作成します。あなたはページのセットを前後に移動するにはTPageControl.SelectNextPageメソッドを使用することができます。
ナットの答えに反して、tpagecontrol.onchanging
イベントはうまく動作します。
VCLフォームアプリケーションを作成し、TPageControl
にドロップし、alTopにプロパティを合わせ、以下のいくつかの余地を残す設定。 PageControlを右クリックし、それぞれのTabVisible:=false
を設定し、いくつかのページを追加します。今すぐ下のボタンのカップルを追加します。
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 @