Ir al contenido


Foto

[RESUELTO] Editor de objetos


  • Por favor identifícate para responder
11 respuestas en este tema

#1 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 05 noviembre 2011 - 07:47

Buenas a todos

Estoy haciendo unos componentes y quisiera hacerles un editor de objetos, algo como tiene el TStatusBar cuando haces doble clic en él para editar sus paneles.

He estado mirando la VCL pero me pierdo dentro de ella y no veo cómo lo hacen.

Alguna idea de cómo se hace?

Gracias

  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 06 noviembre 2011 - 09:05

Hola Cadetill

En un caso como el de los paneles de un StatusBar, lo que se puede hacer es derivar de la clase TCollection para crear una lista de objetos y que además en automático se pueden editar en tiempo de diseño. Esto se logra porque Delphi ya tiene registrado un editor de propiedades para esta clase. Los elementos de la lista deben derivar de TCollectionItem.

Hace poco tiempo puse aquí un ejemplito acerca de como crear un editor de propiedades de este tipo. En el ejemplo los elementos de la lista son parámetros pero puede ser cualquier tipo de objeto.

Tal vez esta lectura pueda ayudar:

http://www.marteens.com/trick08.htm

Saludos

  • 0

#3 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 06 noviembre 2011 - 10:32

Gracias Hector, me lo miraré con cariño :)

Os mantendré informados y publicaré los componentes a la que salga éste (que será el tercero de la serie jejejjee)

Nos leemos
cadetill

  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 07 noviembre 2011 - 02:27

Amigo Héctor, era precisamente lo que andaba buscando, muchas gracias :)

Ahora ya, para terminar de rizar el rizo...... En un TStatusBar, al hacer doble clic sobre el componente, se abre la ventana de gestión de la colección. ¿No sabrás cómo se hace eso? He estado mirando el código del TStatusBar pero no veo cómo lo hacen. Lo mismo que en el menú contextual que aparece al hacer clic derecho encima de él.

En fin, que gracias de nuevo

Nos leemos

  • 0

#5 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 07 noviembre 2011 - 09:06

Para hacer lo que mencionas se tiene que crear una clase que derive de TComponentEditor y ajustar sus métodos a tus necesidades. Después debes registrar este editor de propiedades junto con tu componente.

La clase TComponentEditor se encuentra en la unidad DesignIntf.pas y esta a su vez se encuentra en el paquete compilado designide.dcp

Para instalar tu componente debes crear un paquete y añadir en requires el paquete designide.dcp.

Te recomiendo crear una unidad por separado que contenga este editor de propiedades y el registro del componente.


Te dejo dos lecturas que te pueden ayudar a lograrlo.

http://delphi.about....t/uc092501b.htm


http://www.drbob42.c...hi/property.htm (ve directo a la parte de TComponentEditor)

Saludos


Edito: Ahora veo que tu pregunta original es con respecto a editar la colección al hacer doble click. No entendí bien la pregunta, espero que con este mensaje puedas resolverlo.
  • 0

#6 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 08 noviembre 2011 - 07:45

Hola Hector

Ante todo gracias por la respuesta.

El tema de la clase TComponentEditor lo había encontrado buscando una solución (antes de preguntar me gusta investigar que es como se aprende jejeje) y de hecho había llegado a la página del segundo enlace.

