Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Menu dinamico (https://www.clubdelphi.com/foros/showthread.php?t=94975)

LACV 07-12-2020 21:35:21

Menu dinamico
 
Buena tarde

Compañeros estoy realizando un menu dinamico pero me falta que cuando se genere y se le de clic abra un formulario
Código Delphi [-]
procedure TFrmHome.FormCreate(Sender: TObject);
var
  Item: TMenuItem;
begin
  // generamos el menu dinamico
  DModulot.ResetConf();

  with DModulo.QueryDocumentos do
  begin
    if RecordCount > 0 then
    begin
      First;
      while Eof = false do
      begin
        Item := TMenuItem.Create(Self);
        MVentas.Add(Item);

        Item.Caption := FieldByName('Documento').AsString;
        Item.ImageIndex := 1;
        Item.OnClick := menuDinamicoClick;
        Next;
      end;
    end;
  end;
end;

tengo esta funcion pero no se me ocurre como llamar el formulario
Código Delphi [-]
procedure TFrmHome.menuDinamicoClick(Sender: TObject);
begin
  if Sender is TMenuItem then
  begin
    ShowMessage('Hola');
  end;
end;

LACV 07-12-2020 22:09:17

El real problema es que necesito pasar un valor por la funcion pero no al llarmla me arroja error ya que no se valor darle al sender
Código Delphi [-]
procedure TFrmHome.menuDinamicoClick(Documento: string; Sender: TObject);
begin
  if Sender is TMenuItem then
  begin
    try
      FrmVentasCrud := TFrmVentasCrud.Create(Application);
      // cargamos que rol se va a usar

      FrmHome.Visible := false;

      with FrmVentasCrud do
      begin
        LbTipoDocumento.Caption := '';
        ShowModal;
      end;

    finally
      FreeAndNil(FrmVentasCrud);
      FrmHome.Visible := true;
    end;

  end;
end;

Ñuño Martínez 08-12-2020 14:03:24

Ese Documento, ¿qué es? O sea, ¿para qué lo necesitas? ¿De dónde sale? ¿Qué contiene?

Neftali [Germán.Estévez] 09-12-2020 10:18:27

Siguiendo el ejemplo que has puesto hay varias cosas a comentar...
La cabecera del procedimiento menuDinamicoClick debe coincidir con el evento al que la estás asignando, por lo tanto debe ser como en el primer mensaje, no como en el segundo.

Código Delphi [-]
procedure TFrmHome.menuDinamicoClick(Sender: TObject);

Para obtener el documento hay varias formas, las más sencillas que se me ocurren:

a) Usar los parámetros que tienes disponibles. En tu caso tienes un Sender que es de tipo TMenuItem. Si de alguna forma puedes añadir el Documento a ese parámetro ya lo tendrás disponible dentro del procedimiento. En tu caso ya lo has hecho usando el Caption.

Código Delphi [-]
Item.Caption := FieldByName('Documento').AsString;

Has utilizado esta línea, por lo tanto dentro del evento puedes utilizar lo siguiente:

Código Delphi [-]
procedure TForm1.menuDinamicoClick(Sender: TObject);
begin
  if Sender is TMenuItem then
  begin
    ShowMessage('Documento: ' + TMenuItem(Sender).Caption);
  end;
end;


b) La segunda opción que se me ocurre, es que crees una lista que te relacione los diferentes elementos del menú con el Documento, por ejemplo utilizado una TStringList o un TDictionary.

Cuando creas los elementos del menú, los añades a una TStringList, como parejas (Documento, TMenuItem):

Código Delphi [-]
...

private
  ListaItems:TStringList;
....

procedure TFrmHome.FormCreate(Sender: TObject);
begin
...
  ListaItems := TStringList.Create;

...
  // añadir cada item a la lista

  ListaItems.AddObject(doc, item);

...

Dentro del evento puedes buscar en la lista y encontrar el elemento (TMenuItem) y obtener el Documento asociado.

Código Delphi [-]
procedure TForm1.menuDinamicoClick(Sender: TObject);
var
  index:integer;
begin
  if Sender is TMenuItem then begin
    // Buscar el MenuItem
    index := ListaItems.IndexOfObject(Sender);
    // encontrado?
    if (index <> -1) then begin
      // ListaItems[index] tiene el documento
      ShowMessage('Documento: ' + ListaItems[index]);
    end;
  end;
end;


La franja horaria es GMT +2. Ahora son las 04:00:40.

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