Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-03-2012
elarys elarys is offline
Miembro
 
Registrado: abr 2007
Posts: 94
Poder: 18
elarys Va por buen camino
Busqueda y edicion en PopupMenu

Necesito crear un componente heredado de un TPopupMenu a este, agregarle un TEdit... y al escribir en el edit filtrar (poner visible := false los menu item) o como sea de forma automatica, aquellos menuitem del popupmenu que no contengan el texto escrito, desde el comienzo que se vayan filtrando

algo asi seria la busqueda que quiero que haga
Código Delphi [-]
    if AnsiStartsText(Edit1.Text, Popupmenu) then
      filtrar

Lo hice con un TEdit en el Form
Y a los menuitem los hago con varios TLabel que se van creando segun un TStringList
Y lo que hice hacer lo mas parecido su funcionamiento como si fuera un popupmenu
ya sea pasar el mouse por encima y hace como que toma el foco, luego con las teclas arriba y abajo igual
Código Delphi [-]
unit UMenu;

interface

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

type
  TFMenu = class(TForm)
    edtSearch: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure edtSearchChange(Sender: TObject);
    procedure edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure edtSearchKeyPress(Sender: TObject; var Key: Char);
  private
    Menus:TStringList;
    Focus:integer;
    procedure PaintMenu(Menus:TStringList);
    procedure MenuClick(Sender: TObject);
    procedure MouseEnter(Sender: TObject);
    procedure MouseLeave(Sender: TObject);
  public
    procedure CreateList;
  end;

var
  FMenu: TFMenu;

implementation

uses
  Unit1, Unit2;

{$R *.dfm}

procedure TFMenu.PaintMenu(Menus:TStringList);
var
  i, top:integer;
  newLabel:TLabel;
  Menu:TStringList;
begin
  Menu := TStringList.Create;
  top := 32;

  for i := ComponentCount -1 downto 0 do
    if Components[i] Is TLabel then
      Components[i].Free;

  for i := 0 to Menus.Count - 1 do
  begin
    newLabel := TLabel.Create(FMenu);
    newLabel.Parent := FMenu;
    newLabel.AlignWithMargins := True;
    newLabel.Anchors := [akLeft, akTop, akRight, akBottom];
    newLabel.AutoSize := False;
    newLabel.Margins.Bottom := 0;
    newLabel.Margins.Left := 0;
    newLabel.Margins.Right := 0;
    newLabel.Margins.Top := 0;
    newLabel.Layout := tlCenter;
    newLabel.Top := top;
    newLabel.Left := 0;
    newLabel.Width := 216;
    newLabel.Height := 18;
    newLabel.Name := 'newMenu'+ IntToStr(i);
    newLabel.Tag := i + 1;
    newLabel.OnMouseEnter := MouseEnter;
    newLabel.OnMouseLeave := MouseLeave;

    newLabel.OnClick := MenuClick;
    newLabel.Caption := '   ' + Menus[i];
    top := top + 18;
  end;
end;

procedure TFMenu.edtSearchChange(Sender: TObject);
var
  i:integer;
  newMenuList:TStringList;
begin
  newMenuList := TStringList.Create;
  for i := 0 to Menus.Count - 1 do
    if AnsiStartsText(edtSearch.Text, Menus[i]) then
      newMenuList.Add(Menus[i]);

  newMenuList.Sort;
  PaintMenu(newMenuList);
  newMenuList.Clear;
end;

procedure TFMenu.edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  i : integer;
begin
  if Key = VK_DOWN then
  begin
    Focus := Focus + 1;

    if Focus = ComponentCount then
      Focus := 1;

    if Focus = 0 then
      Focus := 1;
  end;

  if Key = VK_UP then
  begin
    Focus := Focus - 1;

    if Focus = -1 then
      Focus := ComponentCount - 1;

    if Focus = 0 then
      Focus := ComponentCount - 1;
  end;

  for i := 0 to ComponentCount - 1 do
  begin
    if Components[i] Is TLabel then
    begin
      TLabel(Components[i]).Color := clBtnFace;
      TLabel(Components[i]).Font.Color := clWindowText;
    end;
  end;

  if Components[Focus] Is TLabel then
  begin
    TLabel(Components[Focus]).Color := clActiveCaption;
    TLabel(Components[Focus]).Font.Color := clWindow;
  end;
end;

procedure TFMenu.edtSearchKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
  begin
    if TLabel(Components[Focus]).Tag = 1 then
    begin
      Form1 := TForm1.Create(Self);
      Form1.ShowModal;
    end;

    if TLabel(Components[Focus]).Tag = 2 then
    begin
      Form2 := TForm2.Create(Self);
      Form2.ShowModal;
    end;
  end;
end;

