PageControlの右端のタブを削除したときアクティブタブを右端にするには。

解決


武田  2009-02-09 03:28:23  No: 33293

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-09 05:43:10  No: 33294

先に右端-1をアクティブにしてから右端を削除するのではだめなんでしょうか。


武田  2009-02-09 10:10:21  No: 33295

paraさん早速レス有り難うございました。
実際のプログラムでは、そのようにしています。
それが今のところ一番揺れが少ないです。
しかし、一瞬ですがやはり0番がアクティブになるようです。
何かプロパティでできないかと考えたりしたのですが。
有り難うございました。


monaa  2009-02-09 11:34:14  No: 33296

パッと思いつく方法だと、こんな方法があります。
探せば他にもあるかもしれません。
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-11 06:44:57  No: 33297

monnaさん、有り難うございました。
うまくいきました。
その後、どうしても解決しないので
何かヒントはないかと再びここを訪れたらコメントをいただいていて
どんぴしゃりでした。感謝します。
たぶんSleipnirもこのようにしているのでは?と思いました。
また教えてください。


名無し;  2009-02-11 20:37:13  No: 33298

もし、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じゃ無理か...


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加