Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Referencias a componentes (https://www.clubdelphi.com/foros/showthread.php?t=6905)

tica 27-01-2004 16:05:01

Referencias a componentes
 
Hola

Segun entiendo un componente puede ser tratado como un objeto, entonces trate de ejecutar este procedimiento:
Código:

procedure Tprincipal.habilitarItems (item: TMenuItem);
begin
  if (item.HasParent ) then
    habilitarItems (item.Parent);
  item.Visible:=true;
end;

Solo que al momento de ejecutarse me sale errores de que el item no ha sido creado, lo cual esta bien. Como puedo realizar referencias a los componentes.

eduarcol 27-01-2004 23:05:47

mira el problema que tu presentas es de tipo por que siempre le envias al procedimiento el padre del componente actual, lo que deberias es comprobar si el componente que te esta llegando es un TMenuItem que es el parametro que espera, la forma de asegurarnos de esto es hacer esta pequeña modificacion al codigo

Código:

procedure Tprincipal.habilitarItems (item: TMenuItem);
begin
  //LINEA PROPUESTA
  if not(item is TMenuItem) then Exit;
  //asi te aseguras de que estas trabajando con tmenusitem y no con otro componente que sea padre del menu
  if (item.HasParent ) then
    habilitarItems (item.Parent);
  item.Visible:=true;
end;


si el problema es que el componente no se ha creado entonces el error esta en la primera llamada del procedimiento porq luego el ciclo trabaja solo con los padres que son componentes ya creados


suerte

marto 28-01-2004 09:32:54

Una pequeña puntualización:

Cita:

Empezado por eduarcol
//LINEA PROPUESTA
if not(item is TMenuItem) then Exit;
//asi te aseguras de que estas trabajando con tmenusitem y no con otro componente que sea padre del menu

Lo que aquí propone educarol, funciona, aunque, bajo mi punto de vista es conceptualmente incorreto. El parametro item siempre sera del tipo TMenuItem, lo que pasa es que si nos passan una referencia a nil, no podremos contiunuar. Creo que seria más elegante (aunque igual de efectivo dejar el procedimiento así:
Código:

procedure TForm1.habilitarItems(item: TMenuItem);
begin
  if (Assigned(item.Parent) ) then
    habilitarItems (item.Parent);
  item.Visible:=true;
end;

¿Por qué cambiar HasParent por Assigned?

Cita:

Empezado por Delphi Help
ndicates that the menu item has a parent that is responsible for loading and saving its data.

function HasParent: Boolean; override;

Description

TMenuItem overrides HasParent to return True, indicating that menu items have a parent. Applications seldom call the HasParent method. It is used by the streaming system that loads and saves VCL objects to determine when another object is responsible for writing a component to a stream.

Es decir, que la función no tiene el objetivo que inicialmente pudiesemos pensar. HasParent indica quien escribirá la información de items a la RTTI, nada que ver con su Padre en el menú.

eduarcol 28-01-2004 15:07:09

esto es lo interesante del foro, ya que se deja ver la diversidad de maneras en las que se puede llegar a resolver un problema, al fin y al cabo eso es una de las verdades de la programacion, nunca dos programas seran iguales ya que ellos reflejan nuestra manera de pensar :D


La franja horaria es GMT +2. Ahora son las 12:59:07.

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