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));