Q&A

  • 컴포넌트 배열
비주얼 베이직을 쓰다가 델파이를 배우고 있습니다. 델파이는 만진지 얼마되지 않아 잘 다루지 못하는 상태입니다.

질문할 내용은 델파이에서 컴포넌트 배열을 만드는 방법입니다.
비주얼베이직에서는 컨트롤의 이름을 똑같이 지정해주고 속성에서 index 부분을 0,1,2,.. 로 조절해주면 자동으로 컨트롤 배열을 만들어 주었는데 델파이에서는 어떻게 해야하는지 궁금합니다.
한 번에 여러 개의 컴포넌트를 조작할 일이 있는데 컨트롤마다 일일이 코딩을 해 주려니(내용도 똑같은 코드) 비경제적이라는 생각이 듭니다.
3  COMMENTS
  • Profile
    착한천사 2006.01.15 22:00
    컴포넌트를 배열로 사용할 수 있는지에 대해서 물어보셨군요..
    Delphi Syntax에 보시면(책같은것에서 보시거나, Help를 보시면) 배열선언 부분이 있을 것입니다.
    물론, 방법은 C/C++ 언어와 비슷하게 정적,동적 Array 방식 및 직접적인 Memory 접근형태인(C/C++형태) Pointer 배열방식을 취할 수 있습니다.
    Pointer 배열은 그 사용방법상 귀찮으므로,
    주로, 정적,동적 Array(전역변수,지역변수를 막론하고) 방식을 사용합니다.
    왜냐하면, Delphi에서 T컴포넌트(예를들면, TEdit, TMemo등)등으로 컴포넌트가 객체를 선언하는데,
    그 객체는 일종의 pointer처럼 선언되어지기 때문입니다.
    따라서, 그 객체를 변수선언 후 Object를 Create한 후 그 값을 받아야(Assign) 하는 방법을 취합니다.
    예를 들면,
    <!--CodeS-->
    Procedure 프로시저명([인수1],[인수]...[인수n])
    Var
       TArray: Array[0..5] of TEdit; //0~5까지 총 6개의 TEdit를 받을 수 있는 변수
       i: integer;
    begin
         Try
             TArray[0] := TEdit.Create(Self);
              .
              .
              .
             TArray[5] := TEdit.Create(Self);

             TArray[0].Text := '가나다라마바';
             TArray[5].Text := '착한천사';
            //처리구문

              ShowMessage(TArray[5].Text); //만약, TArray[5] := TEdit.Create(Self); 한 곳이 없다면 Error 발생
          Finally
              For i := 0 To 5 Do Begin TArray[i].Free; TArray[i] := Nil; End; // 사용이 끝난 후 모두 메모리에서 제거
          End;
    end;
    <!--CodeE-->
    이런식이지요.. 즉, 컴포넌트는 동적으로 사용하기 위해서는 먼저 선언한 후 Create 를 받아서
    그 Pointer를 받는 형태를 취하게 됩니다..
    Create 받은 Object는 Form이 Close되기전에 반드시 Free를 시켜주어야만 합니다.
    동적인 방법은 GetMem(변수를 Pointer로 선언시 사용), SetLength(동적 Array선언)로 할당할 수 있습니다.
    일단, Pointer 선언으로 인한 GetMem활용은 SetLength와 비슷하니 쉬울 것입니다.
    즉, GetMem으로 메모리 할당받고, FreeMem으로 해체하는 것입니다.
    Delphi에서는 SetLength를 쓰는 것인 안전하다고 보여집니다. (물론, 개인적인 생각입니다.)

    Procedure 프로시저명([인수1],[인수]...[인수n])
    Var
       TArray: Array of TEdit; //TEdit를 받을 수 있는 동적변수
       i: integer;
    begin
         SetLength(TArray, 배열개수); //배열개수만큼 배열이 생성됨 Index는 0~배열개수-1

         Try
             TArray[0] := TEdit.Create(Self);
              .
              .
              .
             TArray[5] := TEdit.Create(Self);

             TArray[0].Text := '가나다라마바';
             TArray[5].Text := '착한천사';
            //처리구문

              ShowMessage(TArray[5].Text); //만약, TArray[5] := TEdit.Create(Self); 한 곳이 없다면 Error 발생
          Finally
              For i := 0 To 5 Do Begin TArray[i].Free; TArray[i] := Nil; End; // 사용이 끝난 후 모두 메모리에서 제거
              Finalize(TArray); //SetLenth로 배열할당 후 Finalize로 배열제거
          End;
    end;
    <!--CodeE-->

    답이 되셨는지 모르겠습니다.
    Code가 Delphi에서 직접 테스트해보진 않았지만(답변쓴다고.. ^^;)
    대충 보시면 내용을 이해하시리라 생각됩니다.
    Syntax 에러가 난다면, 책 또는 Help를 참고하셔서 Syntax를 고쳐주세요..
    그럼..



  • Profile
    Marek 2006.01.11 03:22



    안녕하세요.

    VB는 컨트롤배열을 사용할수 있는데 Delphi는 배열이 없습니다.
    대신 Property에보면 Tag라는 것이 있어서 이 Tag값을 순서대로 주게되면 배열과 동일한
    기능을 구현할 수 있습니다.  단 몇줄의 코딩이 추가되겠져..


    즐코하세여.

    Marek
  • Profile
    김창환 2006.01.13 19:29
    답변 감사드립니다.