No obstante, mi duda es cómo lanzar el editor de la colección y no encuentro ningún ejemplo de cómo hacerlo. También he mirado la VCL, pero tampoco he sabido encontrar cómo se hace :(

Gracias nuevamente

Nos leemos

  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 08 noviembre 2011 - 10:00

Buenas,

Me respondo a mi mismo. Buscando, buscando, he llegado a esta página donde explican precisamente cómo invocar desde código el editor de la colección.

Os pongo un ejemplo de como quedaría para que quede reflejado aquí también. De paso también muestro cómo hacer herencia con la clase TComponentEditor.



delphi
  1.   TGMBaseEditor = class(TComponentEditor)
  2.   public
  3.     ............
  4.   end;
  5.  
  6.   TGMMarkerEditor = class(TGMBaseEditor)
  7.   public
  8.     procedure Edit; override;
  9.     function GetVerb(Index: Integer): string; override;
  10.     function GetVerbCount: Integer; override;
  11.     procedure ExecuteVerb(Index: Integer); override;
  12.   end;
  13.  
  14. implementation
  15.  
  16. { TGMBaseEditor }
  17.  
  18. .......
  19.  
  20. { TGMMarkerEditor }
  21.  
  22. procedure TGMMarkerEditor.Edit;
  23. begin
  24.   ShowCollectionEditor(Designer, Component, TGMMarker(Component).MarketList, 'MarketList');
  25. end;
  26.  
  27. procedure TGMMarkerEditor.ExecuteVerb(Index: Integer);
  28. begin
  29.   if Index <= inherited GetVerbCount - 1 then
  30.     inherited ExecuteVerb(Index)
  31.   else
  32.   begin
  33.     Dec(Index, inherited GetVerbCount);
  34.     case Index of
  35.       0: ShowCollectionEditor(Designer, Component, TGMMarker(Component).MarketList, 'MarketList');
  36.     end;
  37.   end;
  38. end;
  39.  
  40. function TGMMarkerEditor.GetVerb(Index: Integer): string;
  41. begin
  42.   if Index <= inherited GetVerbCount - 1 then
  43.     Result := inherited GetVerb(Index)
  44.   else
  45.   begin
  46.     Dec(Index, inherited GetVerbCount);
  47.     case Index of
  48.       0: Result := MEditor;
  49.     end;
  50.   end;
  51. end;
  52.  
  53. function TGMMarkerEditor.GetVerbCount: Integer;
  54. begin
  55.   Result := inherited GetVerbCount + 1;
  56. end;



Una vez sabes qué buscar, es más fácil encontrar la solución. Gracias de nuevo Hector por abrirme el camino

Espero sea de utilidad a alguien

Nos leemos
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 noviembre 2011 - 10:21

Hola,
No recuerdo mucho sobre el uso de colecciones. De lo que recuerdo es que, como te dijo Héctor tus clases deben heredar de TCollection y TCollectionItem, sobreescribir los métodos necesarios y añadir los propios.


Luego, respecto al editor de colecciones creo que no hace falta de mucho. Tengo entendido que la propia clase TCollection se encarga de todo y encapsula el trabajo. Recuerdo que existe un método GetPathName o GetNamePath que se utiliza para obtener el nombre de los objetos y presentarlos en el editor. Para ello es fundamental sobreescribir, además de éste, el método GetOwer que tiene la clase TColletion. Gracias estos dos métodos es que se presenta adecuadamente el nombre para el editor de colección por defecto.


Es unicamente válido, y útil, heredar del editor y crear uno propio si en realidad se harán más cosas de las que ofrece el editor por defecto.


Saludos,
  • 0

#9 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 08 noviembre 2011 - 10:44

Hola Delphius

Gracias por la explicación, pero como bien dice en la página de Marteens que referencia Hector, podemos heredar de TOwnedCollection, el cual ya lleva implementado el método GetOwner, y es de ésta de la que he heredado :)

Ahora bien, si tu mensaje viene dado por el mío último, decirte que una cosa es usar la colección desde el inspector de objetos (desde como tu bien dices la propia colección encapsula su uso) y otra es usar la colección haciendo un doble clic en el componente o mediante el menú contextual que aparece haciendo clic derecho encima de él :)

Nos leemos

  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 noviembre 2011 - 09:03

Hola Delphius

Gracias por la explicación, pero como bien dice en la página de Marteens que referencia Hector, podemos heredar de TOwnedCollection, el cual ya lleva implementado el método GetOwner, y es de ésta de la que he heredado

Vaya... desconocía esa clase. Como dicen... uno no se acuesta sin aprender algo ¡ y justo cuando ya casi me dispongo a dormir! O mejor dicho, intentar dormir porque es tanto el calor que hace por aquí que se siente por demás pesado el ambiente y el cuerpo no logra refrescarse bien... y doy más vueltas que calesita sin frenos.

Ahora bien, si tu mensaje viene dado por el mío último, decirte que una cosa es usar la colección desde el inspector de objetos (desde como tu bien dices la propia colección encapsula su uso) y otra es usar la colección haciendo un doble clic en el componente o mediante el menú contextual que aparece haciendo clic derecho encima de él

Nos leemos

Entiendo. Ahora si la idea es utilizar el editor mediante menú contextual o doble clic si... allí si hay que jugar con las clase editores. Disculpa no lo había interpretado bien... el calor me está jugando de esas.


Saludos,
  • 0

#11 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 09 noviembre 2011 - 01:00

Tómate una cervecita bien fría, pon en marcha el ventilador y ale, a dormir, jejejeje :p

Nos leemos

  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 09 noviembre 2011 - 05:26

Tómate una cervecita bien fría, pon en marcha el ventilador y ale, a dormir, jejejeje :p

Nos leemos

Ganas de una rubia hay  :D , el asunto es que hay una disputa por el ventilador... o es para mi, o se lo queda la PC  :o


Saludos,
  • 0




IP.Board spam blocked by CleanTalk.