Q&A

  • Form이 아닌 PaintBox위에 TMemo를 동적으로 만들구 싶어요...
문제에 부딪혀 이렇게 문의 드립니다...

님들 도움 부탁드리고, 문제를 간단히 설명 드리면...

보통 동적으로 폼을 생성할때...

eMemo := TMemo.Create(self);

eMemo.Parent := Form1;

~~~~~~~~~~~~~~~ 어쩌구 저쩌구 ~~~~~~~~~~

하잖아요...그런데 전 eMemo를 Form이 아닌 PaintBox에 붙이고 싶거든요?

혹시 방법이 없는지요...

이거 못하면 저 클납니다..

부탁드립니다.



간단한 소스 올립니다.

보구 방법이 있음 부탁드립니다.



unit Unit1;



interface



uses

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

ExtCtrls, StdCtrls;



type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

PaintBox1: TPaintBox;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure TestClick(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

eMemo : TMemo;

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);

begin

if not Assigned(eMemo) then

begin

eMemo := TMemo.Create(self);

eMemo.Parent := Form1;

eMemo.Align := alNone;

eMemo.Width :=100;

eMemo.Height :=100;

eMemo.Top :=200;

eMemo.Left :=200;

eMemo.Ctl3D := False;

eMemo.Font.Size := 10;

eMemo.Font.Style := [];

eMemo.BorderStyle := bsNone;

eMemo.SetFocus;

// eMemo.BorderStyle := bsNone;

// eMemo.ReadOnly := True;

// eMemo.Enabled := False;



// CreateCaret( Form1.eMemo.Handle);

ShowCaret(Form1.eMemo.handle);

eMemo.OnMouseDown := TestClick;







end;

end;



procedure TForm1.Button2Click(Sender: TObject);

begin

if Assigned(eMemo) then

begin

eMemo.Free;

eMemo :=nil;

end;

end;



procedure TForm1.TestClick(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if Assigned(eMemo) then

begin

eMemo.BorderStyle :=bsSingle;

end;

end;



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if Assigned(eMemo) then

begin

eMemo.BorderStyle :=bsNone;

HideCaret(Form1.eMemo.handle);

end;

end;



end.

2  COMMENTS
  • Profile
    홍성락 2001.07.25 02:27
    PaintBox는 windowed controls류가 아니므로 다른 객체를 Parent로써 갖지 못합니다.

    객체의 hierarchy를 보면 알수있습니다.

    이문제는 간단히 Panel를 이용 그속에 PaintBox를 넣어 align을 alCloent로 해서 한나처럼사용한뒤 eMemo.Parent := Panel1;로 하면 어떻까요?



    //////////////////////////////////////////////////////////////////////////

    초짜... wrote:

    > 문제에 부딪혀 이렇게 문의 드립니다...

    > 님들 도움 부탁드리고, 문제를 간단히 설명 드리면...

    > 보통 동적으로 폼을 생성할때...

    > eMemo := TMemo.Create(self);

    > eMemo.Parent := Form1;

    > ~~~~~~~~~~~~~~~ 어쩌구 저쩌구 ~~~~~~~~~~

    > 하잖아요...그런데 전 eMemo를 Form이 아닌 PaintBox에 붙이고 싶거든요?

    > 혹시 방법이 없는지요...

    > 이거 못하면 저 클납니다..

    > 부탁드립니다.

    >

    > 간단한 소스 올립니다.

    > 보구 방법이 있음 부탁드립니다.

    >

    > unit Unit1;

    >

    > interface

    >

    > uses

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

    > ExtCtrls, StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > Button1: TButton;

    > Button2: TButton;

    > PaintBox1: TPaintBox;

    > procedure Button1Click(Sender: TObject);

    > procedure Button2Click(Sender: TObject);

    > procedure TestClick(Sender: TObject; Button: TMouseButton;

    > Shift: TShiftState; X, Y: Integer);

    > procedure FormMouseDown(Sender: TObject; Button: TMouseButton;

    > Shift: TShiftState; X, Y: Integer);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > eMemo : TMemo;

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > begin

    > if not Assigned(eMemo) then

    > begin

    > eMemo := TMemo.Create(self);

    > eMemo.Parent := Form1;

    > eMemo.Align := alNone;

    > eMemo.Width :=100;

    > eMemo.Height :=100;

    > eMemo.Top :=200;

    > eMemo.Left :=200;

    > eMemo.Ctl3D := False;

    > eMemo.Font.Size := 10;

    > eMemo.Font.Style := [];

    > eMemo.BorderStyle := bsNone;

    > eMemo.SetFocus;

    > // eMemo.BorderStyle := bsNone;

    > // eMemo.ReadOnly := True;

    > // eMemo.Enabled := False;

    >

    > // CreateCaret( Form1.eMemo.Handle);

    > ShowCaret(Form1.eMemo.handle);

    > eMemo.OnMouseDown := TestClick;

    >

    >

    >

    > end;

    > end;

    >

    > procedure TForm1.Button2Click(Sender: TObject);

    > begin

    > if Assigned(eMemo) then

    > begin

    > eMemo.Free;

    > eMemo :=nil;

    > end;

    > end;

    >

    > procedure TForm1.TestClick(Sender: TObject; Button: TMouseButton;

    > Shift: TShiftState; X, Y: Integer);

    > begin

    > if Assigned(eMemo) then

    > begin

    > eMemo.BorderStyle :=bsSingle;

    > end;

    > end;

    >

    > procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

    > Shift: TShiftState; X, Y: Integer);

    > begin

    > if Assigned(eMemo) then

    > begin

    > eMemo.BorderStyle :=bsNone;

    > HideCaret(Form1.eMemo.handle);

    > end;

    > end;

    >

    > end.

  • Profile
    초짜... 2001.07.25 03:18
    답변 감사합니다..

    물론 그런 방법도 있겠지만...

    지금 그렇게 쓸수 없는 이유는 그리기 오브젝트(선,박스...)와 폼 오브젝트를 PaintBox에 그려줘야 하거든요

    제 생각에 TWinControl이란 놈과 TGraphicControl을 다중 상속 받는 컴포넌트를 하나 만들어야 될꺼 같은데..델에서 다중상속이 가능한지요...

    아님 어떤 편법으로 다중상속할 수 있는 방법이 있는지요...

    책에는 편법으로 할 수 있다는데 자세한 방법이나 예제가 없네요...

    누구 다중상속하는 예 좀 보여줄 수 있나요?

    다시 함 부탁드립니다..고수님들...