■ PageControlの右端のタブを削除したときアクティブタブを右端にするには。
武田
2009/02/08(日) 18:28:23 <初心者> 
WindowsXP Delphi6personalです。
基本的なことですが解りません。
Pagecontrolで動的に複数のタブを作成し、右端のタブを削除すると
左端の0番のタブがアクティブになります。
途中のタブを削除するとアクティブ番号が同じタブをアクティブにします。
仕様だと思いますが、右端のタブを削除したら次にやはり右端のタブを
アクティブにしたいので
PageControl1.ActivePageIndex:=PageControl1.PageCount-1;
で強制的に戻していますが、
リソースの残りが少なかったりタブを削除するのに少し時間のかかるような
コントロールなどを貼り付けて動きが重いときは、
はっきり、いったん0番をアクティブにしてから
右端をアクティブにするのが目に見えます。(画面の揺らぎの原因にもなります)
途中のタブを削除したときのようにスムースにする方法があるでしょうか。
下記はボタンと2個とPageControlを貼り付けただけのテストコードです。
//新規ページ作成
procedure TForm1.Button1Click(Sender: TObject);
begin
with TTabSheet.Create(PageControl1) do
begin
PageControl := PageControl1;
Name := 'ts' + inttostr(Form1.PageControl1.PageCount);
Caption := inttostr(Form1.PageControl1.PageCount);
end;
end;
//タブの削除(右端のタブを削除すると左端のタブがアクティブになる)
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
i:=PageControl1.ActivePageIndex;
PageControl1.Pages[i].Free;
//PageControl1.ActivePageIndex:=PageControl1.PageCount-1;//強制的に右端に戻す
end;
para
2009/02/08(日) 20:43:10
先に右端-1をアクティブにしてから右端を削除するのではだめなんでしょうか。
武田
2009/02/09(月) 01:10:21
[[解決]]
paraさん早速レス有り難うございました。
実際のプログラムでは、そのようにしています。
それが今のところ一番揺れが少ないです。
しかし、一瞬ですがやはり0番がアクティブになるようです。
何かプロパティでできないかと考えたりしたのですが。
有り難うございました。
monaa
2009/02/09(月) 02:34:14
パッと思いつく方法だと、こんな方法があります。
探せば他にもあるかもしれません。
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
LockWindowUpdate(PageControl1.Handle);
i:=PageControl1.ActivePageIndex;
PageControl1.Pages[i].Free;
if (i= PageControl1.PageCount) and (i<>0) then
PageControl1.ActivePageIndex:=i-1;//強制的に右端に戻す
LockWindowUpdate(0);
end;
武田
2009/02/10(火) 21:44:57 <初心者> 
[[解決]]
monnaさん、有り難うございました。
うまくいきました。
その後、どうしても解決しないので
何かヒントはないかと再びここを訪れたらコメントをいただいていて
どんぴしゃりでした。感謝します。
たぶんSleipnirもこのようにしているのでは?と思いました。
また教えてください。
2009/02/11(水) 11:37:13
もし、VCLのソースがあれば、ComCtrls.pasの
procedure TPageControl.RemovePage(Page: TTabSheet);
var
NextSheet: TTabSheet;
begin
NextSheet := FindNextPage(Page, True, not (csDesigning in ComponentState));
if NextSheet = Page then NextSheet := nil;
if PageCount > 1 then
if ActivePage = Pages[PageCount-1] then NextSheet := Pages[PageCount-1] else NextSheet := Page;
Page.SetTabShowing(False);
Page.FPageControl := nil;
FPages.Remove(Page);
SetActivePage(NextSheet);
end;
ここの最初の行を、
NextSheet := FindNextPage(Page, False{not(Pages[PageCount-1]=Page)}{True}, not (csDesigning in ComponentState));
とかに書き換えれば、思いのまま自由に動作に変えられるけど、
あ...ソースのないD6Personalじゃ無理か...
毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!
