Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Duda creacion de componentes vcl (https://www.clubdelphi.com/foros/showthread.php?t=9338)

Roger 21-04-2004 09:50:12

Duda creacion de componentes vcl
 
Hola a todos, el problema que tengo es que mi componente tiene que crear en tiempo de ejecucion un menu (quando se abra el formulario que lo contenga). No tengo ni idea de como decirle en tiempo de ejecucion. A ver si me podeis ayudar, gracias

__cadetill 21-04-2004 10:14:52

Podrías reescribir el constructor de tu clase

Código:

public
  constructor Create(aOwner: TComponent); override;
  destructor Destroy; overryde;

implementation

constructor MiClase.Create(aOwner: TComponent);
begin
  inherited;

  // Aquí creas el menú
end;

destructor MiClase.Destroy;
begin
  // Aquí destruyes el menú

  inherited;
end;

No te olvides de los inherited ;)

Roger 21-04-2004 10:29:37

Este es mi trozo de codigo:

constructor TNegus.Create(AOwner : TComponent);
var
x : integer;
NuevoItem : Tmenuitem;
ExisteMenu : boolean;
Menu : TMainMenu;
begin
inherited;
ExisteMenu:=false;
//ShowMessage(AOwner.ClassName);
NuevoItem:=TMenuItem.Create(AOwner);
NuevoItem.Caption := 'Modo seguridad';
//NuevoItem.OnClick := AbrirNegusFrm;
For x:=0 to Self.ComponentCount-1 do
if (Self.Components[x] is TMainMenu) then
begin
TMainMenu(Self.Components[x]).Items.Add(NuevoItem);
ExisteMenu:=true;
end;
if not ExisteMenu then
begin
Menu:=TMainMenu.Create(AOwner);
Menu.Items.Add(NuevoItem);
end;

end;

Pero me crea el menu en tiempo de diseño, yo lo quiero en tiempo de ejecucion.

__cadetill 21-04-2004 10:41:03

Cita:

Empezado por Roger
Pero me crea el menu en tiempo de diseño, yo lo quiero en tiempo de ejecucion.

Normal, cuando pegas tu componente en el form, tambien se dispara el Create
Una pregunta. El menú estará visible durante TODA la vida del formulario? O se podrá esconder?
Si es que sí, que más da que en diseño veas el menú?
Si es que no, tendrás que crearte un método y, cuando quieras, invocar al método en cuestión

Código:

public
  destructor Destroy; override;
  procedure CreaMenu;

implementation

constructor MiClase.CreaMenu;
begin
  // Aquí creas el menú
end;

destructor MiClase.Destroy;
begin
  // Aquí destruyes el menú si está creado Puedes compararlo con nil por ejemplo

  inherited;
end;

PD: te recomiendo el uso de etiquetas [ code ] y [ /code ] (sin espacios) para poner código Delphi

roman 21-04-2004 16:50:42

No tienes que crear ningún método aparte para que el menú se cree sólo en la ejecución. Lo que tienes que hacer es que tu código distinga si estás en modo de diseño o en ejecución:

Código:

if not (csDesigning in ComponentState) then
begin
  creas el menú
end;

// Saludos

jachguate 21-04-2004 17:05:24

Hola. En primer lugar te recomiendo que uses la etiqueta code para hacer que el código que pegues sea mas legible.

De la forma que creas el menú, estará disponible tanto en tiempo de diseño como en tiempo de ejecución. Si a pesar de todo no queres que aparezca en tiempo de diseño, simplemente encerrá el código de creación del menu en un if como este:

Código:

  if not (csDesigning in ComponentState) Then
  Begin
    CreacionDeMenu;
  End;

Estoy asumiendo que tu clase hereda de TComponent... si no, esto no te valdrá...

Hasta luego.

;)

__cadetill 21-04-2004 17:43:38

Cita:

Empezado por roman
Código:

if not (csDesigning in ComponentState) then
begin
  creas el menú
end;


:eek: Pos esto no lo sabía :o :o

Roger 22-04-2004 09:32:24

Gracias por todo compáñeros


La franja horaria es GMT +2. Ahora son las 14:34:41.

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