Ver Mensaje Individual
  #5  
Antiguo 17-02-2020
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
He estado revisando el TLISTVIEW de firemonkey y tiene algunas diferencias con respecto al de la VCL en particular creo que no puedes definir columnas, o no he conseguido ver como se definen. El tema de las columnas en el truco anterior era para determinar la posición del progressbar dentro del listView, al no disponer de esta propiedad, la posición hay que darsela a mano.

Y modificando un poco el código anterior, queda así y con este creo que te debe de funcionar:

Código Delphi [-]
unit ListViewItemHelper;

interface

uses Windows, System.Types, FMX.ListView, FMX.StdCtrls;

type
  TListViewItemHelper = class helper for TListViewItem
  private
    function GetProgressBar: TProgressBar;
    function GetListView: TListView;
    procedure SetProgressBar(const Value: TProgressBar);
    property ListView: TListView read GetListView;
    function AssignedProgressBar:Boolean;
  public
    function AddPRogressBar: TProgressBar; overload;
    function AddPRogressBar(ARectF: TRectF): TProgressBar; overload;
    procedure DeleteProgressBar;
    property ProgressBar: TProgressBar read GetProgressBar write SetProgressBar;
  end;

implementation

uses
  Vcl.Dialogs, System.SysUtils;


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


{ TListItemHelper }

function TListViewItemHelper.AddPRogressBar(ARectF: TRectF): TProgressBar;
begin
  Result := AddPRogressBar;
  if Assigned(result) then
    progressBar.BoundsRect := ARectF;
end;

function TListViewItemHelper.AddPRogressBar: TProgressBar;
begin
  if not AssignedProgressBar then begin
    ///  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
    ProgressBar := TProgressBar.Create(ListView);
    /// se le asigna como padre el listView
    ProgressBar.parent := ListView;
  end;
  Result := ProgressBar
end;

function TListViewItemHelper.AssignedProgressBar: Boolean;
begin
  Result := (tag <> 0) and assigned(TObject(Tag)) and (TObject(Tag) is TProgressBar);
end;

procedure TListViewItemHelper.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 := ProgressBar;
    if assigned(pb) then
    try
      freeAndNil(pb);
      ProgressBar := nil;
    except
      on E: Exception do
        error(E, 'TListItemHelper.DeleteProgressBar');
    end;
  except
    on E: Exception do
      error(E, 'TListItemHelper.DeleteProgressBar');
  end;
end;

function TListViewItemHelper.GetListView: TListView;
begin
  result := (Parent as TListView);
end;

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

procedure TListViewItemHelper.SetProgressBar(const Value: TProgressBar);
begin
  if not assigned(Value) then
    Tag := 0
  else
    Tag := Integer(Value);
end;

end.

Y la forma de uso es:

Código Delphi [-]
uses ListViewItemHelper;

var
  MiItem: TListViewItem = Nil;

procedure TForm1.ButtonAddItemClick(Sender: TObject);
begin
  with ListView1.Items do begin
    // añadir un nuevo item al listview
    MiItem := add;
    MiItem.Text := 'mi item';
  end;
end;

procedure TForm1.ButtonAddProgressBarClick(Sender: TObject);
begin
  if Assigned(MiItem) then
    // Insertar un ProgressBar en la posicion requerida
    MiItem.AddPRogressBar(RectF(10, 10, 300, 40));
end;

procedure TForm1.ButtonDeleteProgressBarClick(Sender: TObject);
begin
  if Assigned(MiItem) then
    // eliminar el progressBAr del ITEM
    MiItem.DeleteProgressBar;
end;

Con esto te debería de funcionar
Responder Con Cita