Q&A

  • 질문제목과 분류를 꼭 해주시길 부탁드립니다.
저는 지금 쿼리툴을 만들고 있습니다.

다른 사람 소스를 참고 하며 만들면서 소스와 똑같은 구조로 해봤는데 저한테만 에러가

자꾸 나는 것같아 도움을 청합니다.



폼에 스크롤 박스를 동적생성하고 버튼클릭이벤트때 닫기버튼 올라와 있는 판넬을 동적생성하고 닫기 버튼을 다시 누르면 판넬이 없어지는 것인데

닫기버튼 클릭할때마다 EAccess나 EAbstractError가 발생합니다.



그 부분만 떼서 올렸는데 어디가 잘못됐는지 조언 좀 부탁드립니다.





unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;



type

TAPanel = class(TPanel)

Btn : TButton;

procedure btnClick(Sender: TObject);

public

constructor Create(AOwner: TComponent); override;

Destructor destroy; override;

end;

TForm1 = class(TForm)

Panel1: TPanel;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;

APanel : TAPanel;

AScroll : TScrollBox;

implementation



{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

var

x, y : Integer;

begin



APanel := TAPanel.Create(Self);

APanel.Parent := AScroll;

APanel.Top := RanDom(AScroll.Height);

APanel.Left := RanDom(AScroll.Width);

APanel.Btn.OnClick := APanel.btnClick;

end;



procedure TForm1.FormCreate(Sender: TObject);

begin

Ascroll := TSCrollBox.Create(Self);

AScroll.Parent := Self;

AScroll.Align := alClient;

end;



{ TAPanel }



procedure TAPanel.btnClick(Sender: TObject);

begin

Self.free; //여기서 EAbstractError발생

end;



constructor TAPanel.Create(AOwner: TComponent);

begin

inherited;

Btn := TButton.Create(Self);

Btn.parent := Self;

Btn.Caption := 'x';



end;



destructor TAPanel.destroy;

begin

inherited;

end;



end.



/////////////여기는 폼소스

object Form1: TForm1

Left = 192

Top = 107

Width = 696

Height = 480

Caption = 'Form1'

Color = clBtnFace

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'MS Sans Serif'

Font.Style = []

OldCreateOrder = False

OnCreate = FormCreate

PixelsPerInch = 96

TextHeight = 13

object Panel1: TPanel

Left = 0

Top = 392

Width = 688

Height = 61

Align = alBottom

Caption = 'Panel1'

TabOrder = 0

object Button1: TButton

Left = 72

Top = 24

Width = 75

Height = 25

Caption = 'Button1'

TabOrder = 0

OnClick = Button1Click

end

object Button2: TButton

Left = 192

Top = 16

Width = 75

Height = 25

Caption = 'Button2'

TabOrder = 1

end

end

end





1  COMMENTS
  • Profile
    어린왕자 2000.10.18 01:43
    안녕하세요..영원한 델초보 어린왕자입니다..

    저가 보기에는 말이죠..

    버튼이 안죽었는데 버튼의 parent패널이 죽어서 그런거 같습니다..

    PostMessage를 보내야할듯...^^; 워낙초보라서..다음과 같이 추가해보세요.

    될런지 모르겠네요



    procedure WMUSER(Var Msg:TMessage);message WM_USER_DELETE; // 선언





    procedure TForm1.WmUser(Var Msg:TMessage);

    begin

    if Assigned (TObject(Msg.wParam)) then

    begin

    SelectNext(TWinControl(Msg.wParam),True,true);

    FreeAndNil(TObject(Msg.wParam));

    end;

    end;





    버튼클릭이벤트 마지막에..



    PostMessage(Handle,WM_USER, WPARAM(tmpPanel),0) // tmpPanel은 지워질 패널



    팁을 참고했어염..

    즐코하세염..





    jinnon wrote:

    > 저는 지금 쿼리툴을 만들고 있습니다.

    > 다른 사람 소스를 참고 하며 만들면서 소스와 똑같은 구조로 해봤는데 저한테만 에러가

    > 자꾸 나는 것같아 도움을 청합니다.

    >

    > 폼에 스크롤 박스를 동적생성하고 버튼클릭이벤트때 닫기버튼 올라와 있는 판넬을 동적생성하고 닫기 버튼을 다시 누르면 판넬이 없어지는 것인데

    > 닫기버튼 클릭할때마다 EAccess나 EAbstractError가 발생합니다.

    >

    > 그 부분만 떼서 올렸는데 어디가 잘못됐는지 조언 좀 부탁드립니다.

    >

    >

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ExtCtrls;

    >

    > type

    > TAPanel = class(TPanel)

    > Btn : TButton;

    > procedure btnClick(Sender: TObject);

    > public

    > constructor Create(AOwner: TComponent); override;

    > Destructor destroy; override;

    > end;

    > TForm1 = class(TForm)

    > Panel1: TPanel;

    > Button1: TButton;

    > Button2: TButton;

    > procedure Button1Click(Sender: TObject);

    > procedure FormCreate(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    > APanel : TAPanel;

    > AScroll : TScrollBox;

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > x, y : Integer;

    > begin

    >

    > APanel := TAPanel.Create(Self);

    > APanel.Parent := AScroll;

    > APanel.Top := RanDom(AScroll.Height);

    > APanel.Left := RanDom(AScroll.Width);

    > APanel.Btn.OnClick := APanel.btnClick;

    > end;

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > Ascroll := TSCrollBox.Create(Self);

    > AScroll.Parent := Self;

    > AScroll.Align := alClient;

    > end;

    >

    > { TAPanel }

    >

    > procedure TAPanel.btnClick(Sender: TObject);

    > begin

    > Self.free; //여기서 EAbstractError발생

    > end;

    >

    > constructor TAPanel.Create(AOwner: TComponent);

    > begin

    > inherited;

    > Btn := TButton.Create(Self);

    > Btn.parent := Self;

    > Btn.Caption := 'x';

    >

    > end;

    >

    > destructor TAPanel.destroy;

    > begin

    > inherited;

    > end;

    >

    > end.

    >

    > /////////////여기는 폼소스

    > object Form1: TForm1

    > Left = 192

    > Top = 107

    > Width = 696

    > Height = 480

    > Caption = 'Form1'

    > Color = clBtnFace

    > Font.Charset = DEFAULT_CHARSET

    > Font.Color = clWindowText

    > Font.Height = -11

    > Font.Name = 'MS Sans Serif'

    > Font.Style = []

    > OldCreateOrder = False

    > OnCreate = FormCreate

    > PixelsPerInch = 96

    > TextHeight = 13

    > object Panel1: TPanel

    > Left = 0

    > Top = 392

    > Width = 688

    > Height = 61

    > Align = alBottom

    > Caption = 'Panel1'

    > TabOrder = 0

    > object Button1: TButton

    > Left = 72

    > Top = 24

    > Width = 75

    > Height = 25

    > Caption = 'Button1'

    > TabOrder = 0

    > OnClick = Button1Click

    > end

    > object Button2: TButton

    > Left = 192

    > Top = 16

    > Width = 75

    > Height = 25

    > Caption = 'Button2'

    > TabOrder = 1

    > end

    > end

    > end

    >

    >