아래는 양병규님께서 올리신 순식간에 Listview에 데이타 올리는 거입니다.
일단에 순식간에 자료 올리는건 저 자료를 기초삼아 만들었는데요.
다음이 문제가 되어서요..
처음에 받은 1000개의 데이타는 저렇게 해서 순식간에 add를 시켰어여..
문제는 다음.
다음에 같은 걸루 caption 은 같구 subItems 들의 값만 바뀔어야 하는데(Update를 해야 한다 이거져....).
이건.. 1초마다 1000개의 데이타가 서버에서 내려와 모두 업데이트 되어야 합니다.
아래와같이 했더니 컬럼으로 소팅두 안되는듯 하구엽.
어찌 해야 되는지 고수님들의 도움 꼬옥 부탁 드립니다.
========= 아래 ===============
델4에는 OwnerData라는 프로퍼티와 OnData라는 이벤트가 있습니다.
TList를 이용해서 아이템을 관리하는 방법인데...
OwnerData를 True로 하면 OnData이벤트가 발생하는데 이것을 이용하면
엄청나게 빠르게 아이템을 추가 할 수 있습니다. 물론 델3에서는 그냥
안되겠죠 델4의 리스트뷰의 OwnerData, OnData와 같은 기능을 델3서 새로운
콤포넌트로 만들면 델3에서도 가능합니다. 메시지를 잘 보면 할 수 있
을겁니다. 이 방법은 실제로 리스트뷰에 아이템을 추가하는것이 아니라
아이템은 TList가 관리하고 리스트뷰의 Items.Count를 TList의 갯수와 같게
맞춰주고 (리스트뷰의 Items.Count는 ReadOnly가 아님. ex)Items.Count := 10000;)
OnData이벤트를 이용해 리스트뷰의 각 아이템을 표시합니다. 고로 실제로
리스트뷰에 아이템을 추가하는것이 아니기때문에 엄청나게 빠른 속도를 구현할수
있습니다. 물론 속도는 TList에 아이템을 얼마나 빠르게 추가하느냐가 관건이죠..
아래 예제는 델4에서 컬럼을 7개로 하고 아이템을 10,000개
추가하는 예제입니다. 약 0.35초정도 걸립니다. 50,000개를 추가하면 1.5초정도
소요됩니다.
ListView 한 개하고 버튼 두 개를 올려놓고(ButtonAdd, ButtonClear)
폼의 Create, Destroy이벤트를 작성하고 ListView의 OwnerData를 True로하고
ListView의 OnData이벤트를 작성하고...
그럼
평안하시길~
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, ImgList, ComCtrls,
Buttons, StdCtrls;
type
PItem = ^TItem;
TItem = record
Images: Integer;
Item1: String;
Item2: String;
Item3: String;
Item4: String;
Item5: String;
Item6: String;
Item7: String;
end;
TForm1 = class(TForm)
ListView1: TListView;
ImageList1: TImageList;
ImageList2: TImageList;
ButtonAdd: TButton;
ButtonClear: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ButtonAddClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
procedure ListView1Data(Sender: TObject; Item: TListItem);
private
FList: TList;
procedure AddNewItem( Index: Integer );
procedure ItemClear;
function GetItem( Index: Integer ): TItem;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FList.Free;
end;
procedure TForm1.AddNewItem( Index: Integer );
var
Item: PItem;
begin
Item := New( PItem );
with Item^ do
begin
Images := 0;
Item1 := IntToStr( Index );
Item2 := Item1 + '.2';
Item3 := Item1 + '.3';
Item4 := Item1 + '.4';
Item5 := Item1 + '.5';
Item6 := Item1 + '.6';
Item7 := Item1 + '.7';
end;
FList.Add( Item );
end;
procedure TForm1.ItemClear;
var
i: Integer;
begin
ListView1.Items.Clear;
with FList do
if Count > 0 then
begin
for i := Count-1 downto 0 do
Dispose( PItem( Items[ i ] ) );
Clear;
end;
end;
function TForm1.GetItem( Index: Integer ): TItem;
begin
Result := PItem( FList.Items[ Index ] )^;
end;
procedure TForm1.ButtonAddClick(Sender: TObject);
const
ACount = 10000;
var
i : Integer;
T: LongInt;
begin
T := GetCurrentTime;
with ListView1.Items do
begin
BeginUpdate;
try
Count := 0;
for i := 1 to ACount do AddNewItem( i );
Count := ACount;
finally
EndUpdate;
end;
end;
Caption := Format( '갯수: %d 소요시간 : %d mm초',[ ACount, GetCurrentTime -
T ] );
end;
procedure TForm1.ButtonClearClick(Sender: TObject);
begin
ItemClear;
end;
{ListView1.OnData Event...
ListView1.OwnerData 프로퍼티 True로 해야한다}
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
with Item, GetItem( Item.Index ) do
begin
Caption := Item1;
ImageIndex := Images;
if TListView( Sender ).ViewStyle = vsReport then
with SubItems do
begin
Add( Item2 );
Add( Item3 );
Add( Item4 );
Add( Item5 );
Add( Item6 );
Add( Item7 );
end;
end;
end;
end.