Q&A

  • 2개이상의 결과값을 돌려주는 함수
2개 이상의 결과값을 돌려주는 함수를 만들려면 어떻게 해야 하나요?

C에서는 그냥 call by reference로 끝이였던거 같은데..

프로시져에서 포인터를 써야하나요? 여튼 모르겠네요.

5  COMMENTS
  • Profile
    김희중 2000.07.01 21:03
    C에서 Call By Reference로 해결하셨다면 델파이의 인수를 넘겨줄때

    Var을 붙이면 동일하게 작용합니다.

    하지만 저 같은 경우는 그럴경우 Calss를 사용합니다.

    조금 복잡하긴 하지만 입맛대로 데이타를 뽑아 낼수 있으니까요.

    별 도움은 안되시겠지만 제가 작성한 주소찾기를 한번 올려봅니다.

    uses

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

    Db, DBTables, Grids, DBGrids;



    type

    TFindAddress = class

    private

    fData: Array of String;

    fFieldName : Array of String;

    FieldCount : Integer;

    function GetData(index : Integer) : String;

    function GetFieldData(index: String): String;

    public

    property Data[index : Integer] : String read GetData;

    property FieldData[index : String] : String read GetFieldData;

    function FindAddress(sData : String = '';

    Cond : String = ''; x : Integer = 0; y : Integer = 0) : Boolean;

    end;

    type

    TFrmAddrHlp = class(TForm)

    DBGrid1: TDBGrid;

    qCode: TQuery;

    dsCode: TDataSource;

    procedure DBGrid1DblClick(Sender: TObject);

    procedure FormKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    implementation



    {$R *.DFM}



    { TFindAddress }



    function TFindAddress.FindAddress(sData, Cond: String; x,

    y: Integer): Boolean;

    var

    frmAddrHlp: TfrmAddrHlp;

    SqlStr : String;

    ConStr : String;

    i : integer;

    begin

    SqlStr := '';

    ConStr := '';

    frmAddrHlp := TfrmAddrHlp.Create(Nil);

    try

    with frmAddrHlp do

    Begin

    SqlStr := 'SELECT * FROM CD04';

    if sData <> '' then

    Begin

    ConStr := Format(' WHERE CD04020 LIKE ''%%%s%%'' ',[sData]);

    end; //end of if sData <> ''

    if Cond <> '' then

    Begin

    if ConStr = '' then

    ConStr := Format(' WHERE %s ', [Cond])

    else

    ConStr := Format(' %s AND %s ',[ConStr, Cond]);

    end; //end of if Cond <> ''

    if qCode.Active then qCode.Close;

    qCode.Sql.Clear;

    qCode.Sql.Add(SqlStr);

    qCode.Sql.Add(ConStr);

    qCode.Open;

    FieldCount := qCode.FieldCount;

    SetLength(fData,FieldCount);

    SetLength(fFieldName,FieldCount);

    if qCode.IsEmpty then

    Begin

    Result := False;

    end else if qCode.RecordCount = 1 then

    Begin

    for i := 0 to FieldCount -1 do

    Begin

    fData[i] := qCode.Fields[i].AsString;

    fFieldName[i] := qCode.Fields[i].FieldName;

    end; //end of for i -> FieldCount

    Result := True;

    end else

    Begin

    Left := x;

    Top := y;

    if ShowModal = mrOK then

    Begin

    for i := 0 to FieldCount -1 do

    Begin

    fData[i] := qCode.Fields[i].AsString;

    fFieldName[i] := qCode.Fields[i].FieldName;

    end; //end of for i -> FieldCount

    Result := True;

    end else

    Begin

    Result := True;

    end; // end of if ShowModal = mrOK

    end; //end of qCode.IsEmpty

    end; // end of with frmFindAddress

    finally

    frmAddrHlp.Free;

    end;

    end;



    procedure TFrmAddrHlp.DBGrid1DblClick(Sender: TObject);

    begin

    ModalResult := mrOK;

    end;



    function TFindAddress.GetData( index : Integer) : String;

    begin

    Result := fData[index];

    end;



    function TFindAddress.GetFieldData(index: String): String;

    var

    i : Integer;

    begin

    Result := '';

    for i := 0 to FieldCount - 1 do

    Begin

    if index = fFieldName[i] then

    Result := fData[i];

    End;

    end;



    procedure TFrmAddrHlp.FormKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if Key = vk_Return then

    ModalResult := mrOK

    else if Key = vk_Escape then

    ModalResult := mrCancel;

    end;



    end.



    Mr.Q wrote:

    > 2개 이상의 결과값을 돌려주는 함수를 만들려면 어떻게 해야 하나요?

    > C에서는 그냥 call by reference로 끝이였던거 같은데..

    > 프로시져에서 포인터를 써야하나요? 여튼 모르겠네요.

  • Profile
    김일영 2000.07.01 18:50
    안녕하십니까.

    오가는 질문과 답변을 보니 뭔가 약간 오해가 있는듯...

    '2개 이상의 결과값을 돌려주는 함수'라고 하시는 것은...

    프로시져에서 call by reference를 할 수 있느냐 그걸 물어보시는 것 같은데요.

    당연히 됩니다. 프로시져 선언 시 인자 선언부분에서 인자명 앞에 'var '라고

    하나 더 넣어주면 이 인자는 call by reference가 됩니다.

    Object형의 인자는 그냥 call by reference가 되고요.

    제가 알기론 call by reference가 가장 먼저 구현된 언어가 파스칼인줄 알고 있습니다.

    C에서 포인터를 쓰는 것은 문법적으로 말하자면 call by reference는 아니고,

    call by reference를 구현하기 위한 편법입니다.



    Mr.Q wrote:

    > 2개 이상의 결과값을 돌려주는 함수를 만들려면 어떻게 해야 하나요?

    > C에서는 그냥 call by reference로 끝이였던거 같은데..

    > 프로시져에서 포인터를 써야하나요? 여튼 모르겠네요.

  • Profile
    임형호 2000.07.01 10:07
    Mr.Q wrote:

    > 2개 이상의 결과값을 돌려주는 함수를 만들려면 어떻게 해야 하나요?

    > C에서는 그냥 call by reference로 끝이였던거 같은데..

    > 프로시져에서 포인터를 써야하나요? 여튼 모르겠네요.



    제가 알기로는 2개이상의 값을 돌려주는 함수는 없는걸로 알고 있거든요.

    하지만..약간 변칙적이긴해도 함수를 선언할때... 인수값의 대한 형을 선언하쟎습니까?

    그때 변수명앞에 var을 붙여서 2개이상의 값을 리턴하는식의 구현은 가능한걸로 알고있습니다. 물론 그럴경우에는 넘겨주는 인수값이 변하기때문에 주의를 요하지만요.

    잘 구성한다면 상관없을겁니다.

  • Profile
    Mr.Q 2000.07.01 11:23
    임형호 wrote:

    > Mr.Q wrote:

    > > 2개 이상의 결과값을 돌려주는 함수를 만들려면 어떻게 해야 하나요?

    > > C에서는 그냥 call by reference로 끝이였던거 같은데..

    > > 프로시져에서 포인터를 써야하나요? 여튼 모르겠네요.

    >

    > 제가 알기로는 2개이상의 값을 돌려주는 함수는 없는걸로 알고 있거든요.

    > 하지만..약간 변칙적이긴해도 함수를 선언할때... 인수값의 대한 형을 선언하쟎습니까?

    > 그때 변수명앞에 var을 붙여서 2개이상의 값을 리턴하는식의 구현은 가능한걸로 알고있습니다. 물론 그럴경우에는 넘겨주는 인수값이 변하기때문에 주의를 요하지만요.

    > 잘 구성한다면 상관없을겁니다.



    임형호님 어제에 이은 답변 감사합니다. ^.^

    01시38분에 올리셨던데, 야심한 밤에 수고 많으세요..

    지금은 토욜이지요? 여기는 비가 오네요.. 오랜만에 천둥도 친답니다.

    즐거운 주말되시구요.. 편안한밤 되세요.

  • Profile
    임형호 2000.07.01 12:35
    Mr.Q wrote:

    > 임형호 wrote:

    > > Mr.Q wrote:

    > > > 2개 이상의 결과값을 돌려주는 함수를 만들려면 어떻게 해야 하나요?

    > > > C에서는 그냥 call by reference로 끝이였던거 같은데..

    > > > 프로시져에서 포인터를 써야하나요? 여튼 모르겠네요.

    > >

    > > 제가 알기로는 2개이상의 값을 돌려주는 함수는 없는걸로 알고 있거든요.

    > > 하지만..약간 변칙적이긴해도 함수를 선언할때... 인수값의 대한 형을 선언하쟎습니까?

    > > 그때 변수명앞에 var을 붙여서 2개이상의 값을 리턴하는식의 구현은 가능한걸로 알고있습니다. 물론 그럴경우에는 넘겨주는 인수값이 변하기때문에 주의를 요하지만요.

    > > 잘 구성한다면 상관없을겁니다.

    >

    > 임형호님 어제에 이은 답변 감사합니다. ^.^

    > 01시38분에 올리셨던데, 야심한 밤에 수고 많으세요..

    > 지금은 토욜이지요? 여기는 비가 오네요.. 오랜만에 천둥도 친답니다.

    > 즐거운 주말되시구요.. 편안한밤 되세요.



    아직 학생이라서...더구나 방학을 해서요. 아침에 졸린눈 부비며 출근한 직장도 없고, 안일어난다고 난리피는 부인은 더더구나 없으니 이 늦음밤 아니 이른새벽녁까지 학교에 남아 인터넷과 델파이를 벗삼아.... 놀구있습니다. 님께서도 즐거운 주말되시기를 바랍니다.

    참..그리고 저두 네델란드 응원했습니다. 전 공격적인 축구를 좋아하거든요. 후후...