2012년 10월 5일 금요일

Record를 TList에 저장

데이터를 분류하여 보관하는  측면에서 보면 단순 변수, 배열, 레코드, 오브젝트 형식이 있다.
단순 변수와 배열은 굳이 이야기 할 필요가 없지만 레코드 부터의 자료 관리 방법을 살펴 보면

TMyRecord = record
No: integer; // 책번호
Name: string; // 책의 제목
end;
PMyREcord = ^TMyRecord;

로 자료가 들어갈 형태를 선언해주고, 실제 자료가 들어 갈 수 있는 변수를 만들어 자료를 보관 한다.
Myrecord : ^TMyRecord;
  또는
MyRecord: PMyRecord;
방법을 사용하여 자료를 보관한다.
자료의 안으로의 접근은 
MyRecord.No;  MyRecord.Name; 또는 PMyRecord^.No, PMyRecord^.Name 형식으로 한다.

예를 들어 실제 값을 넣어보자
procedure TForm2.btRecordAddClick(Sender: TObject);
var
iMyRecord: ^TMyRecord; // iMyRecord: PMyRecord
begin
New(iMyRecord);
iMyRecord.No:= Random(65000);
iMyRecord.Name:= Edit1.Text;
MyList.Add(iMyRecord);
end;

위에서 iMyRecord 는 New() 에 의하여 저장 할 메모리를 확보하고 dispose(iMyRecord)에 의하여 메모리를 돌려 준다.

여러개의 자료를 관리하기 쉽게 샇기 위해서는 샇는 선반 같은 곳이 필요하다. 배열을 이용하여  샇아 둘 수도 있겠지만,
델파이는 TList 라는 클래스가 준비 되어 있다.  //TList<T>하고는 다르다.

MyList : TList
MyList:= TList.create;
하여 MyList 라는 만들어져 있는 보관 장소를 이용하면 된다.

TList 에는 Add, Clear, Delete, IndexOf, Move, Sort, Count 등의 멤버가 이미 만들어져 있으니 상속 받아 사용하면 된다.
주의 할 점은 TList는 Clear 하더라도 그곳에 보관 된 New(iMyRecord)로 만들어져 있는 자료의 메모리 영역은 시스템에 반환이 안된다.
자동 반환이 되게 하기 위히여 TObjectList 가 준비 되어 있다.(차후 설명)
아래와 같이 미리 준비하고 필요하면 없애 줄때 각각의 메모리 공간을 시스템에 돌려 준다.

procedure TForm2.FormCreate(Sender: TObject);
begin
MyList:= TList.Create;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
for var idx in MyList do //2020년 수정
dispose(idx);
FreeAndNil(MyList); //MyList.free
end;

참고로 소팅을 이용하기 위하여는 익명메소드를 사용하여아래와 같이한다.

procedure TForm2.btRecordSortClick(Sender: TObject);
begin
MyList.SortList(functon(Item1, Item2: Pointer): integer //2020년 수정
begin
Result:= CompareText(PMyRecord(Item1).Name, PMyRecord(Item2).Name,)
end
);
end;

이상 레코드를 이용한  자료 저장 방법을 살펴보았다. 다음은 Object를 레코드 처럼 사용하여 보자.





댓글 없음:

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.