자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey 동적생성한 컴퍼넌트 해제 질문입니다.
2018.02.28 14:42
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
TMyListView = Class(TListView)
public
constructor Create(AOwner: TComponent); override;
end;
TListViewArray = Class
public
Box : array[1..42] of TMyListView;
end;
var
ListViewArray: TListViewArray;
//동적으로 TListView 생성
ListViewArray:= TListViewArray.Create;
procedure Do_Create;
for r := 0 to ii do begin
for c := 1 to ixx do begin
i := (r * ixx) + c; // i 는 1 ~ 42 까지
//ListView를 42개까지 생성시키면서 프로퍼티를 정함
ListViewArray.Box[i] := TMyListView.Create(Nil);
ListViewArray.Box[i].Width := 50;
ListViewArray.Box[i].Height:= 50;
ListViewArray.Box[i].ID := i;
ListViewArray.Box[i].Position.X := nHoriTerm + (c - 1) * (50+ nHoriTerm);
ListViewArray.Box[i].Position.Y := nTopMargin + r * (50+ nVertTerm);
ListViewArray.Box[i].Parent := FMdiary.Rectangle1;
ListViewArray.Box[i].IsBigState := False;
ListViewArray.Box[i].ItemAppearanceName := TCustomListView.TAppearanceNames.ListItemRightDetail;
ListViewArray.Box[i].ItemSpaces.Left := 0;
ListViewArray.Box[i].ItemSpaces.Right := 0;
ListViewArray.Box[i].HitTest := False;
ListViewArray.Box[i].CanFocus := False;
end;
end;
//동적으로 생성된 TlistView 해제
procedure Do_Destroy;
for i := 0 to ii do
for ix := 1 to ixx do begin
ListViewArray.Box[(i * ixx) + ix].Items.Clear;
ListViewArray.Box[(i * ixx) + ix].Free;
ListViewArray.Box[(i * ixx) + ix] := Nil;
end;
ListViewArray.free;
맨처음 프레임이 생성될때 Do_Create 해서 해당월에 해당하는 일자 만큼 Tlistview을 생성합니다.
다음달 또는 이전달을 클릭하면 Do_Destroy 로 기존 컴포넌트 해제하고 나서
다시 Do_Create 해서 해당월에 해당하는 일자 만큼 Tlistview을 재생성합니다.
이코드가 Xe8 로 컴파일한 앱애서는 다음달, 이전달을 수십번 왔다갔다 해도
데이타까지 뿌려주는 작업 포함 2초 안에 해결됩니다.
하지만 XE10 에서는 다음달, 이전달을 왔다 갔다 할수록 현저히 느려집니다.
TlistView 해제가 안되는 것인지.?
Xe10.2.1 Tokyo 인데 왜 그런지 궁금합니다.
항상 감사합니다.
Firemonkey 동적생성한 컴퍼넌트 해제 질문입니다.
2018.02.28 14:42
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
TMyListView = Class(TListView)
public
constructor Create(AOwner: TComponent); override;
end;
TListViewArray = Class
public
Box : array[1..42] of TMyListView;
end;
var
ListViewArray: TListViewArray;
//동적으로 TListView 생성
ListViewArray:= TListViewArray.Create;
procedure Do_Create;
for r := 0 to ii do begin
for c := 1 to ixx do begin
i := (r * ixx) + c; // i 는 1 ~ 42 까지
//ListView를 42개까지 생성시키면서 프로퍼티를 정함
ListViewArray.Box[i] := TMyListView.Create(Nil);
ListViewArray.Box[i].Width := 50;
ListViewArray.Box[i].Height:= 50;
ListViewArray.Box[i].ID := i;
ListViewArray.Box[i].Position.X := nHoriTerm + (c - 1) * (50+ nHoriTerm);
ListViewArray.Box[i].Position.Y := nTopMargin + r * (50+ nVertTerm);
ListViewArray.Box[i].Parent := FMdiary.Rectangle1;
ListViewArray.Box[i].IsBigState := False;
ListViewArray.Box[i].ItemAppearanceName := TCustomListView.TAppearanceNames.ListItemRightDetail;
ListViewArray.Box[i].ItemSpaces.Left := 0;
ListViewArray.Box[i].ItemSpaces.Right := 0;
ListViewArray.Box[i].HitTest := False;
ListViewArray.Box[i].CanFocus := False;
end;
end;
//동적으로 생성된 TlistView 해제
procedure Do_Destroy;
for i := 0 to ii do
for ix := 1 to ixx do begin
ListViewArray.Box[(i * ixx) + ix].Items.Clear;
ListViewArray.Box[(i * ixx) + ix].Free;
ListViewArray.Box[(i * ixx) + ix] := Nil;
end;
ListViewArray.free;
맨처음 프레임이 생성될때 Do_Create 해서 해당월에 해당하는 일자 만큼 Tlistview을 생성합니다.
다음달 또는 이전달을 클릭하면 Do_Destroy 로 기존 컴포넌트 해제하고 나서
다시 Do_Create 해서 해당월에 해당하는 일자 만큼 Tlistview을 재생성합니다.
이코드가 Xe8 로 컴파일한 앱애서는 다음달, 이전달을 수십번 왔다갔다 해도
데이타까지 뿌려주는 작업 포함 2초 안에 해결됩니다.
하지만 XE10 에서는 다음달, 이전달을 왔다 갔다 할수록 현저히 느려집니다.
TlistView 해제가 안되는 것인지.?
Xe10.2.1 Tokyo 인데 왜 그런지 궁금합니다.
항상 감사합니다.
저는 좀더 근본적인 문제로 접근했으면 합니다.
매번 TListView를 해제 후 생성하는 로직을 재사용하는 로직으로 변경해보시길 권유드립니다.
그러면, 데이터를 출력하는 성능도 단축되고,
위 이슈도 해결될 것으로 보입니다.
위 이슈의 정확한 원인은 저도 잘 모르기만, 그나마 비슷한 변경사항은 10.2 도쿄에서 안드로이드 랜더링(화면출력)하는 기능이 대폭 변경되었습니다.(연관이 있을지는 저도 잘 모르겠네요^^)
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)