Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filelistbox y popupmenu (https://www.clubdelphi.com/foros/showthread.php?t=84939)

Histri 01-01-2014 19:46:49

Filelistbox y popupmenu
 
Saludos de nuevo

Al pulsar el botón derecho del ratón sobre un DBMemo, se me abre una ventanita con: deshacer, pegar, cortar etc etc, sin embargo en el Filelistbox no me ocurre lo mismo.

Hay que modificar alguna propiedad en el inspector de objetos en el Form o en el Filelistbox? Porque sobre el DBMemo no he modificado nada y sin embargo me sale ese popupmenu

Gracias

ecfisa 02-01-2014 01:20:22

Hola Histri.

Es el comportamiento por defecto de los controles de edición (TEdit, TMemo, TMaskEdit, TDBMemo, etc). Si deseas desactivarlo, estándo seleccionado el DBMemo, dirigite al Object Inspector -> Pestaña Events -> Doble click en OnContextPopup y agrega:
Código Delphi [-]
procedure TForm1.DBMemo1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
   Handled := True;
end;

Saludos :)

Histri 02-01-2014 09:54:13

Hola ecfisa

Gracias por responderme.

Creo que no me he expresado bien, lo que pretendo, no es desactivar la ventanita en el DBMemo, sino que me aparezca en el control Filelistbox, sin tener que usar un popumenu.

Gracias

ecfisa 02-01-2014 10:48:42

Hola Histri.

El TFileListBox no posee asociado un menú contextual estándar de edición, lo cuál es lógico ya que lo que muestra no son líneas de texto sino Items (TStrings) cuyo contenido (la parte que muestra) se corresponde con algún nombre de archivo existente en la carpeta que tiene asignada actualmente.

Carece de sentido copiar o pegar el contenido de este control como si de texto se tratase ya que no es su función. Lo lógico es asignarle un popup menu personalizado en donde los ítems copiar, pegar, borrar, etc. se relacionen al tratamiento de archivos.

Saludos :)

Histri 02-01-2014 11:30:29

Gracias ecfisa por dedicarme tu tiempo.

Si no es mucho pedir, me podrías poner un ejemplo?

Muchas gracias por tu ayuda

ecfisa 02-01-2014 13:39:11

Hola Histri.

Un ejemplo básico con dos items:
Código Delphi [-]
type
  TForm1 = class(TForm)
    FileListBox1: TFileListBox;
    PopupMenu1: TPopupMenu;
    Edit1: TEdit;
    ...
  private
    procedure miCopyClick(Sender: TObject);
    procedure miDeleteClick(Sender: TObject);
  public
  end;

...

implementation

procedure TForm1.miCopyClick(Sender: TObject);
var
  i: Integer;
begin
  if not DirectoryExists(Edit1.Text) then
    raise Exception.Create('Ruta inválida');
  with FileListBox1 do
  begin
    if Directory = Edit1.Text then
      raise Exception.Create('Las carpetas de origen y destino son las mismas');
    for i := 0 to Items.Count-1 do
      if Selected[i] then
        if not CopyFile(PChar(Directory+'\'+Items[i]),
                        PChar(Edit1.Text +'\'+ Items[i]), True) then
          MessageBox(Handle,PChar('Error: '+SysErrorMessage(GetLastError)),'',
                     MB_ICONERROR);
  end;
end;

procedure TForm1.miDeleteClick(Sender: TObject);
const
  MSG = '¿ Desea borrar el archivo %s ?';
var
  i: Integer;
begin
  with FileListBox1 do
  begin
    for i := 0 to Items.Count-1 do
      if Selected[i] then
        if MessageBox(Handle, PChar(Format(MSG,[Directory+'\'+Items[i]])),
                      '', MB_ICONQUESTION+MB_YESNO) = IDYES then
          if not DeleteFile(PChar(Directory+'\'+Items[i])) then
            MessageBox(Handle,PChar('Error: '+SysErrorMessage(GetLastError)),'',
                       MB_ICONERROR);
    Directory := '.';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  miCopy, miDelete: TMenuItem;
begin

  miCopy := TMenuItem.Create(Self);
  miCopy.Caption := '&Copiar';
  miCopy.OnClick := miCopyClick;
  PopupMenu1.Items.Add(miCopy);

  miDelete := TMenuItem.Create(Self);
  miDelete.Caption := '&Borrar';
  miDelete.OnClick := miDeleteClick;
  PopupMenu1.Items.Add(miDelete);

  FileListBox1.Directory := 'C:\Una_Carpeta'; // Orígen
  FileListBox1.MultiSelect := True;   // Selección múltiple
  FileListBox1.PopupMenu := PopupMenu1;
end;
...
Cree los ítems y eventos de PopupMenu1 en tiempo de ejecución para darle mas claridad al ejemplo, pero lo podes realizar en tiempo de diseño.
Para que la copia se realice, el edit debe contener una carpeta de destino válida.

Saludos :)

Edito: Pero el ejemplo no evita el uso de un PopupMenu como solicitabas en el mensaje #3.

Histri 02-01-2014 14:20:42

Mil gracias ecfisa

Voy a ponerme manos a la obra.



Saludos.


La franja horaria es GMT +2. Ahora son las 14:40:03.

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