volver vistas una tamaño formulario fila contenido columna clasica cambiar autosizecolumnsmode ancho alto ajustar delphi listview resize draw

delphi - una - vistas en sharepoint 2013



Delphi: error al cambiar el tamaño de las columnas de la Vista de lista(en DrawItem) (1)

Habilite Autosize de columnas y habilite OwnerDraw para una Vista de lista. A continuación, agregue un código a continuación desde AQUÍ :

procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var i: Integer; x1, x2: integer; r: TRect; S: string; const DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER); begin if SameText(Item.SubItems[1], ''done'') then begin Sender.Canvas.Font.Color := clWhite; Sender.Canvas.Brush.Color := clGreen; end else if Odd(Item.Index) then begin Sender.Canvas.Font.Color := clBlack; Sender.Canvas.Brush.Color := $F6F6F6; end else begin Sender.Canvas.Font.Color := clBlack; Sender.Canvas.Brush.Color := clWhite; end; if odSelected in State then // NEW! begin // NEW! Sender.Canvas.Font.Color := clWhite; // NEW! Sender.Canvas.Brush.Color := clNavy; // NEW! end; // NEW! Sender.Canvas.Brush.Style := bsSolid; Sender.Canvas.FillRect(Rect); x1 := 0; x2 := 0; r := Rect; Sender.Canvas.Brush.Style := bsClear; Sender.Canvas.Draw(3, r.Top + (r.Bottom - r.Top - bm.Height) div 2, bm); for i := 0 to ListView1.Columns.Count - 1 do begin inc(x2, ListView1.Columns[i].Width); r.Left := x1; r.Right := x2; if i = 0 then begin S := Item.Caption; r.Left := bm.Width + 6; end else S := Item.SubItems[i - 1]; DrawText(Sender.Canvas.Handle, S, length(S), r, DT_SINGLELINE or DT_ALIGN[ListView1.Columns[i].Alignment] or DT_VCENTER or DT_END_ELLIPSIS); x1 := x2; end; if odFocused in State then // NEW! DrawFocusRect(Sender.Canvas.Handle, Rect); // NEW! end;

Cambia el tamaño de forma activa la penúltima columna si tiene autosize. Se factura errores:

¿Cómo prevenir estos errores?

¡Gracias!


El error está en TListColumn.GetWidth en ''comctrls.pas''. El VCL está recuperando un ancho de columna incorrecto al cambiar el tamaño de las columnas cuando se establece ''AutoSize'' en las columnas, por lo tanto, está dibujando el texto del elemento en todas las columnas.

Miré el código de VCL durante unos minutos y no pude entender cuál es el problema, pero establecer el valor en un getter es bastante sospechoso.

De todos modos, para una solución alternativa, en lugar de

inc(x2, ListView1.Columns[i].Width);

utilizar esta:

inc(x2, ListView_GetColumnWidth(ListView1.Handle, ListView1.Columns[i].Index));