Q&A

  • ListView질문있습니다.
지금 아래의 소스좀 봐주세요...

현재디렉토리의 화일과 몇가지 정보를 Explorer처럼

ListView를 이용해서 구현중인데...

한가지 문제가 있습니다.

너무 느려요... 이거 왜 이렇죠...??

윈도우의 explorer는 금방 화면에 보여주는데...

제건 약 400여 개의 화일및 디렉토리를 리스트뷰에 표시하는데,

약 30초가 걸립니다. 이거 왜이렇죠...

아래에 소스를 첨부합니다. 좀 봐주세요....

---------------------------------------

procedure TForm1.DispListView(Dir:string);

var

ListItem : TListItem;

SearchRec : TSearchRec;

RetCode : Integer;

begin

Screen.Cursor:=crHourGlass;

ListView1.Items.Clear;

ListView1.ViewStyle:=TViewStyle(vs);

if Dir[Length(Dir)] <> '' then

Dir:=Dir+'';



CurDir:=Dir;

RetCode:=FindFirst(Dir+'*.*',faAnyFile-faVolumeID,SearchRec);

while RetCode = 0 do

begin

ListItem:=ListView1.Items.Add;

// StatusBar1.SimpleText:=IntToStr(ListView1.Items.Count); //이걸로 카운트를 살펴보니 수가 높아질수록

//느려지더군요... ^^;

ListItem.Caption:=SearchRec.FindData.cFileName;

if (SearchRec.Attr = faDirectory) then

ListItem.ImageIndex:=0

else

ListItem.ImageIndex:=1;



// ListItem.StateIndex:=-1;

ListItem.SubItems.Add(FileSizeToStr(SearchRec.FindData.nFileSizeHigh,SearchRec.FindData.nFileSizeLow));

ListItem.SubItems.Add(FileTimeToStr(SearchRec.FindData.ftCreationTime));

ListItem.SubItems.Add(FileTimeToStr(SearchRec.FindData.ftLastWriteTime));



RetCode:=FindNext(SearchRec);

end;

Screen.Cursor:=crDefault;

end;



1  COMMENTS
  • Profile
    이정욱 1999.05.22 01:21
    BeginUpdate와 EndUpdate를 사용해 보세요.

    이것을 사용하면 더해지는 중간에는 업데이트가 내부에서 되고 EndUpdate가 되는순간 화면으로 뿌리게 됩니다. 속도가 빨라지죠. 많은양의 데이타를 ListView나 ListBox에 추가할 때 사용합니다.

    아래코드에 제가 추가를 해 놓았으니 참고하세요.



    김봉재 wrote:

    > 지금 아래의 소스좀 봐주세요...

    > 현재디렉토리의 화일과 몇가지 정보를 Explorer처럼

    > ListView를 이용해서 구현중인데...

    > 한가지 문제가 있습니다.

    > 너무 느려요... 이거 왜 이렇죠...??

    > 윈도우의 explorer는 금방 화면에 보여주는데...

    > 제건 약 400여 개의 화일및 디렉토리를 리스트뷰에 표시하는데,

    > 약 30초가 걸립니다. 이거 왜이렇죠...

    > 아래에 소스를 첨부합니다. 좀 봐주세요....

    > ---------------------------------------

    > procedure TForm1.DispListView(Dir:string);

    > var

    > ListItem : TListItem;

    > SearchRec : TSearchRec;

    > RetCode : Integer;

    > begin

    > Screen.Cursor:=crHourGlass;

    > ListView1.Items.Clear;



    ListView1.Items.BeginUpdate // 여기를 잘 보세요.~~~~~~~~~~~~~~~~~~~~



    > ListView1.ViewStyle:=TViewStyle(vs);

    > if Dir[Length(Dir)] <> '' then

    > Dir:=Dir+'';

    >

    > CurDir:=Dir;

    > RetCode:=FindFirst(Dir+'*.*',faAnyFile-faVolumeID,SearchRec);

    > while RetCode = 0 do

    > begin

    > ListItem:=ListView1.Items.Add;

    > // StatusBar1.SimpleText:=IntToStr(ListView1.Items.Count); //이걸로 카운트를 살펴보니 수가 높아질수록

    > //느려지더군요... ^^;

    > ListItem.Caption:=SearchRec.FindData.cFileName;

    > if (SearchRec.Attr = faDirectory) then

    > ListItem.ImageIndex:=0

    > else

    > ListItem.ImageIndex:=1;

    >

    > // ListItem.StateIndex:=-1;

    > ListItem.SubItems.Add(FileSizeToStr(SearchRec.FindData.nFileSizeHigh,SearchRec.FindData.nFileSizeLow));

    > ListItem.SubItems.Add(FileTimeToStr(SearchRec.FindData.ftCreationTime));

    > ListItem.SubItems.Add(FileTimeToStr(SearchRec.FindData.ftLastWriteTime));

    >

    > RetCode:=FindNext(SearchRec);

    > end;

    > Screen.Cursor:=crDefault;



    ListView1.Items.EndUpdate; // 여기도 잘 보세요~~~~~~~~~~~~~~~~~~~~~



    > end;

    >