Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Nuevas propiedades en un TMAinMenu (https://www.clubdelphi.com/foros/showthread.php?t=49123)

José Luis Garcí 13-10-2007 13:02:29

Nuevas propiedades en un TMAinMenu
 
Alguno sabe como crear nuevas propiedades en el Item de un TmaninMenu, para poder terminar un componente, ya que añado las nuevas propiedades y si se me crea en en la parte principal, pero dos de las propiedades nuevas dben ir en dentro de los Item del mainMenu, pero no sucede, he mirado la ayuda y me remite al metodo add de la propiedad TMenuitem, pero no logro que funcione, funcionaria en la creacion de un componente?

No es que dejara los otros componentes parados, pero como me he bloqueado con ellos, e preferido dejarlos parados de momento.

Gracias y un saludo por vuestra ayuda.

P.D. Si podeis poner un ejemplo.

neuronic 13-10-2007 17:40:28

prueba con esto
 
buenas mi primera aportacion, espero que no sea la ultima,xd, no ser si soluciona tu poblema :)

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ExitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var item: TMenuItem;
        item2: TMenuItem;
    begin
      item := TMenuItem.Create(MainMenu1);
      item.Caption := '&File';
      MainMenu1.Items.Add(item);

      item2 := TMenuItem.Create(MainMenu1);
      item2.Caption := 'E&xit';
      item2.OnClick := ExitClick;
      item.Add(item2);

    end;
        procedure TForm1.ExitClick(Sender: TObject);
    begin
      Application.Terminate;
    end;
end.

José Luis Garcí 13-10-2007 18:17:55

Gracias por tu respuesta neuronic, pero se trata de añadir nuevas propiedades al menu y no nuevas partes de esta, por si no ha quedado claro expongo lo que quiero hacer:

Partiendo de un MainMenu hacer un menu con niveles de seguridad y clave, en la parte principal esta los niveles de seguridad, clave de acceso y mensaje de solicitud de clave y el nivel dw usuario actual (Valores generales), en el segunda parte cda vez que exponemos un Item se nos pediria un campo boolean que nos remite si para acceder hace falta clave y el nivel de usuario que hace falta para acceder al evento del item.

Espero haberme explicado bien.

xEsk 13-10-2007 18:46:09

No quiero sonar borde, pero por mas que leo tus dos mensajes no logro entender lo que quieres, con el primer mensaje he entendido lo mismo que neuronic.

Creo que te lías un poco al intentar explicar lo que quieres, hehe.

Saludos.

José Luis Garcí 13-10-2007 18:59:08

XesK intentare explicarme mejor
Cuando soltamos el componente TmainMenu, trae una seri de opciones, cuando pulsamos sobre su icono o sobre la opcion Items, nos sale nuevas opciones que se cran paera cada una de los elementos del menu.

Bien logro crear la opciones sobreel componente en su parte principal pero no sobre cada elemento, como los caption, pero crear mi propia opcion.


Espero quede mas claro, gracias por vuestra ayuda.

eduarcol 13-10-2007 19:20:07

si mal no entiendo tu lo que quieres es que el componente TMainMenu en lugar de heredar los Items desde TMenuItem herede desde TMIMenuitem??

has logrado modificar el TMainMenu y ver donde se crean los nuevos TMenuItem y cambiar la clase alli??

José Luis Garcí 13-10-2007 19:49:55

Creo que la cosa se esta liando y no me explico bien, lo que quiero es crear un nuevo componente para el club, basabndose en un MainMenu, con nuevas propiedades, las describo, pero tener en cuenta que es un boceto.

Propiedades comunes al componente(cuando lo añadimos al formulario)

LevelUser Integer (en el estableceremos el nivel del usuario actual del 1 al 5)
Level1 al 5 String (seran los niveles establecidos, en ellos pondremos los nombres de tipos de usuario, siendo en principio 1 Todos
y 5 Administrador)
Keyseg String (Ira la clave que podamos necesitar)
Messagekey String (Aqui ira el mensaje que nos mostrara en caso de solicitarse clave)



Propiedades comunes a las diferentes opciones del menu (cuando escribimos las opciones [Items] del menu en fase de diseño)

Level Integer (estara comprendido entre el uno y el cinco mirara más abajo comportamiento)
KeyItem Boolean (Si lo morcamo nos solicitara clave para acceder a el independiente del nivel de usuario)


Comportamiento

