Q&A

  • 상속에 관한 질문입니다..
음..

상속에 관한 문제인데요..



예를 들어서..

어떤 컴포넌트의 ActiveControl이라는 속성이 있을때..

속성값은 TButton이라 한다면..



전..Tbutton에 맴버함수를 더 넣어서 클래스를 만들구 싶거든요..

그래가지구..위 컴포넌트에 그대루 인식시키고 싶어요..



어떻게 해야 이렇게 만들수 있는지..

팁 주시기 바랍니다..고수님덜..

3  COMMENTS
  • Profile
    이준해 2000.06.13 18:29
    다음 순서대로 작업해 보세요.

    1. TButton의 SuperClass로 하는 원하는 Class를 만드세요.(TMyButton이라 하죠)

    : 원하는 멤버함수를 넣든가, Property를 추가하던가, Event 등을 추가하던가, 또는

    모양을 바꿀 수도 있겠죠.

    2. 만들어진 Class(VCL Component가 되겠죠)를 등록하세요

    3. 폼을 디자인할 때, 만들어진 버튼을 이용하세요.

    4. ActiveControl은 통상 Form등 Container가 갖는 속성으로 알고 있습니다.

    원하는 작업을 하고자 할때 다음과 같이 불러 쓰세요.

    if form1.activeControl is TMyButton then begin

    TMyButton(form1.activeControl).yourMemberFunction...

    ...

    end;

    또는

    form1.ActiveControl := myButton1; // ActiveControl이 readonly가 아니라면요



    5. 이런 작업이 가능한 것은 다음 이유입니다.

    - ActiveControl은 TControl로 변수선언이 되어있을 겁니다.

    - TButton등 가시적인 대부분의 Component는 TControl의 하위 Class입니다.

    - 따라서 ActiveControl에는 TControl의 하위 Class라면 모두 reference시킬수 있습니다.

    (물론, 엄밀히 말하면 Class가 아니라 Instance겠죠 ?)



    6. 기타

    - OOP.. 몰라도 Delphi쓰는데 문제 없습니다. 그러나, 좀 신경써서 개념과

    사용법을 익혀놓으면 재미 있습니다.

    - 님께서 시도하는게 그런 류의 공부 같은데 훌륭한 성취 있으시길 바랍니다.



    코드를 보여드리지 못해 죄송합니다. 뎅파이 바이블이나 관련 책에

    OOP 또는 고급프로그래밍기법등의 장을 참조하세요.



    즐거운 하루 되시길.



    어린왕자 wrote:

    > 음..

    > 상속에 관한 문제인데요..

    >

    > 예를 들어서..

    > 어떤 컴포넌트의 ActiveControl이라는 속성이 있을때..

    > 속성값은 TButton이라 한다면..

    >

    > 전..Tbutton에 맴버함수를 더 넣어서 클래스를 만들구 싶거든요..

    > 그래가지구..위 컴포넌트에 그대루 인식시키고 싶어요..

    >

    > 어떻게 해야 이렇게 만들수 있는지..

    > 팁 주시기 바랍니다..고수님덜..

  • Profile
    어린왕자 2000.06.13 18:42
    > 2. 만들어진 Class(VCL Component가 되겠죠)를 등록하세요

    꼭 등록해야하나요? 동적으로 사용하면 안되나요? 귀찮아서..





    > 5. 이런 작업이 가능한 것은 다음 이유입니다.

    > - ActiveControl은 TControl로 변수선언이 되어있을 겁니다.

    > - TButton등 가시적인 대부분의 Component는 TControl의 하위 Class입니다.

    > - 따라서 ActiveControl에는 TControl의 하위 Class라면 모두 reference시킬수 있습니다.



    원래 저에게 문제 있는건 PageControl.ActivePage속성인데요..



    속성값이 TTabsheet라는 값은데..

    저가 TTabSheet를 상속해서 몇개 멤버변수를 넣어서 TTabSheet1으로 만들었습니다..(같은 유닛에서..)



    근데..ActivePage속성값이 TTabSheet1 형태로 하고 싶은거죠..



    상식으로 생각할때..하위클래스라두 해두...이런 작업은 가능하지 않을 거 같아요..

    하지만 다른 방법이 있지 않을까 해서요..

    확~VCL컴포넌트 소스를 바꿔버릴까요?

  • Profile
    이준해 2000.06.13 19:12
    TTabSheet라면 쉽진 않을 것 같네요.



    정석대로라면 다음 작업을 해야 할 것 같습니다.

    1. TTabSheet 의 하위 Class를 만든다 (TMyTabSheet라고 하죠)

    2. TPageControl의 하위 Class를 만든다

    : 이때, TPageControl에서 TabSheet를 추가/제거하는 부분을 Override해서

    TTabSheet 대신 TMyTabSheet를 넣어준다.

    3. 작업할때는 TTabSheet를 Return받아 TMyTabSheet로 TypeCasting해서 사용한다.

    : 예를 들어 TMyTabSheet(myPageControl.Tabsheets[0]) 쯤이 되겠죠



    편법을 써서리, 어린왕자님이 원하는대로 등록하지 않고 동적으로 사용하려면...

    꼭 !! 사용해야 한다면, 이런 방법도 있습니다.



    1. TMyTabSheet를 만듭니다.(물론 작업하는 form에서 use해야 되겠죠)

    2. *.dfm파일을 편집기에서 열어서(폼에 마우스 오른쪽 버튼 -> View As Text하시면 됩니다.)

    TTabSheet로 정의된 변수를 TMyTabSheet로 바꾼다.(replace)

    3. 작업한 파일을 다시 "View As Form" 하셔서, 에러가 안나는지 확인하세요.

    4. form.pas 파일에서 역시

    TTabSheet로 정의된 변수를 TMyTabSheet로 바꾼다.(replace)

    5. 만약 ActivePage를 불러 사용하려면

    TMyTabSheet(form1.ActivePage).YourMemberFunction ....

    이런 식으로 사용하면 됩니다.

    6. 만약 런타임중에 Page를 추가/삭제등의 작업을 하면 위 방법이 안통합니다.

    런타임중에 사용하려면 위의 "정석대로" 처리해야 합니다.

    즉, PageControl을 디자인할때 Fix시켜야 사용가능하다는 거죠.





    마지막으로..

    Delphi에서 주어진 VCL Component의 소스를 바꾸는 방법

    : 최악의 방법이라고 생각되며 권하고 싶지 않습니다.

    : VCL은 제가 알기론 Delphi Version에 따라 조금씩 변합니다. 즉, 님께서 소스를 건드리시면 다음 버전에서 또 소스를 건드려야 한다는 거죠

    호환성이 보장안되는 거죠(안그래도 버젼별 호환성은 문제가 되긴 하지만)

    또한, 다른 폼등에서 PageControl을 사용할 텐데, 그런 부분까지 님께서 정상작동을 보증해야 합니다.

    : 팀작업을 통해서 작업중이라면 다름사람의 VCL 파일 까지 모두 바꾸어야 합니다.(만약 저라면 안바꿀려고 할 겁니다.)

    : 또하나, Delphi를 설치하고 소스를 고쳐야 해당 파일을 정상적으로 볼수 있다는 것도 문제라 할 수 있겠네요.

    가능하면 Delphi 설치 + 프로젝트에서 만든 콤포넌트 설치 로 개발환경이 설정되는게 바람직하지 않을까요 ?



    • sky
    • 2000.06.13 18:26
    • 0 COMMENTS
    • /
    • 0 LIKES
    • psunk
    • 2000.06.13 17:50
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 다빈
    • 2000.06.13 10:30
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최영근
      2000.06.13 11:03
      다빈 wrote: > 버튼 클릭시 실행파일(다른 프로젝트파일의 실행파일)을 열고 > 싶은데(*.EXE) 어떻게 해...
    • 다빈
      2000.06.13 11:43
      그런데요... winexec로 열린 파일을 다시 열려고 할
    • 이수정
      2000.06.14 12:19
      안녕하세요... 코드는 모르구요... 여기 자료실에.. 최용일님이신가.. 실행파일 중복실행 방지용...
    • 최영근
      2000.06.13 21:26
      다빈 wrote: > 그런데요... > winexec로 열린 파일을 다시 열려고 할
    • 이준해
      2000.06.13 18:29
      다음 순서대로 작업해 보세요. 1. TButton의 SuperClass로 하는 원하는 Class를 만드세요.(TMyButton이라 ...
    • 어린왕자
      2000.06.13 18:42
      > 2. 만들어진 Class(VCL Component가 되겠죠)를 등록하세요 꼭 등록해야하나요? 동적으로 사용하면 안되...
    • 이준해
      2000.06.13 19:12
      TTabSheet라면 쉽진 않을 것 같네요. 정석대로라면 다음 작업을 해야 할 것 같습니다. 1. TTabSheet ...
    • 김동식
    • 2000.06.13 08:50
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2000.06.13 14:34
      김동식 wrote: > 델파이로 하드웨어 제어용 DLL 제작이 가능한지 알고싶군요. 하드웨어 제어용 DLL 제...
    • 아리엘
    • 2000.06.13 08:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이준해
      2000.06.13 18:32
      TQRExpress 에는 필드명을 주는 것으로 알고 있습니다. 양쪽에 큰괄호를 하고 필드명을 주세요 "[field1]...
    • 이태수
    • 2000.06.13 07:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 양병규
      2000.06.13 10:02
      StringReplace로 Tab문자를 콤마로 바꿔서 TStrings의 CommaText로 대입하면.. 탭을 구분으로해서 TString...
    • 조규춘
      2000.06.13 14:53
      어린왕자 wrote: > 안녕하세요..어린왕자입니다.. > 질문있습니다.. > 디비그리드와 데이타소스와 ADODa...
    • 어린왕자
      2000.06.13 16:34
      규춘님 답변 잘봤어요.. 음.. 저가 할려는 의도는 그 결과창을 계속 띠워놓구 싶거든요? 그리드 결과 창...
    • 모승열
      2000.06.14 01:55
      이재명 wrote: > 개념 그래프를 이용하여 자연어 검색 및 저장 프로그램을 작성중입니다. > 생성된 변수...
    • 서경환
      2000.06.13 07:18
      제가 보기에는 제어판의 국가별 설정에 따라서 표시되는 방법이 틀린 것 같습니다. 아래의 소스를 참고하...
    • 박대규
    • 2000.06.13 06:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 서경환
      2000.06.13 06:56
      다른 윈도우에 변수를 잡고 public { Public declarations } vi_cursor:integer; begin if Scre...
    • 선희
    • 2000.06.13 05:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 서경환
      2000.06.13 06:21
      17082 참조하면 될 것 같은데 테스트 해보았음... 선희 wrote: > MDI폼으로 프로젝트를 진행중인데 >...
    • azure
    • 2000.06.13 04:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 서경환
      2000.06.13 05:33
      StringGrid를 클릭하면 해당 로우의 데이타(키)를 읽어와서 Select문을 다시 쓰는것이 한 방법인데... 더 ...
    • 이준해
      2000.06.13 18:36
      Class를 만들어 사용한다고 속도가 느려지지는 않습니다. TList 라는 Class 를 사용하세요. 쬐금 손봐서 ...
    • 배훈
    • 2000.06.13 04:30
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 서경환
      2000.06.13 05:30
      DBE Administrator에서 Configuration --> Drivers --> Native --> Oracle --> VENDOR INIT를 ORA8(비슷한...
    • 배훈
      2000.06.13 06:23
      서경환 wrote: > DBE Administrator에서 Configuration --> Drivers --> Native --> Oracle --> VENDOR IN...
    • 이창영
    • 2000.06.13 03:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이승우
      2000.06.13 05:47
      이창영 wrote: > 안녕하세요! > 프로그램 인스톨되고 제어판의 odbc에서 추가하면 문제가 없는데 > 그런...
    • 지연
    • 2000.06.13 03:55
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이언주
      2000.06.13 06:18
      퀵리포트에서 미리보기에서 printer setup에서 인쇄할 페이지라고 ~에서 ~까지라고 설정하는 부분이 있습니...
    • 지연
      2000.06.13 17:54
      답변은 고맙습니다... 그런데 제가 올린 질문을 자세히 안 읽어 보셨나봐요... 답변해 주신것처럼 페이지...
    • 조규춘
      2000.06.13 14:24
      이창영 wrote: > 안녕하세요! > 프로그램 인스톨되고나서 바탕화면에 바로가기 아이콘을 > 자동으로 만...