Q&A

  • 위 코드를 실행 시키면 자꾸 에러가 납니다. 왜그런지 ?
역시 초보라 어렵네요.

대림출판사의 컨택 delphi5 라는 책을 보는데 에러가 나네요. 왜그런지 고수님의

한수 부탁드립니당.

그리고 결과 값이 3이라는데 왜 3인지도 모르겠네요.

------------------------------------*



unit Unit1;



interface



uses

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

StdCtrls;



type

TForm1 = class(TForm)

Button1: TButton;

아래의 함수 설정은 제가 해준겁니다. 맞는 가요 ?

function AddOne(var X,Y:Integer) :Integer;

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

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



function AddOne(var X, Y:Integer) :Integer; ->>>> 이부분이 책에는 아래의 라인으로 코딩 되어 있어요. 그런데 함수나 리턴값이 있잖아요 그래서 위처럼 코딩하고 선언부분에

함수 선언을 해줬는데 에러가 나네요. 어렵네요



원래 책 소스 : procedure AddOne(var X,Y:Integer);



begin

X := X + 1;

Y := Y + 1;

end;



procedure TForm1.Button1Click(Sender: TObject);

var I: integer;

begin

I := 1;

AddOne(I,I);

ShowMessage(IntToStr(i));

end;



end.



1  COMMENTS
  • Profile
    류제훈 2000.06.11 04:25
    저도 초보지만 답변을 드릴 수 있을 것 같아서 이렇게 올립니다.



    1..사용자 함수나 프로시저를 만들어 폼의 type선언부에 추가하면

    폼의 메소드로서 작용하게 됩니다. 따라서 implementation부에서

    AddOne을 정의할 때에는



    procedure TForm1.AddOne(var X, Y:Integer);

    ^^^^^^

    begin

    {작업내용}

    end;



    이렇게 선언해주어야 합니다.



    폼의 타입선언부에 포함시키지 않고 그냥 사용하시려면

    사용되는 부분 이전에



    procedure AddOne(var X, Y:Integer);

    begin

    {작업내용}

    end;



    이렇게 쓰시면 됩니다.



    2..그리고 procedure는 반환값이 없지만 function은 반환값이 있습니다.

    보통 함수에서 반환값은 함수이름(여기서는 AddOne)이나 result라는 예약어로

    반환을 합니다. (책을 참조해 보세요.)



    3..또한 인수 앞에 var가 붙으면 변수값의 '복사본'이 아니라

    '변수값 그 자체'를 의미합니다.(참조호출)



    버튼1을 누르면 i값에 1을 넣어주고 AddOne의 인수로 i를 보냈죠?

    여기서는 X,Y 모두가 i의 메모리 영역을 가리키는 같은 변수라고

    할 수 있습니다. 즉 x나 Y는 이름만 틀릴 뿐, 사실은 동일한 실체를

    나타내는 것이죠.

    그러므로 결과값이 3이 나오게 됩니다. 마치 함수를 쓴 것 같은 효과죠.

    자세한 건 주석으로 아래 적어놨습니다.



    도움이 되셨기를..



    추신..델파이5 컨택을 보신다고요.. 저도 그책을 얼마전에 샀습니다.

    저는 델파이 초보용 책이 여러권 있는데.. 대부분의 책들이

    델파이를 웬만큼 아는 사람들의 '정리용'으로 적합할 뿐입니다.

    그래서 저는 처음 델파이를 시작할때 분노(?)를 금치못했습니다.

    시도 때도 없이 이해못할 코드들이 나와서요..

    도대체 초보더러 어쩌라는 건지..



    번역서들은 한 술 더떠서 정말이지 초보를 약올리는(?) 수준입니다.

    옆에 선생을 붙여두지 않으면 그 내용을 이해하기에 상당한

    애로사항이 있습니다. 대신 번역서들은 델파이를 어느 정도 익힌 후에는

    상당히 영양가가 있는 내용들이 많습니다.



    제가 초보용 책을 추천한다면.. 김상형님의 <델파이정복4> (가남사)를 권하고

    싶네요. 5가 나왔는지는 잘 모르겠지만.. '완전초보'의 입장에서는

    이 책이 실질적인 도움을 줄 수 있을 것입니다. 이번 질문은 P281~282

    에 답변이 될 내용이 잘 나와있습니다.



    어설픈 초보가..





    {------------------------아래는 수정한 내용입니다.------------------------}



    unit Unit1;



    interface



    uses

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

    StdCtrls;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    procedure AddOne(var X,Y:Integer); //사용자 정의 메소드

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}



    procedure TForm1.AddOne(var X, Y:Integer); // X,Y ->I x,y모두 I값을 가리킨다

    begin

    X := X + 1; // X=2가 된다. (I=2=Y)

    Y := Y + 1; // Y=3이 된다. (I=3=X)

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    var I: integer;

    begin

    I := 1;

    AddOne(I,I); // I값은 1이다...

    ShowMessage(IntToStr(i)); // i값 3이 출력된다.

    end;



    end.



    {--------------------------------------------------------------------------}



    강길남 wrote:

    > 역시 초보라 어렵네요.

    > 대림출판사의 컨택 delphi5 라는 책을 보는데 에러가 나네요. 왜그런지 고수님의

    > 한수 부탁드립니당.

    > 그리고 결과 값이 3이라는데 왜 3인지도 모르겠네요.

    > ------------------------------------*

    >

    > unit Unit1;

    >

    > interface

    >

    > uses

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

    > StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > Button1: TButton;

    > 아래의 함수 설정은 제가 해준겁니다. 맞는 가요 ?

    > function AddOne(var X,Y:Integer) :Integer;

    > ------------------------------------------------------

    > procedure Button1Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > function AddOne(var X, Y:Integer) :Integer; ->>>> 이부분이 책에는 아래의 라인으로 코딩 되어 있어요. 그런데 함수나 리턴값이 있잖아요 그래서 위처럼 코딩하고 선언부분에

    > 함수 선언을 해줬는데 에러가 나네요. 어렵네요

    >

    > 원래 책 소스 : procedure AddOne(var X,Y:Integer);

    >

    > begin

    > X := X + 1;

    > Y := Y + 1;

    > end;

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var I: integer;

    > begin

    > I := 1;

    > AddOne(I,I);

    > ShowMessage(IntToStr(i));

    > end;

    >

    > end.

    >