Delphi XE4 (Windows 7 環境) で TJVListview の列幅を動的にサイズ変更すると問題が発生します。リストビューに巨大なデータがある場合、アプリケーションは列のサイズ変更に時間がかかり、アクセス違反をスローすることがあります。列のサイズを変更するために以下のコードを使用しています。
for i := 0 to LV.Columns.Count -1 do
begin
if LV.Columns.Items[i].Tag = 0 then
begin
LV.Columns.Items[i].Width := ColumnTextWidth;
LV.Columns.Items[i].Width := ColumnHeaderWidth;
end;
end;
以前は、同じコードが Delphi 2009 で正常に動作していました。この問題は、customdrawitem イベント (リストビュー内に画像を配置する場所) を使用している場合にのみ気付きました。テキスト表示のみの通常のリストビューの場合、上記のコードは正常に機能しています。
Column AutoSize プロパティを true に設定して使用しようとしましたが、役に立ちません。
この問題を克服する方法についての提案。実際、アプリケーションの多くの場所で TJVlistview コンポーネントを使用しています。
よろしく、シラン。
コード:
1) 私のフォームには、JVListview、Button、およびイメージリストがあります。リストビューにロードするためのボタン。2) Advancecustomdrawitem で、BMP コントロールを配置し、行の色を交互に変更しようとしました...
procedure TForm1.Button1Click(Sender: TObject);
var
i, ii: Integer;
ListItem: TListItem;
strVal : String;
begin
strVal := 'Test String';
try
ListView.Items.BeginUpdate;
LockWindowUpdate(listview.handle);
try
ListView.Clear;
for i := 1 to 15 do
begin
ListItem := ListView.Items.Add;
ListItem.SubItems.Add(strVal +'_' +IntToStr(i));
ListItem.SubItems.Add(strVal +'_' +IntToStr(i));
ListItem.SubItems.Add(strVal +'_' +IntToStr(i));
ListItem.SubItems.Add(strVal +'_' +IntToStr(i));
ListItem.SubItems.Add(strVal +'_' +IntToStr(i));
end;
finally
// for resizing the columns based on the text size
FitToTextWidth(ListView);
ListView.Items.EndUpdate;
LockWindowUpdate(0);
end;
except
on E: Exception do
MessageDlg(PWideChar(E.Message), TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0);
end;
end;
procedure TForm1.FitToTextWidth(LV: TListView);
var
i : integer;
begin
// Set the Column width based on based on textwidth and headerwidth
for i := 0 to LV.Columns.Count -1 do
begin
if LV.Columns.Items[i].Tag = 0 then
begin
LV.Columns.Items[i].Width := ColumnTextWidth;
LV.Columns.Items[i].Width := ColumnHeaderWidth;
end;
end;
end;
procedure TForm1.LISTVIEWAdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
var DefaultDraw: Boolean);
Var
R : TRect;
C : TCanvas;
B : TBitMap;
begin
// Set C
C := (Sender as TListView).Canvas;
// Set R
R := Item.DisplayRect(drLabel);
B := TBitMap.Create;
B.Transparent := True;
B.TransparentColor := clWhite;
// based on item index set the image and change the row color
if odd(item.Index) = true then
begin
ImageList.GetBitmap(0,B);
TJvListItem( Item ).Brush.Color := clWhite;
TJvListItem( Item ).Font.Color := clBlack;
end
else
begin
ImageList.GetBitmap(1,B);
TJvListItem( Item ).Brush.Color := clMoneyGreen;
TJvListItem( Item ).Font.Color := clBlack;
end;
C.Draw(R.Left + 5 ,R.Top, B);
B.Free;
end;
上記のコードは Delphi 2009 でうまく動作します...しかし、現在 Win 7 環境で XE4 に移行しようとしています..ここでの私の問題は、リスト ビューの読み込みに時間がかかることです (FitToTextWidth メソッドを呼び出して動的に列のサイズ変更を実行する場合)。 .しかし、この方法がなくても正常に動作していますが、列のサイズ変更はありません...