Q&A

  • procedure 선언 위치에 따른 차이.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
     (1)

  private
    { Private declarations }
  public
    { Public declarations }
  end;

     (2)

한 프로시져를  (1) 위치에 선언하는 것과 (2) 위치에 선언하는 것에는 어떤 차이가 있나요?

이런 질문을 드리는 이유는..

아래코드에서 사용되는 procedure test(S:String);라는 프로시져를 선언한 위치에 따라 (1)에 선언하면 에러가 발생하고
[Error] Unit1.pas(41): Incompatible types: regular procedure and method pointer
(2)에 선언하면 정상적으로 실행됩니다. 물론 (1)에 선언시  아래 코드에서
procedure TForm1.test(S:String);라고 적었습니다.


아래부분이 테스트한 코드입니다.
=====================================
//위 코드부분에 이어서...
type
    TTestProc = procedure(S:String);
var
    Form1: TForm1;

implementation

{$R *.DFM}

procedure test(S:String);
begin
  ShowMessage(S);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  TestProc : TTestProc;
begin
  TestProc := test;  //
  TestProc('1234');
end;

답변 주시면 감사하겠습니다.

미리 감사드려요! :)
2  COMMENTS
  • Profile
    정경철 2003.09.03 21:02
    글쎄요.. 제가 정확히 설명 하는지는 모르겠습니다.

    (1)에 선언된 함수는 현재 유니트에서 사용합니다.
    Type에 TForm1의 클래스에 선언 되어 있으므로
    아래부분에서 함수 원형 부분에 ...
    Procedure TForm1.Text(Str:String);
    이렇게 되어야 하구요.

    (2)부분은 독립적으로 실행되는 함수라고 생각
    하는게 좋을것 같습니다.

    더 고수님 있으면 좋은 설명 부탁 합니다..


  • Profile
    성더기 2003.09.03 20:59
    제가 알기로는...
    (1) 에 선언할 경우 그 프로시져는 폼에 소속되는 것(?)으로 알고 있습니다
    즉 구현도 TForm1.어쩌구 하는 형식으로 구현해야합니다
    (2) 에 선언 하는 경우는 Uint에 소속됩니다..

    차이는 실행시 (1)에 선언을 하고 Form을 Create하지 않은 상태에서 프로시져를 접근하면 오류가 발생합니다. 하지만 (2)에 선언을 했을 경우는 폼을 생성하지 않아도 Unit만 Uses절에 넣어 주면 되는 것으로 알 고 있습니다

    정확한 답이 될지는 모르 겠습니다..만..
    경험상..^^