자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey 파이어몽키 ListBox에서 목록 삭제 방법 문의
2016.04.29 10:53
안녕하세요?
델파이 시애틀을 이용하여 모바일 앱을 개발하려고 연구중입니다.
이번 질문은 ListBox에 TFrame를 이용하여 사원 목록을 만들었습니다.
ListBox에 리스트를 만들고 수정하는 법도 익혔습니다.
그런데 ListBox에서 특정 인덱스의 리스트를 삭제하는 방법을 못 찾고 있습니다.
예를 들면 체크된 리스트 아이템만 골라서 리스트에서 제거하려고 하는데 제거하는 매서드가 무엇인지요?
아래는 ListBox에 TFrame을 생성하여 리스트화하는데 사용한 매서드와 특정 인덱스의 리스트를 수정해본 소스입니다.
//ListBox에 프레임을 생성해서 붙임
procedure TForm1.AddWorkPlan(ListBox: TListBox; FrameHeight:integer; FrameCode, STCode, STName, STBCode, STJCode, ImageUrl: String;
BGColor, NameColor, BCodeColor: Cardinal);
var item : TListBoxItem;
iFrmWorkPlan : TFrmWorkPlanFrame;//리스트에 붙여질 프레임
begin
ListBox.BeginUpdate;
Item := TListBoxItem.Create(ListBox);//리스트박스의 리스트에 붙을 아이템하나 생성
iFrmWorkPlan := TFrmWorkPlanFrame.Create(self);//아이템에에 붙일 프레임을 하나 생성
iFrmWorkPlan.Parent:= item;//프레임을 아이템관리자의 하위개체로 등록
iFrmWorkPlan.Name := FrameCode;//프레임을 별도 제어하기 위해 이름을 지정.
iFrmWorkPlan.Width := ListBox.Width;
iFrmWorkPlan.Width := ListBox.Width;
iFrmWorkPlan.Height := FrameHeight;
iFrmWorkPlan.Position.X := 0;
iFrmWorkPlan.Position.Y := 0;
//프레임의 개별 컴포넌트의 값 설정
iFrmWorkPlan.HideValue1 := STCode;
iFrmWorkPlan.HideValue2 := STCode;
iFrmWorkPlan.HideValue3 := STCode;
iFrmWorkPlan.STName.Text := STName;
iFrmWorkPlan.STJCode.Text := STBCode + ' - ' + STJCode;
iFrmWorkPlan.background.Fill.Color := BGColor;
iFrmWorkPlan.background.Stroke.Color := BGColor;
iFrmWorkPlan.STName.TextSettings.FontColor := NameColor;
iFrmWorkPlan.STJCode.TextSettings.FontColor := BCodeColor;
item.Height := iFrmWorkPlan.Height;
item.Width := iFrmWorkPlan.Width ;
item.OnApplyStyleLookup := WorkPlanLookup;//리스트박스의 아이템이 화면에 보일때 처리할 내용.(한번에 불러오기 너무 큰 데이터들은 보일때 부분부분씩 불러올수 있음).Pay_ItemApplyStyleLookup함수를 만들어서 해당 함수가 작동
item.Data := iFrmWorkPlan;//아이템에 만들어진 프레임을 붙임
ListBox.AddObject(item); //리스트 박스에 생성한 아이템을 붙임
ListBox.EndUpdate;
end;
//리스트 10개 생성
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
for i := 0 to 10 do
begin
AddWorkPlan(ListBox1, 100+(i*10), 'WP'+IntToStr(i), 'WP'+IntToStr(i+1), '철수'+IntToStr(i), '부서'+IntToStr(i), '대리', '');
end;
end;
//2번째 리스트아이템 이름 변경
procedure TForm1.Button2Click(Sender: TObject);
var item : TListBoxItem;
begin
item := ListBox1.ListItems[1];//1번째 아이템을 불러온다.
(item.Data as TFrmWorkPlanFrame).STName.Text := '영희'+IntToStr(1); //프레임형태로 형변환 하여 이름값 변경
end;
Firemonkey 파이어몽키 ListBox에서 목록 삭제 방법 문의
2016.04.29 10:53
안녕하세요?
델파이 시애틀을 이용하여 모바일 앱을 개발하려고 연구중입니다.
이번 질문은 ListBox에 TFrame를 이용하여 사원 목록을 만들었습니다.
ListBox에 리스트를 만들고 수정하는 법도 익혔습니다.
그런데 ListBox에서 특정 인덱스의 리스트를 삭제하는 방법을 못 찾고 있습니다.
예를 들면 체크된 리스트 아이템만 골라서 리스트에서 제거하려고 하는데 제거하는 매서드가 무엇인지요?
아래는 ListBox에 TFrame을 생성하여 리스트화하는데 사용한 매서드와 특정 인덱스의 리스트를 수정해본 소스입니다.
//ListBox에 프레임을 생성해서 붙임
procedure TForm1.AddWorkPlan(ListBox: TListBox; FrameHeight:integer; FrameCode, STCode, STName, STBCode, STJCode, ImageUrl: String;
BGColor, NameColor, BCodeColor: Cardinal);
var item : TListBoxItem;
iFrmWorkPlan : TFrmWorkPlanFrame;//리스트에 붙여질 프레임
begin
ListBox.BeginUpdate;
Item := TListBoxItem.Create(ListBox);//리스트박스의 리스트에 붙을 아이템하나 생성
iFrmWorkPlan := TFrmWorkPlanFrame.Create(self);//아이템에에 붙일 프레임을 하나 생성
iFrmWorkPlan.Parent:= item;//프레임을 아이템관리자의 하위개체로 등록
iFrmWorkPlan.Name := FrameCode;//프레임을 별도 제어하기 위해 이름을 지정.
iFrmWorkPlan.Width := ListBox.Width;
iFrmWorkPlan.Width := ListBox.Width;
iFrmWorkPlan.Height := FrameHeight;
iFrmWorkPlan.Position.X := 0;
iFrmWorkPlan.Position.Y := 0;
//프레임의 개별 컴포넌트의 값 설정
iFrmWorkPlan.HideValue1 := STCode;
iFrmWorkPlan.HideValue2 := STCode;
iFrmWorkPlan.HideValue3 := STCode;
iFrmWorkPlan.STName.Text := STName;
iFrmWorkPlan.STJCode.Text := STBCode + ' - ' + STJCode;
iFrmWorkPlan.background.Fill.Color := BGColor;
iFrmWorkPlan.background.Stroke.Color := BGColor;
iFrmWorkPlan.STName.TextSettings.FontColor := NameColor;
iFrmWorkPlan.STJCode.TextSettings.FontColor := BCodeColor;
item.Height := iFrmWorkPlan.Height;
item.Width := iFrmWorkPlan.Width ;
item.OnApplyStyleLookup := WorkPlanLookup;//리스트박스의 아이템이 화면에 보일때 처리할 내용.(한번에 불러오기 너무 큰 데이터들은 보일때 부분부분씩 불러올수 있음).Pay_ItemApplyStyleLookup함수를 만들어서 해당 함수가 작동
item.Data := iFrmWorkPlan;//아이템에 만들어진 프레임을 붙임
ListBox.AddObject(item); //리스트 박스에 생성한 아이템을 붙임
ListBox.EndUpdate;
end;
//리스트 10개 생성
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
for i := 0 to 10 do
begin
AddWorkPlan(ListBox1, 100+(i*10), 'WP'+IntToStr(i), 'WP'+IntToStr(i+1), '철수'+IntToStr(i), '부서'+IntToStr(i), '대리', '');
end;
end;
//2번째 리스트아이템 이름 변경
procedure TForm1.Button2Click(Sender: TObject);
var item : TListBoxItem;
begin
item := ListBox1.ListItems[1];//1번째 아이템을 불러온다.
(item.Data as TFrmWorkPlanFrame).STName.Text := '영희'+IntToStr(1); //프레임형태로 형변환 하여 이름값 변경
end;
자답:
//해당 인덱스의 ListItem을 불러와서 ListBox.RemoveObject매서드를 이용하면 삭제가 가능하네요.
procedure TForm1.Button4Click(Sender: TObject);
var item : TListBoxItem;
begin
item := ListBox1.ListItems[2];//2번째 아이템을 불러온다.
ListBox1.RemoveObject( item );
end;
그런데 위와같이 삭제하면 해당 리스트는 삭제가 되는데 ListBox.Clear;하면 리스트가 클리어되지만 삭제되었던 Frame의 Name이 겹쳐서 다시 해당 ListBox에 TFrame을 추가할때 에러가 납니다. TFrame이 메모리에 남아있어서 다음번 추가때 같은 Name(순번)을 사용하면 에러가 나는 듯 합니다. ListBox.clear로 삭제한 Frame은 Name속성이 겹치지 않습니다.