[RESUELTO] Editor de objetos
#1
Escrito 05 noviembre 2011 - 07:47
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
#2
Escrito 06 noviembre 2011 - 09:05
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
#3
Escrito 06 noviembre 2011 - 10:32
Os mantendré informados y publicaré los componentes a la que salga éste (que será el tercero de la serie jejejjee)
Nos leemos
cadetill
#4
Escrito 07 noviembre 2011 - 02:27
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
#5
Escrito 07 noviembre 2011 - 09:06
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.
#6
Escrito 08 noviembre 2011 - 07:45
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
#7
Escrito 08 noviembre 2011 - 10:00
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.
TGMBaseEditor = class(TComponentEditor) public ............ end; TGMMarkerEditor = class(TGMBaseEditor) public procedure Edit; override; function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override; procedure ExecuteVerb(Index: Integer); override; end; implementation { TGMBaseEditor } ....... { TGMMarkerEditor } procedure TGMMarkerEditor.Edit; begin ShowCollectionEditor(Designer, Component, TGMMarker(Component).MarketList, 'MarketList'); end; procedure TGMMarkerEditor.ExecuteVerb(Index: Integer); begin if Index <= inherited GetVerbCount - 1 then inherited ExecuteVerb(Index) else begin Dec(Index, inherited GetVerbCount); case Index of 0: ShowCollectionEditor(Designer, Component, TGMMarker(Component).MarketList, 'MarketList'); end; end; end; function TGMMarkerEditor.GetVerb(Index: Integer): string; begin if Index <= inherited GetVerbCount - 1 then Result := inherited GetVerb(Index) else begin Dec(Index, inherited GetVerbCount); case Index of 0: Result := MEditor; end; end; end; function TGMMarkerEditor.GetVerbCount: Integer; begin Result := inherited GetVerbCount + 1; 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
#8
Escrito 08 noviembre 2011 - 10:21
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,
#9
Escrito 08 noviembre 2011 - 10:44
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
#10
Escrito 08 noviembre 2011 - 09:03
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.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
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.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
Saludos,
#11
Escrito 09 noviembre 2011 - 01:00
Nos leemos
#12
Escrito 09 noviembre 2011 - 05:26
Ganas de una rubia hay , el asunto es que hay una disputa por el ventilador... o es para mi, o se lo queda la PCTómate una cervecita bien fría, pon en marcha el ventilador y ale, a dormir, jejejeje
Nos leemos
Saludos,