0

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 メソッドを呼び出して動的に列のサイズ変更を実行する場合)。 .しかし、この方法がなくても正常に動作していますが、列のサイズ変更はありません...

4

1 に答える 1