Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Indice de un objeto dentro de un ObjectList (https://www.clubdelphi.com/foros/showthread.php?t=83893)

jocaro 12-08-2013 12:47:55

Indice de un objeto dentro de un ObjectList
 
Hola, a ver si podéis ayudarme con un pequeño ejemplo:

Si se crean varias instancias de una determinada clase que se asignan a un ObjectList,

¿Desde el propio código de una de las instancias creadas, se puede conocer su posición en el ObjectList?, o ¿habría que guardar dicha posición al crear la instancia en cuestión?.

Gracias de antemano

maeyanes 12-08-2013 16:01:33

Hola...

Podrías saberlo si en la clase tienes alguna forma de hacer referencia al TObjectList en cuestión, de otra forma, tendrías que crear una propiedad donde guardes ese índice:

Código Delphi [-]
// 1era opción:
TMyObject = class(TObject)
private
  FObjectList: TObjectList;

  function GetIndex: Integer;
public
  property ObjectList: TObjectList read FObjectList write FObjectList;
  property Index: Integer read GetIndex;
end;

implementation

function TMyObject.GetIndex: Integer;
begin
  if Assigned(FObjectList) then
    Result := FObjectList.IndexOf(Self)
  else
    Result := -1
end;

// Ejemplo:
MyObject := TMyObject.Create;
MyObject.ObjectList := AObjectList;
AObjectList.Add(MyObject);

// 2da opción:
TMyObject = class(TObject)
private
  FIndex: Integer;
public
  property Index: Integer read FIndex write FIndex;
end;

// Ejemplo:
MyObject := TMyObject.Create;
MyObject.Index := AObjectList.Add(MyObject);


Saludos...

jocaro 14-08-2013 12:57:50

Hola Maeyanes.

En mi caso, desde la unidad principal, creo una instancia de TObjectList y voy generando instancias de la clase TNotas, que añado al ObjectList.

¿Es válida mi forma de plantearlo? ¿Existen alternativas mas correctas, simples o elegantes de hacerlo?. Gracias por tu ayuda.

El ejemplo del código usado es el siguiente:

Código Delphi [-]
unit SDIMAIN;

interface

uses Windows, Messages, Classes, Graphics, Forms, Controls, Menus, Dialogs,
// etc

type

  TSDIAppForm = class(TForm)
      procedure EstablecerInicio(Sender: TObject);

  // etc

var
  SDIAppForm: TSDIAppForm;

 { Ventanas de notas }
  objVentNot: TObjectList;

implementation

uses BasDat, 
// etc


{$R *.dfm}

procedure TSDIAppForm.EstablecerInicio(Sender: TObject);
begin

  objVentNot := TObjectList< TNota > .Create(False);

  { Creación de form para ver una nota (se crea un form cada vez que se
    selecciona ver una nota) }

  objVentNot.Add(TNota.Create(nil));

  { Asignar puntero a propiedad publica de la clase FNota }
  objVentNot[objVentNot.Count - 1].pVentNot := objVentNot;

  objVentNot[objVentNot.Count - 1].Show;
  
end;

end.

Código Delphi [-]
unit VerNota;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
  // etc

type
  TNota = class(TForm)
    RVVerNota: TRichView;
    //etc.
    
  private
    { Private declarations }
    objVentNot: TObjectList< TNota >; // O solo TObjectList
    iNota: Integer; // Indice de la nota dentro del ObjectList
  public
    { Public declarations }
    property pVentNot: TObjectList< TNota >
      read objVentNot
      write objVentNot;
  end;

var
  Nota: TNota;

implementation

{$R *.dfm}

procedure TNota.FormActivate(Sender: TObject);
begin
  iNota := objVentNot.IndexOf(Self);
end;

procedure TNota.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  objVentNot.Remove(Self);
end;

procedure TNota.btnCopiarTextoPlanoClick(Sender: TObject);
begin
  RVVerNotaCopiarTextoPlano();
end;

procedure TNota.btnDchoCopiarTextoPlanoClick(Sender: TObject);
begin
  RVVerNotaCopiarTextoPlano();
end;

procedure TNota.RVVerNotaCopiarTextoPlano();
begin
  objVentNot[iNota].RVVerNota.CopyTextA;
end;

end.

ecfisa 14-08-2013 20:03:07

Hola jocaro.

Si la clase TNotas es de tipo TForm, en lugar de crear un TObjectList para gestionarlos, ¿ No te sirve usar la variable global Screen ?

Saludos :)

jocaro 15-08-2013 12:08:04

Cita:

Si la clase TNotas es de tipo TForm, en lugar de crear un TObjectList para gestionarlos, ¿ No te sirve usar la variable global Screen ?
Hola ecfisa.

Probaré con Screen.

Gracias y un saludo


La franja horaria es GMT +2. Ahora son las 22:37:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi