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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.