次のようなコンポーネントを作りました。
TPanel 上に TButton を5つ配置し、プロパティで、
ボタンの Visible を操作します。
このコンポーネントをFormに貼り付けて、
プロパティを切り替えても
再描画(ボタンが表示したり、消えたり)しません。
Paint、Repaint、Refresh、UpDateなど試してみましたが
どれもだめでした。
この再描画をさせる方法がわかりません。
別のウィンドウ(フォーム等)を重ねて、どかせると
再描画されますからプロパティの設定処理はいいようです。
これと同じ処理を行うにはどうすればよいのでしょうか?
ソースがあるとすぐ試せるのですが。
再描画されないのはオブジェクトインスペクタ中?実行中?
実行中の場合を検証しました
問題ありません。
オブジェクトインスペクタの場合は私はまったく使わないので分かりません。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TPanelButtons5 = class(TPanel)
private
Buttons: array [0..4] of TButton;
function GetButtonVisible(Index: integer): Boolean;
procedure SetButtonVisible(Index: integer; const Value: Boolean);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property ButtonVisible[Index:integer]:Boolean read GetButtonVisible write SetButtonVisible;
end;
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
PB5:TPanelButtons5;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TPanelButtons5 }
constructor TPanelButtons5.Create(AOwner: TComponent);
var
i:Integer;
begin
inherited;
for i:= 0 to Length(Buttons)-1 do
begin
Buttons[i]:=TButton.Create(self);
Buttons[i].Parent:=Self;
Buttons[i].Left:=20 * i;
Buttons[i].Width:=20;
end;
end;
destructor TPanelButtons5.Destroy;
var
i:Integer;
begin
for i:= 0 to Length(Buttons)-1 do
Buttons[i].Free;
inherited;
end;
function TPanelButtons5.GetButtonVisible(Index: integer): Boolean;
begin
Result:=Buttons[Index].Visible;
end;
procedure TPanelButtons5.SetButtonVisible(Index: integer;
const Value: Boolean);
begin
Buttons[Index].Visible:=Value;
end;
{TForm1}
procedure TForm1.FormCreate(Sender: TObject);
begin
PB5:=TPanelButtons5.Create(self);
PB5.Width:=100;
PB5.Height:=50;
PB5.Parent:=Form1;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
PB5.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PB5.ButtonVisible[StrToInt(Edit1.Text)]:=not PB5.ButtonVisible[StrToInt(Edit1.Text)];
end;
end.
ツイート | ![]() |