procedure TFMenu.CreateList;
begin
  Menus := TStringList.Create;

  Menus.Add('ABI Activity');
  Menus.Add('Cargo Release Statistics');
  Menus.Add('Cargo Status');
  Menus.Add('Commodity Log');
  Menus.Add('Container Activity');
  Menus.Add('Cost Submission Report');
  Menus.Add('Customer ABI Statement Report');
  Menus.Add('Customer Duty Due Report');
  Menus.Add('Detailed Log');
  Menus.Add('Duty Payment');
  Menus.Add('Entry Number Labels');
  Menus.Add('Entry Summary Data Transfer Report');
  Menus.Add('FDA PNC Pending');
  Menus.Add('Insurance Bond Report');
  Menus.Add('Notice of Liquidation');
  Menus.Add('Part Number Report');
  Menus.Add('POD Report');
  Menus.Add('Quick Log');
  Menus.Add('TIB Expiration');
  Menus.Sort;

  PaintMenu(Menus);
end;

procedure TFMenu.FormCreate(Sender: TObject);
begin
  CreateList;
  Focus := 0;
end;

procedure TFMenu.MouseEnter(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if Components[i] Is TLabel then
    begin
      TLabel(Components[i]).Color := clBtnFace;
      TLabel(Components[i]).Font.Color := clWindowText;
    end;
  end;

  TLabel(Sender).Color := clActiveCaption;
  TLabel(Sender).Font.Color := clWindow;
  Focus := TLabel(Sender).Tag;
end;

procedure TFMenu.MouseLeave(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if Components[i] Is TLabel then
    begin
      TLabel(Components[i]).Color := clBtnFace;
      TLabel(Components[i]).Font.Color := clWindowText;
    end;
  end;
end;

procedure TFMenu.MenuClick(Sender: TObject);
var
  Form1:TForm1;
  Form2:TForm2;
begin
  if TLabel(Sender).Tag = 1 then
  begin
    Form1 := TForm1.Create(Self);
    Form1.ShowModal;
  end;

  if TLabel(Sender).Tag = 2 then
  begin
    Form2 := TForm2.Create(Self);
    Form2.ShowModal;
  end;
end;

end.

Este codigo me funciona y podria seguir mejorandolo, pero necesito hacerlo con un popupmenu y un edit
y con esto crear mi componente TPopupMenuEdit... Alguna idea.

Editado: si no me entienden y tampoco ven muy bien mi codigo, creen una nueva aplicacion agreguen mi unidad como la principal y ejecuten, para que vean el funcionamiento que le quiero dar a mi componente.
En el evento MenuClick, cree dos nuevos formularios sin nada para probar el evento onclick de cada elemento creado TLabel.
Acepto sugerencias de hacerlo con otros componentes pero el componente final tiene que quedar como un popupmenu y un edit arriba de todos los menu items.

Última edición por elarys fecha: 28-03-2012 a las 21:22:24.
Responder Con Cita
  #2  
Antiguo 30-03-2012
elarys elarys is offline
Miembro
 
Registrado: abr 2007
Posts: 94
Poder: 18
elarys Va por buen camino
me estuve fijando y parece que esta idea la sacaron de la busqueda de windows 7, donde click en inicio y luego tiene un edit que dice buscar programas y archivos algo asi, y luego al escribir busca y te muestra lo que ha encontrado y luego click en ese archivo o programa y lo abre...

bueno esa es la idea que me dieron pero lo tengo que hacer todo en un popupmenu, con un edit arriba porque hacerlo en un formulario ya lo he hecho en el codigo de arriba, aunque le falta depurar un poco el codigo.
Responder Con Cita
  #3  
Antiguo 03-07-2012
elarys elarys is offline
Miembro
 
Registrado: abr 2007
Posts: 94
Poder: 18
elarys Va por buen camino
este foro es una mierda, nadie dice nada, nisiquiera un no entendimos nada de lo que quieres hacer
Responder Con Cita
  #4  
Antiguo 03-07-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por elarys Ver Mensaje
este foro es una mierda, nadie dice nada, nisiquiera un no entendimos nada de lo que quieres hacer
Hola elarys.

Tal vez fuiste vos quién no se supo explicar o tal vez no haya habido quién sepa contestar. Tenes toda la libertad de irte a otro foro que sea mas de tu agrado, pero bajo ningún punto de vista el echo de no haber recibido una respuesta te dá el derecho de insultar.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 03-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ratifico lo dicho por ecfisa, si no te gusta... la puerta está abierta.

De nuestra guía de estilo:

Otro motivo por el que es posible que no te hayan contestado es porque puedes haberte explicado mal. Sería conveniente en este caso que trataras de ampliar la información que has escrito en el primer mensaje de tu tema. Así podrías ayudar al resto de usuarios a que respondan más claramente.

Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
PopupMenu !!! Ledian_Fdez OOP 6 08-11-2010 23:12:54
PopupMenu cmfab Varios 1 01-11-2010 23:00:18
El PopupMenu skinnerpro OOP 4 16-10-2007 01:47:30
popupMenu jorodgar Varios 7 20-04-2005 17:16:22
Como puedo cambiar la propiedad de edicion y no edicion a un StringGrid1 ctronx Varios 2 25-06-2004 23:10:19


La franja horaria es GMT +2. Ahora son las 09:02:28.


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
Copyright 1996-2007 Club Delphi