Q&A

  • Panel을 상속받아 만든 컴포넌트에서..
Panel을 상속받아 그위에 Image 객체를 얹어 컴포넌트를 만들었습니다.



그런데, 이 컴포넌트를 동적으로 생성한뒤에, 마우스에 대한 이벤트들.



예를들어 마우스로 드래그 한다던가, 클릭한다던가 하는..



그런 이벤트들을 처리할려고 했더니, 전혀 먹히질 않았습니다.



처음엔 Panel과 Image의 크기를 똑같이 정해 주었죠. 그런데, 우연히 Image 밑



에 깔리는 Panel을 더 크게 해주었더니, 그 Panel 부분에 대해서는 이런 이벤트



들을 인식하더군요. 한마디로 Image의 Parent인 Panel에 대해서만 이벤트를 잡



아 내더군요. 이럴때에 Image 부분에서도 이벤트를 잡아낼 방법은 없을까요?





그리고 또 한가지..



이렇게 만든 컴포넌트를 다른 사람에게 인스톨 시켰는데, 쓸려고 했더니, 컴파



일 할때, Image에 로드할 image 파일이 없다는 메시지가 뜨더군요.



이미 컴포넌트로 만들었는데.. 그걸 쓸때마다.. 그걸 읽어오는 것인가요?



컴포넌트로 만들었다면.. 당연히 그런 정보들은 컴포넌트 안에 담겨 있어야 할



것 같은데. 제가 컴포넌트 만들때 옵션 같은 것을 지정하지 않은 것인가요?





고수님들의 조언을 부탁드립니다.











