Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   boton derecho del raton (https://www.clubdelphi.com/foros/showthread.php?t=1813)

gemma 28-06-2003 11:49:03

boton derecho del raton
 
Hola a todos

Vereis he creado un boton dinamicamente para ejecutar un programa. Bien pues ahora me gustaria que si pincho con el boton derecho del raton sobre este boton que me sacara las propiedades del programa, igual que cuando se pincha con el boton derecho sobre un icono que sale un listado con todo lo que se puede hacer y al final las propiedades del programa.

La verdad es que no se si eso se podria conseguir asi que si alguien tiene alguna idea se lo agradeceria.

Muchas gracias por vuestra ayuda.

andres1569 28-06-2003 12:18:04

Si quieres que al pulsar el botón derecho del ratón te aparezca un menú flotante, es tan fácil como colocar un TPopupMenu y asignárselo a la propiedad PopupMenu del botón.

Ya que creas el botón dinámicamente, deberías asignar, también en ejecución, esta propiedad:

Código:

procedure TForm1.CreaBoton;
begin
  With TButton.Create (Self) do
  begin
    Parent := Self;
    PopupMenu := PopupMenu1;
    ...
end;


gemma 30-06-2003 09:13:24

Gracias por ayudarme, pero lo que yo quiero no es que salga un PopupMenu, sino el panel de propiedades que aparece al pulsar el boton derecho del icono de cualquier fichero.
Supongo que habria que asignar de alguna forma este panel de propiedades al boton, pero no se como se podria hacer.

andres1569 30-06-2003 09:33:41

En ese caso no tienes más que interceptar el evento OnMouseDown y comprobar el parámetro Button de dicho evento (este Button se refiere al bottón del Mouse, no a tu botón):

Código:

TForm1 = class(TForm)
 ...
public
  procedure AlPulsarMouse (Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X,Y : Integer);
  procedure CreaBoton;
  ...
end;

...

procedure TForm1.AlPulsarMouse (Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X,Y : Integer);
begin
  if (Button = mbRight) AND (Sender is TButton) then
    FPropiedades.Show  // o lo que sea
  ...
end;

// al crear dinámicamente tu botón le asignas el método

procedure TForm1.CreaBoton;
begin
  With TButton.Create (Self) do
  begin
    Parent := Self;
    OnMouseDown := AlPulsarMouse;
    ...
end;

La asignación OnMouseDown := AlPulsarMouse; es posible porque ambos eventos son del mismo tipo (los mismos parámetros).

Lepe 30-06-2003 18:17:55

gemma:
he creado un boton dinamicamente para ejecutar un programa[...]

puedes crearte un registro y en la propiedad tag del boton, guardar un puntero a ese registro donde guardas toda la informacion para ese boton. Supongo que en tu caso seria la ruta del archivo a ejecutar, y el nombre del archivo (creo que usas ShellExecute para llamar al programa no?)

Esa información es la que se verá en la ventana que andrés ha llamado FPropiedades


solo tienes 1 boton o son mas?

gemma 02-07-2003 09:54:59

Hola,

A ver, si que utilizo el ShellExecute para ejecutarlo, y no es un boton, es un vector de botones, tan grande como se quiera, ya que le asigno el tamaño tambien dinamicamente.

En FPropiedades que andres ha dicho, para lo que yo quiero, deben salir las propiedades del programa al que apunta el boton, es decir, las propiedades de la ruta que tiene el boton asignada, que es la ruta del ejecutable.

Estoy pensando que con la interfaz IShellLink conseguia las propiedades del ejecutable para crear un acceso directo, quiza con algo parecido se pueda hacer, no?

Voy a probar lo que me habeis dicho de momento, a ver si me aclaro.

Gracias

Lepe 02-07-2003 18:16:40

como yo lo hice, es así:

en mi caso era un TTreview que cada hijo tenia en su propiedad 'data' un puntero a
un registro, para tu caso es lo mismo solo que usas un boton y la propiedad 'tag'


Y adicionalmente usaba una lista de punteros (TCDenMemoria) para leer desde un archivo de configuracion el registro que tenia asociado cada nodo del TTreeview.

Siento mucho no poder ponerte todo el código para copiar y pegar en delphi, pero aqui tienes lo básico.


NOTA: Espero que no estes peleada con los punteros.... :D


Los tipos de datos que yo definí son estos:
Código:


 type TCadena=String[255];

  type TEnCD=record // el regisro asociado a cada boton
    Titulo,
    Categoria,
    RutaEnCD,
    Comentario  :Tcadena;
  end;
  type TpEnCD=^TEnCD;
// TpEnCD es un tipo de datos que será un puntero al registro TEnCD

//TCDenMemoria es una lista de punteros
// implementada en Delphi 3
// para leer desde un archivo todos los registros de tipo TEnCD

  type TCDenMemoria=record
    siguiente: pointer;
    datos: TenCD;
    end;

  type TpCDenMemoria=^TCDenMemoria;


para crear el registro asociado a un boton:
Código:


var pn:TpEnCD;
begin
 try
  begin
    new(pn);
    pn^.Titulo:=edit1.text;
    pn^.RutaEnCD:=edit2.text
    pn^.Comentario:=richedit1.text;
    pn^.Categoria:='CD sin categorias'


para liberar de memoria:
Código:

var    pTV:TpEncd;
begin
    repeat
      try
        ptv:=Tpencd(boton.tag);
        dispose(ptv); //posible EInvalidPointer exception.
      //buscar siguiente boton //el nodo para mi son los hijos de un TTReview, para ti es el array de botones
      except
        // fallo al liberar el registro
      end;
    until boton=nil; // tu sabrás cuando se termina el array de botones ;-)

para ejecutar la aplicacion asociada a un boton:
Código:

var fich, ruta:string;

    p:=tpencd(BotonSeleccionado.tag);
    fich:=p^.Titulo;
    ruta:=extractfilepath(p^.RutaEnCD);
    shellexecute(handle,pchar('open'),pchar(fich),nil,pchar(ruta),SW_SHOW);


para guardar todos los registros a un solo archivo
Código:

var    f:File of TenCD;
begin
    assignfile(f,'c:\window.cfg');
    rewrite(f);

    pdatos:=TpEncd(boton.tag);
    write(f,pdatos^);
// buscar siguiente boton y hacer lo mismo


    CloseFile(f);
end

para leer del fichero la configuracion de todos los botones.


Código:

procedure Tfrmppal.CargaDatos();
{ pedir el fichero de cfg
  abrirlo y crear lista en memoria
  buscar los programas y añadirlos segun la estructura TpEnCD
}
var f:file of TenCD;
    fdato:TenCD;
    puntAct:TpCDenMemoria;
    i:integer;

begin
try
  //buscar el window.cfg

    opendlg.Title:='Abrir fichero de Configuración';
    opendlg.Filter:='Configuración|*.cfg';
    opendlg.InitialDir:='c:\al cd';
    opendlg.FileName:='window.cfg';
    opendlg.DefaultExt:='.cfg';
    if not opendlg.execute then
    begin
      exit
    end;


  assignfile(f,opendlg.FileName);
  filemode:=fmOpenRead;
  reset(f);

  new(lista);
  puntact:=tpcdenMemoria(lista);
  read(f,fdato);
  except
    frmNotificar.Error(true,clblue,'El fichero de datos: window.cfg '+#10+ 'No está presente o está vacio.' );
    dispose(lista);
    exit;
  end;

 //averiguar si tiene categorias o no el CD;

reset(f);
while not eof(f) do
begin
    read(f,fdato);
    puntact^.datos:=fdato;
    if not eof(f) then
    begin
      new(tpcdenmemoria(puntact^.siguiente)); // exception    EOutOfMemory
      puntact:=tpcdenmemoria(puntact^.siguiente);
      puntact^.siguiente:=nil;
    end;

 end;
end;

Muuuuucha suerte!!!

Lepe 02-07-2003 18:37:41

perdon, se me olvidaba, la variable lista que aparece al leer del archivo de configuración
está definida como
Código:

var lista:tpCDEnmemoria;
Creo que eso de TcdEnMemoria te puede resultar extraño, es simplemente una lista de punteros, donde se guarda el registro asociado a un boton y un campo Siguiente, que dice en que posicion de memoria está el siguiente registro del tipo TcdEnMemoria.

Si tienes alguna duda, tirame una piedra :) Bueno, eso si te decides a hacerlo de esta forma.

Para mi fué un reto personal hacerlo mediante punteros, y la verdad, me gustó mucho :cool: .

¿Quien se anima a hacerlo en Visual Basic :D :p?


La franja horaria es GMT +2. Ahora son las 08:10:52.

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