ページコントロールを動的に削除

解決


はざま  2007-05-16 18:44:28  No: 26146  IP: 192.*.*.*

はじめまして。
ページコントロールを動的に生成させることはネット上でいろいろなサンプルがありましたのでなんとかできました。
しかしながら、ページを削除しようとすると、なぜかアドレスの読み込み違反としかられます。
pagecontrol1.ActivePage.Free;
ボタンを押したときにこれをしているだけです。
いくつもの  フォームの上にあるページの上にフレームを乗せていてそのフレームにあるボタンを押すと  フォーム.unitの関数により上記を実行するんですが、なぜかエラー出てしまいます。タブ式のエディタやブラウザをよく見かけるにもかかわらず、こんなところでつまずく自分が情けないです。

編集 削除
グッチ聞くぞう  2007-05-17 12:20:37  No: 26147  IP: 192.*.*.*

>なぜかエラー出てしまいます
まぁ、コードのドコかにミスがあるんでしょうねぇ。
>こんなところでつまずく自分が情けないです。
グッチ言うぞう(はざま)さん、ガンバ。

編集 削除
WMあpp  2007-05-17 12:30:52  No: 26148  IP: 192.*.*.*

これは、ユーザーメッセージを定義して、PostMessageする例です。

const
  WM_TabDelete = WM_APP +400;

type
  TForm1 = class(TForm)
    Button1: TButton;
    PageControl1: TPageControl;
    procedure Button1Click(Sender: TObject);

  private
    { Private 宣言 }
    procedure WMTabDelete(var Msg: TMessage); message WM_TabDelete;
    procedure ButtonCloseClick(Sender: TObject);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  tab: TTabSheet;
  btn: TButton;
begin
  tab:= TTabSheet.Create(self);
  tab.PageControl:= PageControl1;
  PageControl1.ActivePage:= tab;
  btn:= TButton.Create(tab);
  btn.Caption:= '×';
  btn.SetBounds(10, 10, 100, 20);
  btn.Parent:= tab;
  btn.OnClick:= ButtonCloseClick;
end;


procedure TForm1.ButtonCloseClick(Sender: TObject);
begin
  //これだとエラーになる
  //if PageControl1.ActivePage<>nil then
  //   PageControl1.ActivePage.Free;

  PostMessage(Handle, WM_TabDelete, 0, 0);
end;

procedure TForm1.WMTabDelete(var Msg: TMessage);
begin
  if PageControl1.ActivePage<>nil then
     PageControl1.ActivePage.Free;
end;

end.

編集 削除
はざま  2007-05-18 01:15:22  No: 26149  IP: 192.*.*.*

>>グッチ聞くぞう
ありがとうございます。    (^ ^;;;

>>WMあpp
詳細な解説ありがとうございます。折り返し質問申し訳ないですが、ユーザメッセージを定義する場合vistaには対応できるのでしょうか。
いまdelphi6.0  xpを使用しているのですが、あまりウィンドウズメッセージは使いたくないんです。。。
API使うとVISTAだと危ういというのは誤解なんでしょうか。。。

編集 削除
はぁ  2007-05-18 04:19:46  No: 26150  IP: 192.*.*.*

>API使うとVISTAだと危ういというのは誤解なんでしょうか。。

誤解です。
本当なら、APIのラッパであるVCLは使えません。

編集 削除
はざま  2007-05-18 22:31:26  No: 26151  IP: 192.*.*.*

>>はぁさん
すいません。そうですよね。

皆さま本当にありがとうございます。どうにか目的が達成できました。

編集 削除