//下面的自己分析
procedure TListItems.BeginUpdate;
begin
if FUpdateCount = 0 then SetUpdateState(True);
Inc(FUpdateCount);
end;
procedure TListItems.SetUpdateState(Updating: Boolean);
var
i: Integer;
begin
if Updating then
begin
with Owner do
begin
FSavedSort := SortType;
SortType := stNone;
end;
for i := 0 to Owner.Columns.Count - 1 do
begin
with Owner.Columns[i] as TListColumn do
if WidthType < 0 then
begin
FPrivateWidth := WidthType;
FWidth := Width;
DoChange;
end;
end;
SendMessage(Handle, WM_SETREDRAW, 0, 0);
if Owner.ColumnsShowing and Owner.ValidHeaderHandle then
SendMessage(Owner.FHeaderHandle, WM_SETREDRAW, 0, 0);
end
else if FUpdateCount = 0 then
begin
Owner.SortType := Owner.FSavedSort;
for i := 0 to Owner.Columns.Count - 1 do
begin
with Owner.Columns[i] as TListColumn do
if FPrivateWidth < 0 then
begin
Width := FPrivateWidth;
FPrivateWidth := 0;
end;
end;
FNoRedraw := True;
try
SendMessage(Handle, WM_SETREDRAW, 1, 0);
Owner.Invalidate;
finally
FNoRedraw := False;
end;
if Owner.ColumnsShowing and Owner.ValidHeaderHandle then
SendMessage(Owner.FHeaderHandle, WM_SETREDRAW, 1, 0);
end;
end;
procedure TListItems.EndUpdate;
begin
Dec(FUpdateCount);
if FUpdateCount = 0 then SetUpdateState(False);
end;