Q&A

  • Form1(Unit1)과 Unit2연결하여 Form1 버튼 OnClick 사용하기..
<!--CodeS-->
// 문제및 질문 요점은 맨 아래 부분에 있습니다.
// Form1에대한 소스
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, AdvMenus, AdvToolBtn, ExtCtrls, AdvPanel, StdCtrls;

type
  TForm1 = class(TForm)
    { 중략 여러가지 폼포넌트들...}
    Button1: TButton;
    { 중략 여러가지 procedure선언 }
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
<!--CodeE-->
------------------------------------------------------------------------------
<!--CodeS-->
// Unit2에대한 소스
unit Unit2;

interface

uses Unit1;

type
  BTN_ENABLED = Class (TForm1)
    procedure Button1Click(Sender: TObject);
  public
    procedure Mbtn_Mode(Mode : String); virtual;
  end;

var
  uBTN_ENABLED : BTN_ENABLED;
implementation

procedure BTN_ENABLED.Button1Click(Sender: TObject);
begin
  inherited;
  showmessage('Unit2에서 정의한 메시지!');
end;
<!--CodeE-->
---------------------------------------------------------------------------
이케해서 Form1에 있는 버튼의 OnClick를 Unit1이 아닌 Unit2에서 실행할수 있도록
코딩을 했는데 실행은 되는데 메시지가 나오지를 않아여.. 뭐가 문제 일까여! ㅡ.,ㅡ
고수님들은 조건과 답변을 기다리겠습니다. 즐건 하루 보네시구여!
5  COMMENTS
  • Profile
    빨간피터 2005.02.25 19:56
    일단 Form1의 Button1에서 필요한 작업을 코딩하시고

    Form2의 FormCreate에서 다음과 같이 선언하시면 되겠습니다.

    <!--CodeS-->
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      Btn_Run.OnClick := Form1.Button1Click;
    end;
    <!--CodeE-->


  • Profile
    김현철 2005.02.25 20:50
    근데 전 왜 안돼죠! ㅡ.ㅡ 어떻게 구현하는냐는 상관없는데... 어떤식으로든..
    님이 갈켜주신데로 했는데  -_- 왜 안되는지. 몰겠네여!
    암튼 결론은 Form1에있는 버튼 이벤트가 Unit1에는 전혀 없고, Unit2에서 다 처리해주는것이 목적!
    결국 Form1의Unit1에는 아무런 이벤트가 없겠죠!

    좀더 쉽게 설명을 좀 해주세요! 저가 초보라서..ㅋㅋ

  • Profile
    이중철 2005.02.25 23:36
    보면 TForm1 이라는 클래스는 TForm에서 상속받았으며 또한,
    해당 TForm1에는 UI 정의할 수 있는 Resouce 부를 갖추고
    실제적으로는 TForm1에서 상속받은 TForm2 또는 TForm1에서 상속받은 여러 클래스에서
    해당 Action부분들을 처리할려고 하는것 같네요
    ^^ 아주 좋은 방법이 이고 강추합니다. 전 귀찮아서 하지 못하는 부분인데 님은 실행 하셨네요

    TForm1에는 Button1 이 정의되어 있을 것 입니다.
    그럼 TForm2은 Button1이 클릭되었을 때 어떤 처리를 원하겠고요
    이경우 TForm2의 생성자에서 해당 부분을 연결하는게 필요하죠
    일단, TForm1은 건들지 마세요
    <!--CodeS-->
      BTN_ENABLED = Class (TForm1)
       Private
          procedure OnButton1Click(Sender: TObject);
       public
          constructor Create(AOwner: TComponent); override;
          destructor Destroy; override;
    .....
    .....
    constructor BTN_ENABLED.Create(AOwner: TComponent);
    begin
      inherited;
      Button1.OnClick :=  OnButton1Click;
    end;
    procedure BTN_ENABLED.OnButton1Click(Sender: TObject);
    begin
      showmessage('Unit2에서 정의한 메시지!');
    end;
    <!--CodeE-->

    당연히 폼생성할때 BTN_ENABLED을 생성해야하는거 아시죠^^
    그런데 폼클래스명이 이상하네요


  • Profile
    김현철 2005.02.26 00:36
    님이 말씀해주신데로 바꾸지도 않고 똑같이 적었는데 전 안돼요! ㅡ.,ㅡ ;
    참고 : Unit2는 Form이 없는 Unit만으로 클래스로서 구현하는 것입니다.
             그래서 uses  Unit1, Dialogs, Classes; 기재했구여!
    그리고 destructor Destroy; override; 이부분이 에러가 나더라구여! 그래서 주석을 했었어여!
    에러내용은 : Unsatisfied forward or external decaration : 'BTN_ENABLED.Destroy'이케 에러나요!
    그래서 주석처리하고 실행을 해봤더니 결과는 메시지가 안나와여! 왜글까여! 참고로 del6을 사용합니다.

    시간이 되신다면 샘플로 하나 맹글어 주실수 있으시나여? 어려운 부탁이 아니시라면여!


  • Profile
    이중철 2005.02.26 01:23
    내용을 다시보니 Unit 쪼개기 이네요

    일단 클래스는 하나의 유닛으로 한다. 이것이 델파이의 유닛체계로 알고 있습니다.

    그런데 님은 클래스 하나를 둘로 나누는 것을 시도하는것 같네요

    이 경우 안되는 것으로 알고 있습니다. 그러나 굳이 나누겠다면 할 수 없죠

    방법은 있으니 바로 {$I filename} 이것을 이용하는 것 입니다.

    그리고 위에 제가 설명한것들은 클래스 를 상속 받아 쓰는 방법 이에요

    그럼 제가 소스를 올리니 함 보세요

    버튼1, 버튼2은 상속 받은 거

    버튼3은 유닛쪼개기 입니다.

    두가지 케이스 다 적용 했으니 이해가 될거에요

    전 클래스 상속 받는거 추천입니다. 그럼 이만