Componente TSelectOnRuntime
(versión 1.5)
Permite seleccionar componentes visuales (en Runtime) que haya en un form de forma visual como se hace con las imágenes en los programas de diseño o con los controles en el IDE de Delphi.
Además se pueden mover y redimensionar los controles seleccionados. Basta con soltar el control en el formulario, asignarle el control que se desea seleccionar/mover/redimensionar y activarlo.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
O arquivo
http://neftali.clubdelphi.com/componentes/CSelectOnRunTime.zip está corrompidoo
Cierto. al subirlo debió quedar «a medias».
Ya está subida la nueva versión correcta.
Gracias por el aviso.
________
Neftalí
Ey Neftali, estas hecho un tiro con el blog, muy útiles componentes y muy buenos artículos, felicitaciones y muchas gracias :).
Gracias Jhonny.
Espero que ahora las actualizaciones puedan ser más habituales.
Yo sigo atento al tuyo a ver esas sopresas que nos prometes. ;-DD
Un saludo.
Not correctly working on RAD Studio 2010
and pease fix this:
[DCC Warning] CSelectOnRunTime.pas(304): W1036 Variable ‘parentRight’ might not have been initialized
[DCC Warning] CSelectOnRunTime.pas(310): W1036 Variable ‘parentBootom’ might not have been initialized
[DCC Hint] CSelectOnRunTime.pas(259): H2164 Variable ‘frmPoint’ is declared but never used in ‘TSelectOnRunTime.ControlMouseMove’
[DCC Hint] CSelectOnRunTime.pas(673): H2164 Variable ‘i’ is declared but never used in ‘TSelectOnRunTime.SetActive’
[DCC Warning] CSelectOnRunTime.pas(748): W1036 Variable ‘repos’ might not have been initialized
[DCC Warning] CSelectOnRunTime.pas(749): W1036 Variable ‘wc’ might not have been initialized
I’m fix it that:
procedure TSelectOnRunTime.ControlMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
const
minWidth = 20;
minHeight = 20;
var
newPos: TPoint;
frmPoint : TPoint;
_CanMove, _CanMoveOutParent:Boolean;
newLeft, newTop, newRight, newBottom:Integer;
parentRight, parentBootom:Integer;
begin
parentRight:=0; //first fix
parentBootom:=0; //Second fix
(and do it for «repos:=0» and «wc:=nil»)
and I kill «frmPoint» and «i» variables where I’m see Hints
but Also not correctly working if i do this SelectOnRunTime1.SelectControl=nil;
Thanks for your comments.
have corrected the warnings and upload the new version, with some changes that i have pendents.
Regards.
Your component not work in Delphi 2007.
when open Demo1.Dpr error Creating form Access Violation.
do you have new version for delphi 2007 and 2010?
thanks.
Muy bueno tu componente, pero desearia portarlo al Lazarus, ya que tengo un proyecto que necesita ser creada por Lazarus.
@Cristopher
Hola Cristopher.
Puedes probar a realizarlo. Tienes todo el código fuente necesario. Yo en eso no puedo ayudarte, ya que no he trabajado con lazarus hasta ahora.
Si consigues que funcione avísame por favor.
Gracias.
El componente TSelectOnRuntime fue ya convertido a Lazarus tuve una guerra con la unidad Contnrs.pas, pero mi proyecto me necesitaba guardar los cambios al dialogo hechos por el componente y converti tu TSaveComps, aunque una tiene como comentada una funcion que cuando un fichero existe es renombrado con la extension .bak.
Pronto este codigo estara disponible te lo notificare cuando suba los ficheros.
Muchas gracias Cristopher por el comentario, y enhorabuena por la traducción.
Un saludo.
Asi una pequeña duda: en mi proyecto utilizando los componentes ya portados. es posible usar TSaveComps y TSelectOnRuntime en un TFrame ya que deseo darle estilo al diseñador como InstallShield 2008.
@Cristopher
Hola Cristofer. Son componentes no visuales, ambos; No acabo de entender a qué te refieres con usarlos en un TFrame.
Hola, hace tiempo que no hablamos. Tu componente es muy bueno ya está portado a Lazarus (Incluyendo a TSaveComps). Y puedo usarlos en un formulario MDI hijo y los componentes que se seleccionen del formulario padre.
Estoy creando un instalador multiplataforma en Lazarus y Java y el que me da más conflicto es el diseñador de formularios interno del IDE no deseo hacerlo al diseño Delphi sino algo así o en MODO MDI
Ejemplo:
http://www.ethalone.com/CUI.gif
http://www.ethalone.com/Comparison/IS_DE.jpg
@Cristopher
Hola Cristopher.
Me alegra oir eso. Cuando los tengas disponibles para descarga o cuando tengas un enlace, pásamelo y lo publicaré en mi blog.
Un saludo.
Hi,
I’m trying to change the color of the marks (markColor) but I’m not able to do this. Can you help me? I’ve took a look in your code, I’ve changed some things but it didn’t work. I don’t know why, it receive the value of the color but the marks of the component doesn’t change the color.
I’m using the Delphi 2010.
Thank you so much.
@Raphael
Hello Raphael.
I hace test the property MarkColor and it works fine. Now i have uploaded a new version of the component; Test with this version.
In addition I have tested the component with new versions of Delphi (inCluded XE) and it work correctly.
Regards.
Hi,
First of all, thank you so much to answer to me so fast. Second of all, I tried the new version but it didn’t work and show me more problems with image. But, Fortunatally I found where the problem was happening.
TSelectOnRunTime.CreateNodes() – It just changed the colors after I put this code:
Parent := TWinControl(Self._Owner);
In this new version you took away the Repaint from there and put the BringToFront; in the PositionNodes(…).
Working with images, these replaces don’t work fine. Now, I’m trying to this with a list of components.
Thank you so much.
Best Regards
@Raphael
Hello Raphael.
Can you send me a small sample (project) that has this problems, to test and correct the problems.
Thanks.
Regards.
Hi,
First of all, thank you so much to answer to me so fast and I’m able to change de color. Second of all, I tried the new version but it shows me more problems with image. But, fortunatally I think I found where the problem was happening.
In this new version you took away the Repaint from there and put the BringToFront; in the PositionNodes(…).
Working with images, these replaces don’t work fine. Now, I’m trying to this with a list of components.
Thank you so much.
Best Regards
Hi, sorry for the long time to write to you again. Yes I can send it to you but I don’t know how. Can you tell me your email?
Another thing, I’m studying how to use your class to implement the move and resize to more than one component. Today I’m doing an object for each component, because of this, I’m able to select more than one but when I try to move/resize I can do this just one at a time. Do you have some tip for me?
Thank you again!
Regards
@Raphael
You can contact me on german_ral[@]hotmail[DOT]com
Thanks.
Sorry for the long time again, I just have sent the email to you.
Regards
I forgot to say to you. Your class is with memory leak. In the example I already found some thing, but It still have.
See you
No se puede usar en un TPanel?
@Raphael
Thank you Raphael.
Regards
@Cristopher
Hola Cristopher.
No entiendo tu pregunta. Los paneles también se pueden seleccionar. ¿Tienes algun problema?
Un saludo.
No. si el tpanel se puede usar como si fuera un formulario
@Cristopher
Hola Cristopher.
No entiendo. Lo más aproximado a un formulario que no es un formulario, es un Frame.
Un saludo.
Asi, en lugar de usar el formulario como campo de diseño se usa un TPanel.
@Cristopher
No debería haber problema en hacerlo así. En ese caso basta con que los componentes pertenezcan al TPanel en lugar de al formulario. dee sa forma sólo podrán moverse y posicionarse en el Panel.
hola, se puede instalar en delphi 2010?
como lo hago?
@leandro
Hola Leandro.
Sí se puede; Basta con utilizar el DPK que hay en el directorio Package.
Un saludo.
Muchas gracias Neftali por estos componentes, funcionan de diez.
He visto que mientras arrastras un control, no se actualiza el form de detrás (el padre), donde se puede apreciar mejor, es en la aplicación FormDesigner que has realizado, porque no se actualiza los puntitos del grid que se pintan para que creas que estas en tiempo de diseño.
La solución es bien simple, añadir un nuevo evento que se lanza mientras se mueve un control:
[code]
published
…
property OnCanResize:TCanResizeControlEvent read FOnCanResize write FOnCanResize;
//Lepes: Permite realizar tareas mientras se mueve el control en pantalla
// por ejemplo, actualizar el form de detrás
property OnMovingControl: TNotifyEvent read FOnMovingControl write FOnMovingControl;
[/code]
y ya en la implementación del método ControlMouseMove (al final del todo):
[code]
if Assigned ( FOnMovingControl ) then FOnMovingControl( TControl( Sender ) ) ;
[/code]
Saludos y muchas gracias
@Lepe
Gracias Lepe.
En cuanto tengo un momento lo actualizo.
Un saludo.
Hola con esta componente se pueden hacer multiples selecciones y moverlas a la vez?
Gracias
@Braulio
Hola Braulio.
No. Es un componente sencillo, aunque puedes probar a modificar el código fuente.
Un saludo.
y donde se puede descargar la version para lazarus?
la ando buscando que la lei en los comentarios y no la encuentro.
Gracias.
Buenas noches Neftali
Has tenido la oportunidad de probar el TSelectOnRuntime en Delphi XE5?
Los nodos que se dibujan alrededor del control para simular su selección, se muestran incompletos, diferentes a como se ven en los demos que tienes.
Saludos
Hola Miguel.
No he podido compilar el componente en XE5 todavía, así que no he podido comprobar el funcionamiento.
Tienes el código disponible.
¿Sabes más o menos dónde se encuentra el problema?
Hola Neftali:
En primer lugar darte las gracias por tu componente, lo estoy usando y la verdad es que ha sido sencillo de instalar de usar y de comprender. Pero me ha salido una duda, que no se si es posible sobre este componente o conoces algún otro sobre el que puedas conocer.
Estoy utilizando el componente sobre TImage y perfecto para moverlo y cambiar el tamaño, pero también me gustaría saber si podemos rotar la imagen. ¿se te ocurre una solución o ves la posibilidad?
@Victor
Hola Víctor.
Gracias por los comentarios.
La verdad es que no conozco ningún componente gratuíto que haga lo que comentas. No al menos los que están enfocados como este a simular el comportamiento en el IDE.
Tienes el código fuente del componente y está comentado. También puedes intentar modificarlo, aunque no me parece trivial.
Un saludo.
Este componente funciona en Berlin ?
@Yosley
No lo he probado, pero debería funcionar tal y como está o con mínimos cambios.
Hi,
Are they compatible with Delphi seattle and firemonkey ?
Hola,
tengo dos preguntas.
1. No encuentro el componente TSaveComps;
2. Cuando termino de mover una TImage con el componente SelectOnRunTime, me gustaria guardar las coordinadas X y Y del TImage de manera de actualizar en tiempo real el nuevo mapa. Todas mis imagenes estan guardadas en un archivos que representa los barriles de una cantina y de manera dinamica lo actualizo segun los cambio que el usuario hace directamente en el mapa. No logro interceptar cuando SelectOnRunTime termina de mover el TImage. Algunas ayuda?
Utilizo Delphi 10.3
Muchas Gracias
Mirko
@Mirko
Hola Mirko.
Puedes encontrar el componente TSaveComps dentro de la librería GLib o como componente suelto. en estas dos páginas están los links.
https://neftali.clubdelphi.com/componentes-generales-glib/
https://neftali.clubdelphi.com/componente-tsavecomps/
En cuanto al componente TSeleccOnRuntime, te adjunto el componente con unas pequeñas modificaciones para tener eventos de OnBeginMove y OnEndMove.
https://neftali.clubdelphi.com/componentes/CSelectOnRunTime_v2.zip
Te devuelven la posición del componente al iniciar el movimiento y al finalizar, con respecto a su contenedor.
Espero que te sea útil.
@Germán Estévez
Muchas gracias German,
en esto estaba trabajando pero me anticipaste. Exactamente lo que necesitaba.
Lo unico es que cuando reinicio el Delphi el componente se me disinstala.
En las Library ya agregue:
– C:\01 Componenti\SelectOnRunTime\Sources
– C:\01 Componenti\SelectOnRunTime\Package
y me compila y todo…..solo que no me lo mantiene y cada vez reinicio el Delphi me toca juntar nuevamente la GlibD6.bpl
Utilizo Delphi 10.3.3
@Mirko
He cambiato simplemente el nombre del DPK
de
__Package de componentes de Neftalì
en
Package de componentes de Neftalì
No se que decir….pero ahora queda instalado :)
Muchas gracias
@Mirko
Si, Esa es la solución.
No se porqué en algunas versiones de Delphi, si la descripción del package empieza con _, Delphi lo desinstala cada vez.
A ver si puedo cambiarlo y volver a subir los fuentes.
Un saludo.