Al introducir en Leveluser un valor, entre 1 al 5 en el menu nos abilitara todos aquellos items que tengan en level el mismo, que en leveluser o inferio pero no los superiores, exeptundo aquellos que tengan el keyItem en true, en este caso no importa el nivel de usuario ya que nos solicitara la clave para acceder.

Espero la explicacion sea más coherente esta vez.

José Luis Garcí 15-10-2007 16:52:01

He seguido buscando, he mirado el menu.pas y me pierdo, si a alguno se le ocurre una idea se agradeceria.

Chris 15-10-2007 17:10:01

Lo que tedrás que hacer es derivar (hacer un decendiente) del TMenuItem, solo de esta forma podrás agregar las propiedades que necesites. Si no me equivoco, también tendras que hacer un decendiente de TMenu y TMainMenu y si lo necesitas de TPopupMenu, lo único que tendrías que cambiar es que en vez de utilizar TMenuItem utilize tu propia clase, p. ej. TmiMenuItem, TmiMenu, ....

José Luis Garcí 17-10-2007 17:36:29

D&W He probado y nada, de echo desde el principio parte de un componente TMAinmenun, a la que quiero añadir las nuevas propiedades y no hay manera, si a alguien se le ocurre otra cosa, seguire, de todas maneras sigo investigando, y he visto por ahí, que los componantes que hayh no tienen propiedades nuevas, en la parte de los item, no creo que el problema sea el no poder, mas bien pienso que debe ser bastante complicado.

Lepe 17-10-2007 19:24:26

He dado una visual muy por encima al menu.pas y el problema que veo está en el diseño de las clases.

Mira el componente TComboBoxEx (ComCtrls.pas) verás que tiene 2 propiedades: Items e ItemsEx, quizás puedas hacer algo parecido. Si no te apetece, creo que tendrías que empezar de cero el componente.

La clase TMenu ya publica la propiedad Items, de solo lectura y además accediendo directamente a su propiedad privada FItems:
Código Delphi [-]
  published
    property Items: TMenuItem read FItems;

Quizás los de Borland no quisieran que se derivase de ese componente, de ahí su implementación.

Saludos

José Luis Garcí 17-10-2007 19:29:11

Garcias por tu pronta respuesta Lepe, pero me pregunto, seria posible modificar el archivo pas, añadir las propiedades en menu pas. pero es que me parce muy complejo, y me da pena desechar la idea ya que me parece la forma mas adecuada de implementar niveles de usuario en un programa, tal vez se me ocurre seria más facil en un ActionList?.

Lepe 18-10-2007 10:10:13

Lo de modificar los fuentes de Delphi no lo veo viable.

1 - No sé si será legal eso de modificar el menu.pas.
2 - No aseguras compatibilidad con programas que ya funcionen.

Lo que se me ocurre es crearte tu nueva unidad PrivMenu.pas pegando todo el contenido de la unidad de delphi (repito, no sé si legalmente puedes hacer eso), renombrando las clases a TPrivMenu, TPrivMenuItem, etc.

A partir de aquí ya eres "libre" . Después podrás instalar el componente como uno más de delphi.

Con un TActionList, no tendrías que reinventar nada. Cada TAction tiene su propiedad Tag y ahí puedes guardar el nivel de privilegios que haría falta para mostrar ese TAction, Con un simple bucle puedes recorrer todos los TActions inhabilitándolos, hacerlos invisible, etc.
Código Delphi [-]
  for i:= 0 to actionlist1.count -1 do
  actionlist1.Actions[i].Visible := actionlist1[i].tag <= PrivilegioDelUsuario

Si en cada ventana existen controles que puedan ser invisibles para ciertos usuarios, yo añadiría herencia visual, es decir crear un formulario en blanco que contenga un ActionList y una propiedad Privilegio:integer, Al asignar el Privilegio haría lo propio con los Actions que haya en la ventana.

Habrá otras muchas formas de implementar privilegios, pero dependerá de tus necesidades.

Saludos

José Luis Garcí 18-10-2007 20:30:46

Visto lo dicho, nada, abandono la idea y me da pena, pasare a empezar con otro componente, espero no me de nuevos problemas, ya que últimamente estoy bloqueado con varias cosas a la vez y conociendome, o aparco hasta que se me haga la luz o me veo trabajando hasta las 3- 4 de la mañana y a mi mujmer e hijas enfadadas por no prestarles un poco de atención.


La franja horaria es GMT +2. Ahora son las 00:22:11.

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