Ver Mensaje Individual
  #4  
Antiguo 14-02-2020
Avatar de RebeccaGL
RebeccaGL RebeccaGL is offline
Miembro
 
Registrado: ene 2008
Posts: 199
Reputación: 17
RebeccaGL Va por buen camino
Buenas Bucanero, le hice unas modificaciones, agregue otras unidades para que funcione para Android, pero aun salen errores como:
Variable Data no existe

Estoy usando Delphi Rio 10.3, quisas sea por las versiones cada vez son diferentes, pero seguire buscando, gracias.

Código Delphi [-]
unit ListItemHelpers;

interface

uses
  Windows, Vcl.ComCtrls,
  FMX.ListView, FMX.ListView.Types, FMX.Grid.Style, FMX.ListView.Appearances,
  FMX.ListView.Adapters.Base, FMX.StdCtrls;

type
  TListItemHelper = class helper for TListItem
  private
    function GetRect(AColumn: Integer): TRect;
    function GetProgressBar: TProgressBar;
  public
    procedure AdjustProgressBar;
    function AddPRogressBar(AColumn: integer = 1): TProgressBar;
    procedure DeleteProgressBar;
    property ProgressBar: TProgressBar read GetProgressBar;
  end;

implementation

uses
  Vcl.Dialogs, System.SysUtils,  System.UITypes;

procedure Error(E:Exception; const msgTxt:String);
begin
  {$IF DEFINED(MSWINDOWS)}
  MessageDlg(E.Message + #13 + msgTxt, mtError, [mbOK], 0);
  {$ENDIF)}
end;

{ TListItemHelper }

function TListItemHelper.AddPRogressBar(AColumn: integer): TProgressBar;
/// Si AColumn es igual 0 entonces se situa en la ultima columna
begin
  if assigned(Data) then begin
    Result := data;
    exit;
  end;
  ///  se le asigna como OWNER del PROGRESSBAR el listView propietario del LISTITEM
  ///  en donde queremos el PROGRESSBAR, para que asi, se libere automaticamente
  ///  tambien al liberar el listView
  result := TProgressBar.Create(TListView);
  /// se le asigna como padre el listView
  result.parent := TListView;
  /// El dobleBuffered evita el parpadeo
  result.DoubleBuffered := true;
  if (AColumn <= 0) then
    AColumn := 1;
  /// El tag del progresBass va a ser el numero de columna
  /// dentro del listItem donde se situa el propio ProgressBar
  result.Tag := AColumn;
  /// se guarda el puntero al ProgressBar en el campo DATA del ListItem
  Data := result;
  AdjustProgressBar;
end;

procedure TListItemHelper.AdjustProgressBar;
var
  pb: TProgressBar;
begin
  pb := Data;  //<-- listItem.data
  if assigned(pb) then
    /// El tag del progresBass va a ser el numero de columna
    /// dentro del listItem donde se situa el propio ProgressBar
    pb.BoundsRect := GetRect(pb.Tag);
end;

procedure TListItemHelper.DeleteProgressBar;
var
  pb: TProgressBar;
begin
  /// al liberar el ProgressBar no se por que da un error,
  /// asi que en principio lo dejo sin liberar.
  /// Aunque queda pendiente de ver por que lo hace.
  /// Tampoco supone un gran problema porque se creo con padre
  /// y ya se encarga el proceso de eliminarlo automaticamente
  try
    pb := Data;
    if assigned(pb) then
    try
      freeAndNil(pb);
      data := Nil;
    except
      on E: Exception do
        error(e, 'TListItemHelper.DeleteProgressBar');
    end;
  except
    on E: Exception do
      error(E, 'TListItemHelper.DeleteProgressBar');
  end;
end;

function TListItemHelper.GetProgressBar: TProgressBar;
begin
  try
    Result := nil;
    if not Assigned(Data) then
      AddPRogressBar;
    result := TObject(Data) as TProgressBar
  except
    on E: Exception do
      Error(E, 'TListItemHelper.GetProgressBar');
  end;
end;

function TListItemHelper.GetRect(AColumn: Integer): TRect;
var
  i: longint;
begin
  result := DisplayRect(drBounds);
  // last column is to take progress bar
  with TListView(ListView) do begin
    if AColumn = 0 then
      AColumn := columns.Count - 1;
    for i := 1 to AColumn do
      result.left := result.left + columns[i - 1].Width;
    result.right := result.Left + columns[AColumn].Width;
  end;
end;

end.

Última edición por RebeccaGL fecha: 14-02-2020 a las 03:19:04.
Responder Con Cita