4  COMMENTS
  • Profile
    유수 1999.08.13 03:42
    인재님께서는 이미지를 가질 수 있는 패널을 원하시는 모양입니다.



    패널에 이미지 캑체를 넣어쓰게 되면 Image 객체가 패널을 가리게 되어



    이벤트가 Image객체로 가게 되며,



    패널에는 제대로 발생하기 않게 된답니다.



    방법은 패널내에서 사용하게 되는 Image객체의 이벤트 각각을 패널 이벤트의



    각각의 이벤트에 연결 시켜 주는 방법을 생각해 볼 수 있습니다.



    다음의 컴포넌트는 개인적으로 사용하는 것입니다. Image객체를 사용하지 않고



    패널에 직접 비트맵을 그려주는 방법을 사용하였기 때문에,



    원하시는 컴포넌트가 될 것라 생각되어 첨부합니다. 참조해 주시기 바랍니다.



    그리고, 컴포넌트 자체에는 프로퍼티 값이 저장되지 않는 것이 디폴트라는 것



    을 명심해 주시기 바랍니다.



    //-----------------------------------------------------------------

    // Made By 유수..

    // NeoLib Package - NeoPanel 컴포넌트

    //-----------------------------------------------------------------



    unit NeoPanel;



    interface



    uses

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



    type

    TBackBitmapStyle = (biNoBitmap, biCenter, biStretched, biTiled, biRight);



    TNeoPanel = class(TPanel)

    private

    { Private declarations }

    FBitmap: TBitmap; // 깜박거림을 방지하기 위해

    FBackBitmap: TBitmap;

    FBackBitmapStyle: TBackBitmapStyle;

    FFitToImgSize: Boolean;

    procedure SetBackBitmap(const Value: TBitmap);

    procedure SetBackBitmapStyle(const Value: TBackBitmapStyle);

    procedure SetFitToImgSize(const Value: Boolean);

    protected

    { Protected declarations }

    procedure Draw;

    procedure DrawBack(Canvas: TCanvas; Rect: TRect);

    public

    { Public declarations }

    constructor Create(AOwner: TComponent); override;

    destructor Destroy; override;

    procedure Paint; override;

    published

    { Published declarations }

    property BackBitmap: TBitmap read FBackBitmap write SetBackBitmap;

    property BackBitmapStyle: TBackBitmapStyle read FBackBitmapStyle write SetBackBitmapStyle;

    property FitToImgSize: Boolean read FFitToImgSize write SetFitToImgSize;

    end;



    procedure Register;



    implementation



    procedure Register;

    begin

    RegisterComponents('NeoLib', [TNeoPanel]);

    end;



    { TNeoPanel }



    constructor TNeoPanel.Create(AOwner: TComponent);

    begin

    inherited Create(AOwner);

    FBackBitmap := TBitmap.Create;

    FBitmap := TBitmap.Create;

    end;



    destructor TNeoPanel.Destroy;

    begin

    FBitmap.Free;

    FBackBitmap.Free;

    inherited Destroy;

    end;



    procedure TNeoPanel.Draw;

    begin

    with FBitmap do

    begin

    Width := Self.Width;

    Height := Self.Height;

    Canvas.Font := Font;

    Canvas.Brush.Color := Color;

    DrawBack(Canvas, Canvas.ClipRect);

    BitBlt(Self.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);

    end;

    end;



    procedure TNeoPanel.DrawBack(Canvas: TCanvas; Rect: TRect);

    var

    i, j: Integer;

    begin

    with Canvas do

    begin

    if FBackBitmap.Empty or (FBackBitmapStyle = biNoBitmap) then

    begin

    FillRect(Rect);

    end

    else

    case FBackBitmapStyle of

    biCenter:

    begin

    FillRect(Rect);

    i := (ClientWidth - FBackBitmap.Width) div 2;

    j := (ClientHeight - FBackBitmap.Height) div 2;

    BitBlt(Handle, i, j,

    FBackBitmap.Width, FBackBitmap.Height, FBackBitmap.Canvas.Handle, 0, 0, SRCCOPY);

    end;

    biTiled:

    for i := Rect.Top div FBackBitmap.Height to Rect.Bottom div FBackBitmap.Height do

    for j := Rect.Left div FBackBitmap.Width to Rect.Right div FBackBitmap.Width do

    BitBlt(Handle, j * FBackBitmap.Width - Rect.Left, i * FBackBitmap.Height - Rect.Top, FBackBitmap.Width,

    FBackBitmap.Height, FBackBitmap.Canvas.Handle, 0, 0, SRCCOPY);

    biStretched:

    StretchBlt(Handle, -Rect.Left, -Rect.Top, ClientWidth, ClientHeight,

    FBackBitmap.Canvas.Handle, 0, 0, FBackBitmap.Width, FBackBitmap.Height,

    SRCCOPY);

    biRight:

    begin

    FillRect(Rect);

    i := (ClientWidth - FBackBitmap.Width);

    BitBlt(Handle, i, 0,

    FBackBitmap.Width, FBackBitmap.Height, FBackBitmap.Canvas.Handle, 0, 0, SRCCOPY);

    end;

    end

    end;

    end;



    procedure TNeoPanel.Paint;

    begin

    if not FBackBitmap.Empty then Draw

    else inherited;

    end;



    procedure TNeoPanel.SetBackBitmap(const Value: TBitmap);

    begin

    FBackBitmap.Assign(Value);

    RePaint;

    end;





    procedure TNeoPanel.SetBackBitmapStyle(const Value: TBackBitmapStyle);

    begin

    FBackBitmapStyle := Value;

    RePaint;

    end;



    procedure TNeoPanel.SetFitToImgSize(const Value: Boolean);

    begin

    FFitToImgSize := Value;

    if FBackBitmap.Empty then Exit;

    if FFitToImgSize then

    begin

    Width := FBackBitmap.Width;

    Height := FBackBitmap.Height;

    end;

    end;



    end.







    박인재 께서 말씀하시기를...

    > Panel을 상속받아 그위에 Image 객체를 얹어 컴포넌트를 만들었습니다.

    >

    > 그런데, 이 컴포넌트를 동적으로 생성한뒤에, 마우스에 대한 이벤트들.

    >

    > 예를들어 마우스로 드래그 한다던가, 클릭한다던가 하는..

    >

    > 그런 이벤트들을 처리할려고 했더니, 전혀 먹히질 않았습니다.

    >

    > 처음엔 Panel과 Image의 크기를 똑같이 정해 주었죠. 그런데, 우연히 Image 밑

    >

    > 에 깔리는 Panel을 더 크게 해주었더니, 그 Panel 부분에 대해서는 이런 이벤트

    >

    > 들을 인식하더군요. 한마디로 Image의 Parent인 Panel에 대해서만 이벤트를 잡

    >

    > 아 내더군요. 이럴때에 Image 부분에서도 이벤트를 잡아낼 방법은 없을까요?

    >

    >

    > 그리고 또 한가지..

    >

    > 이렇게 만든 컴포넌트를 다른 사람에게 인스톨 시켰는데, 쓸려고 했더니, 컴파

    >

    > 일 할때, Image에 로드할 image 파일이 없다는 메시지가 뜨더군요.

    >

    > 이미 컴포넌트로 만들었는데.. 그걸 쓸때마다.. 그걸 읽어오는 것인가요?

    >

    > 컴포넌트로 만들었다면.. 당연히 그런 정보들은 컴포넌트 안에 담겨 있어야 할

    >

    > 것 같은데. 제가 컴포넌트 만들때 옵션 같은 것을 지정하지 않은 것인가요?

    >

    >

    > 고수님들의 조언을 부탁드립니다.

    >

    >

    >

    >

    >





  • Profile
    박인재 1999.08.13 07:05
    정성스러운 답변 말씀 잘 들었습니다. ^^



    저도 글을 올리고 나서 이렇게 저렇게 생각해보니, 님께서 말씀하신 것처럼



    Image 객체에서 발생한 이벤트가 Panel에 전달되지 않는것 같아서, Panel에 직



    접 Image를 로드하는 방법을 생각해 보았습니다. 그런데, 이미지를 그렇게 해결



    한다고 해도, 저에게는 한가지 문제가 더 발생하는군요.. -_-



    다름이 아니라, 제가 만들어서 사용하려는 컴포넌트는 이미지와 그 이미지에



    대한 여러가지 정보를 나타내기위한 Label객체가 같이 존재하는 것입니다.



    그래서 동적으로 그 컴포넌트를 생성시킨뒤에, 그 컴포넌트를 클릭하여 그 이미



    지에 대한 정보를 동적으로 입력하려는 것이지요...



    그런데, 일단 컴포넌트로 만들고 나니, 그 컴포넌트 안의 Label 객체에 어떻게



    접근해야 할지 막막하더군요. Panel을 상속받아 컴포넌트를 만들었기 때문에,



    Label객체는 Panel의 child가 될텐데요. 어떻게 동적으로 그 Label 객체에 접근



    할 수 있을까요? 혹시 불가능 한것은 아닌지....





    조언을 부탁 드립니다.









  • Profile
    유수 1999.08.14 04:32


    안녕하세요.



    패널의 소스가 어떻게 구성되어 있는지 모르겠습니다만,



    제가 앞에 올린 컴포넌트를 참조해서 패널의 특정 위치에 이미지를 뿌려주도록



    하세요.



    그러면 패널을 클릭하면 제대로 패널에 이벤트가 발생하게 됩니다.



    그리고, 레이블 문제인데,



    님의 컴포넌트 제작 수준이 어느정도 인지 알 수가 없어 제가 실례를 하더라도



    이해 부탁드립니다.



    어떤 컴포넌트가 다른 컴포넌트를 포함하기 위해선 포함될 컴포넌트(여기서는



    TLabel)가 멤버 변수로 잡혀 있어야 합니다.



    예를 들면,



    TNeoPanel = class(Panel)

    private

    ImageHeight : TLabel; // 이미지 높이를 표시하기 위한 레이블,

    public

    procedure SetImageHeightText(AValue : String);

    end;



    TNeoPanel.Create 에서



    ImageHeight := TLabel.Create(Self);



    ImageHeight.Parent := Self;

    ImageHeight.Left := ..

    .. 등등의 정보



    TNeoPanel.Destory 에서

    ImageHeight.Free; 를



    procedure TNeoPanel.SetImageHeightText(AValue : String);

    begin

    ImageHeight.Catpiton := AValue;

    end;



    를 해 주시면 됩니다.



    전체적인 모양은



    TNeoPanel

    -----------------

    | ------------ |

    | | 이미지 | |

    | ------------ |

    | |

    ----------------



    (최선을 다해 그렸습니다.--;)



    그리고, 외부에서 그 ImageHeight의 Caption값을 변경시킬땐,



    NeoPanel.SetImageHeightText('300');



    라고 해 주시면 되겠습니다.



    박인재 께서 말씀하시기를...

    > 정성스러운 답변 말씀 잘 들었습니다. ^^

    >

    > 저도 글을 올리고 나서 이렇게 저렇게 생각해보니, 님께서 말씀하신 것처럼

    >

    > Image 객체에서 발생한 이벤트가 Panel에 전달되지 않는것 같아서, Panel에 직

    >

    > 접 Image를 로드하는 방법을 생각해 보았습니다. 그런데, 이미지를 그렇게 해결

    >

    > 한다고 해도, 저에게는 한가지 문제가 더 발생하는군요.. -_-

    >

    > 다름이 아니라, 제가 만들어서 사용하려는 컴포넌트는 이미지와 그 이미지에

    >

    > 대한 여러가지 정보를 나타내기위한 Label객체가 같이 존재하는 것입니다.

    >

    > 그래서 동적으로 그 컴포넌트를 생성시킨뒤에, 그 컴포넌트를 클릭하여 그 이미

    >

    > 지에 대한 정보를 동적으로 입력하려는 것이지요...

    >

    > 그런데, 일단 컴포넌트로 만들고 나니, 그 컴포넌트 안의 Label 객체에 어떻게

    >

    > 접근해야 할지 막막하더군요. Panel을 상속받아 컴포넌트를 만들었기 때문에,

    >

    > Label객체는 Panel의 child가 될텐데요. 어떻게 동적으로 그 Label 객체에 접근

    >

    > 할 수 있을까요? 혹시 불가능 한것은 아닌지....

    >

    >

    > 조언을 부탁 드립니다.

    >

    >

    >

    >





  • Profile
    박인재 1999.08.15 20:27
    유수님의 답변 말씀 정말 잘 들었습니다.



    그리고 아주 많은 도움이 되었습니다.



    제가 어려움을 겪고 있던 문제를. 아주 정확하게 해결할 수 있었습니다.



    사실 전 델파이를 시작한지 1달도 되지 않은 초보입니다.



    시간에 맞춰서 해내야할 일이 있어서..



    각종 책들과 Q&A 게시판등을 참조하며 일을 진행해가고 있는 중입니다.



    음. 제가 컴포넌트는 제대로 만들긴 했었는데..



    그 안의 특정 컴포넌트를 다룰려면, 미리 그 컴포넌트를 다루기 위한



    메소드를 선언해 놓아야 한다는 것을 몰랐었습니다.



    사실 모르는게 한 두가지가 아니거든요. ^^



    아무튼. 다시한번 정성스러운 답변 감사드립니다.



    (그림까지 그려주시다니. ^^;; )



    저도 나중에는 님처럼 누군가에게 도움을 줄 수 있을 만한 실력을 갖추었으면



    좋겠네요. ^^



    요즘 날씨도 무지 더운데.. 건강 조심하세요~







    • 유수
      1999.08.13 04:57
      차례대로 Edit1, Edit2... 의 이름을 가지는 경우를 가정하겠습니다. 각 필드는 문자형이며, 조건문...
    • 이영배
      1999.08.13 23:35
      답을 주셔서 대단히 감사합니다. 저의 질문에 정확히 맞는 훌륭한 로직인것 같습니다. 그런데 에러 ...
    • 유수
      1999.08.14 06:17
      안녕하세요. 참고만 하시라고, 떠오르는데로 쓴 코드라, 죄송하게 되었네요. > 이렇게 뜨는데 아래줄...
    • 이현철
    • 1999.08.13 03:12
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:22
      다음의 함수를 참조해 주세요. function ReplaceStr(const S, Srch, Replace: string): string; va...
    • 1999.08.13 03:21
      이현철 께서 말씀하시기를... > 안녕하세요. > 메모의 내용을 문자열 변수에 넣었어요. > 문자열 변수에...
    • 김용철
    • 1999.08.13 03:11
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 04:31
      데이타 베이스 화일을 여는 데 걸리는 시간은 일정하지 않은 것으로 알고 있습니다. 데이타의 양이...
    • 김용철
      1999.08.13 04:53
      감사합니다. 지금 유수님께서 설명해 주신 방법으로 프로그램이 작성되어 있습니다. 그런데 프로그래스...
    • 이현신
    • 1999.08.13 03:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조복기
      1999.08.14 08:09
      안녕하세요..조복기입니다.. 흠..막상 하는일은 학습용 겜을 만들고있는데 아는게 넘 부족해서 제...
    • 댕이
    • 1999.08.13 03:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조복기
      1999.08.13 03:22
      안녕하세요..조복기입니다.. 저도 몰랐었는데 몇일전에 저희 거래처 서버에 들어갈려고 하니까 되...
    • 장일형
    • 1999.08.13 02:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:56
      DLL을 사용하기 위해선 DLL내의 함수의 포인터를 알아야 합니다. 이는 GetProcAddress로 구할 수 있...
    • 홍성기
    • 1999.08.13 02:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 04:19
      http://www.borland.co.kr/delphi/productinfo/featurelist/ 을 방문해 보시면 자세히 알 수 있습니...
    • 여재모
    • 1999.08.13 02:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 04:25
      http://members.tripod.com/sungdong/DelphiMag.htm 을 방문해 보시면 사이트를 알 수 있을 것입니...
    • 박인재
    • 1999.08.13 01:35
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:42
      인재님께서는 이미지를 가질 수 있는 패널을 원하시는 모양입니다. 패널에 이미지 캑체를 넣어쓰게 되...
    • 박인재
      1999.08.13 07:05
      정성스러운 답변 말씀 잘 들었습니다. ^^ 저도 글을 올리고 나서 이렇게 저렇게 생각해보니, 님께서 말...
    • 유수
      1999.08.14 04:32
      안녕하세요. 패널의 소스가 어떻게 구성되어 있는지 모르겠습니다만, 제가 앞에 올린 컴포넌트...
    • 박인재
      1999.08.15 20:27
      유수님의 답변 말씀 정말 잘 들었습니다. 그리고 아주 많은 도움이 되었습니다. 제가 어려움을 겪고 ...
    • bluetin
    • 1999.08.13 01:15
    • 0 COMMENTS
    • /
    • 0 LIKES
    • bluetin
    • 1999.08.13 01:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 조복기
      1999.08.13 03:26
      안녕하세요..조복기입니다.. 신현묵, 정지훈님이 쓰신 '델파이4의 모든것'을 추천하네요.. 다른부...
    • 김미영
      1999.08.13 20:12
      조복기 께서 말씀하시기를... > > 안녕하세요..조복기입니다.. > > 신현묵, 정지훈님이 쓰신 '델파이...
    • 정연섭
    • 1999.08.12 23:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:27
      방법은 두가지가 있습니다. 코딩으로 Panel.Caption := '한출' + #13#10 + '두줄'.. 과 같이 ...
    • 남현선
    • 1999.08.12 23:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:32
      델파이4 정식판을 사용하시는지 묻고 싶네요. 혹시 베타판을 사용하신다면, 정식판으로 바꾸어 주셔...
    • 홍의식
      1999.08.12 23:59
      현재 화면은 screen.width와 screen.height로 구할수 있습니다. 그러면 form1,top := 1; form1,left ...
    • 문창완
      1999.08.14 04:27
      윤정선 께서 말씀하시기를... > 저는 델파이는 초보인데요, 연구소에서 시물레이션 프로그램을 다루게
    • 1999.08.12 21:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.14 05:38
      안녕하세요. RxLib의 데모 프로그램중에 RichEdit 예제가 있습니다. 그중에 Paragraph(문단)설정메...