비주얼 베이직을 쓰다가 델파이를 배우고 있습니다. 델파이는 만진지 얼마되지 않아 잘 다루지 못하는 상태입니다.
질문할 내용은 델파이에서 컴포넌트 배열을 만드는 방법입니다.
비주얼베이직에서는 컨트롤의 이름을 똑같이 지정해주고 속성에서 index 부분을 0,1,2,.. 로 조절해주면 자동으로 컨트롤 배열을 만들어 주었는데 델파이에서는 어떻게 해야하는지 궁금합니다.
한 번에 여러 개의 컴포넌트를 조작할 일이 있는데 컨트롤마다 일일이 코딩을 해 주려니(내용도 똑같은 코드) 비경제적이라는 생각이 듭니다.
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를 고쳐주세요..
그럼..