PDA

Ver la Versión Completa : Indice de un objeto dentro de un ObjectList


jocaro
12-08-2013, 12:47:55
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:


// 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:

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

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.

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