はじめまして。
ページコントロールを動的に生成させることはネット上でいろいろなサンプルがありましたのでなんとかできました。
しかしながら、ページを削除しようとすると、なぜかアドレスの読み込み違反としかられます。
pagecontrol1.ActivePage.Free;
ボタンを押したときにこれをしているだけです。
いくつもの フォームの上にあるページの上にフレームを乗せていてそのフレームにあるボタンを押すと フォーム.unitの関数により上記を実行するんですが、なぜかエラー出てしまいます。タブ式のエディタやブラウザをよく見かけるにもかかわらず、こんなところでつまずく自分が情けないです。
>なぜかエラー出てしまいます
まぁ、コードのドコかにミスがあるんでしょうねぇ。
>こんなところでつまずく自分が情けないです。
グッチ言うぞう(はざま)さん、ガンバ。
これは、ユーザーメッセージを定義して、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.
>>グッチ聞くぞう
ありがとうございます。 (^ ^;;;
>>WMあpp
詳細な解説ありがとうございます。折り返し質問申し訳ないですが、ユーザメッセージを定義する場合vistaには対応できるのでしょうか。
いまdelphi6.0 xpを使用しているのですが、あまりウィンドウズメッセージは使いたくないんです。。。
API使うとVISTAだと危ういというのは誤解なんでしょうか。。。
>API使うとVISTAだと危ういというのは誤解なんでしょうか。。
誤解です。
本当なら、APIのラッパであるVCLは使えません。
>>はぁさん
すいません。そうですよね。
皆さま本当にありがとうございます。どうにか目的が達成できました。
ツイート | ![]() |