Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Cómo automatizar el cambio de un componente por otro? (https://www.clubdelphi.com/foros/showthread.php?t=95175)

strelok 04-05-2021 07:30:19

¿Cómo automatizar el cambio de un componente por otro?
 
Buenos días,

Hay varios proyectos a los que se les debe cambiar la versión de algún componente (componentes propios). La forma que me mostraron es la siguiente (más o menos, puede que se me olvide mencionar algún paso).

1- Entrar a los .DFM uno por uno y reemplazar el nombre del componente viejo por el nuevo.
2- En el mismo .DFM eliminar las propiedades del componente viejo que ya no tenga el nuevo.
3- Modificar un fichero.pas que es el principal en estas aplicaciones.

En principio, lo anterior sería lo principal, el resto dependería del proyecto ¿es posible automatizar eso? Lo único que veo difícil es el punto 2.

Saludos.

movorack 04-05-2021 14:54:08

¡Hola, Strelok!

Puede que esta utilidad te ayude en algo.

reFind.exe, the Search and Replace Utility Using Perl RegEx Expressions

strelok 05-05-2021 07:20:06

Hola, gracias por tu respuesta.

¿Sirve para Delphi 5?

Tengo que ver cómo instalar eso

engranaje 05-05-2021 14:09:04

En delphi 5, sí tienes montado GExperts, existe una opción Replace components... que es posible que para tu caso resuelva el problema que planteas de una forma más fácil.

movorack 05-05-2021 17:00:17

Hola.

reFind.exe es un programa de línea de comandos. Se encuentre en el directorio "bin" en las instalaciones de RAD Studio. Bajando una copia de Delphi Community Edition lo puedes obtener.

En el link que pasé está como usarlo y la idea es que hay reglas para cambiar nombres de componentes, dejar de usar unidades y hasta eliminar propiedades.

Entonces para lo que describes sería bastante útil.

strelok 06-05-2021 07:26:13

¿Entonces propones bajarme una versión actual de delphi para obtener ese .exe y usarlo en Delphi 5? ¿No me lo podrías pasar tú?

Sí, leí que es para líneas de comandos y funciona con expresiones regulares, así que, he pensando en desarrollar una pequeña funcionalidad que genere un fichero con las expresiones regulares en base a varios parámetros y luego ejecute ese .exe. ¿cómo lo ves? mi idea es que lo pueda usar cualquiera y no tenga que pelearse con las expresiones regulares.

strelok 06-05-2021 08:19:23

Bueno, acabo de ver que, además de tener delphi 5, tenemos delphi 10.3 (aunque no tengamos ningún proyecto con esta versión).

En fin, he encontrado reFind y me he copiado los ficheros que se pueden apreciar la siguiente captura de pantalla:

https://ibb.co/KbGT2QX


¿Estos serían los ficheros o falta algún otro? quizás, únicamente con el reFind.exe sea suficiente.

movorack 06-05-2021 17:43:38

¡Sí!, lo que propuse fue que consiguieras el "refind.exe" por tus medios. Y según me informas, al parecer ya lo hiciste.

strelok 07-05-2021 06:58:00

Definitivamente refind.exe era lo que estaba buscando, no obstante, a pesar de que parece estar reemplazando todo bien en los ficheros .PAS, me corrompe los .DFM ¿seguro que funciona para Delphi 5? ¿los .DCU deberían modificarse?

engranaje 07-05-2021 08:22:45

Los dcu deben volver a generarse cuando cambian los pas. Si delphi 5 no reconoce que el pas ha cambiado puede no generar el dcu correspondiente al compilar, pero al hacer un Build siempre debería volver a generar los dcu. yo reconozco que nunca he usado refind con delphi 5, ya comenté que con delphi 5.0 uso el replace componente de gexperts. ¿Podrías comentar como corrompe exactamente los dfm?. ¿Los dfm de tu proyecto son "text DFM" o son binarios? puedes comprobarlo abriéndolos con cualquier editor de texto o pulsando con el boton derecho sobre el formulario y comprobando si tienes marcada con un check la última opción del menú que se muestra "text DFM".

strelok 07-05-2021 12:32:36

Cita:

Empezado por engranaje (Mensaje 540836)
Los dcu deben volver a generarse cuando cambian los pas. Si delphi 5 no reconoce que el pas ha cambiado puede no generar el dcu correspondiente al compilar, pero al hacer un Build siempre debería volver a generar los dcu. yo reconozco que nunca he usado refind con delphi 5, ya comenté que con delphi 5.0 uso el replace componente de gexperts. ¿Podrías comentar como corrompe exactamente los dfm?. ¿Los dfm de tu proyecto son "text DFM" o son binarios? puedes comprobarlo abriéndolos con cualquier editor de texto o pulsando con el boton derecho sobre el formulario y comprobando si tienes marcada con un check la última opción del menú que se muestra "text DFM".

Creo que aquí, para cambiar los componentes acceden como "text DFM", sino no se puede (actualmente lo hacen de forma manual). En un rato edito esta respuesta y subo una captura de pantalla del error que me muestra delphi luego de usar el refind.exe en ficheros DFM.

strelok 07-05-2021 14:42:43

Bueno, he probado nuevamente.

Aquí les dejo lo que ejecuté en consola (en color rojo lo censurado): https://ibb.co/F5287w8

Aquí el error que me da Delphi 5: https://ibb.co/DGRKrc2

Básicamente hice lo siguiente:

1- Hice una copia de un proyecto en C:\\
2- Copie refind.exe dentro de la copia del proyecto (del paso 1).
3- Ejecuté CMD y hice un CD a la ruta completa de proyecto.
4- Ejecuté el comando que pueden observar en la primera imagen.
5- Obtuve el error que pueden observar en la segunda imagen.

Para evitar hacer un CD a la ruta del proyecto, simplemente se puede poner entre comillas dobles la ruta completa a refind.exe pero, mi duda es la siguiente ¿cómo indico la ruta del proyecto? (para no tener que estar copiando el ejecutable dentro de cada proyecto)

movorack 07-05-2021 15:02:29

Hola!

La función de refind.exe reemplaza texto con las reglas que le estableces y tus .dfm sin convertir, aunque se pueden tratar como archivos de texto, en realidad tienen cierto formato especifico que requiere Delphi. Así que modificarlos manualmente o con una herramienta externa puede afectarlos.

Entonces, se hace necesario que los conviertas a texto. Para ello puedes usar la herramienta convert.exe que se encuentra dentro de la carpeta bin en la instalación de Delphi (Incluido en Delphi 5).

No encontré documentación de esa herramienta en la web de embarcadero, encontré este link que puede servirte de ayuda.

engranaje 09-05-2021 10:42:51

Si todos los dfm están en modo texto y al pasar refind como veo no has tenido ningún error p,odrías comprobar si el error al intentar abrir los dfm con delphi te pasa con todos los dfm que has cambiado o solo con unos pocos. Incluso abrirlo para comprobar si ves en ellos algo "raro".

Me temo que he estado intentando buscar algo de documentación al respecto para pegar un enlace pero con poca fortuna, pero la longitud de las líneas en modo texto de los .dfm en delphi 5 tien una longitud máxima, esa longitud cambió en los posteriores delphi y recuerdo que un error similar se producía si lanzabas el convert.exe que venía con delphi 7 contra algunos .dfm binarios de delphi 5. Cuando revisabas el los formularios que fallaban si no recuero mal, el problema eran siempre líneas demasiado largas para delphi 5.0. Podrías comprobar eso.

strelok 10-05-2021 11:04:59

Entonces, ¿la idea sería usar convert.exe (supongo que ya viene con delphi 5, o no?) para convertir todos los .DFM en .TXT, luego aplicar refind.exe sobre esos .TXT y, por último, convertir los .TXT modificados nuevamente en .DFM con convert.exe?

strelok 10-05-2021 11:08:51

Cita:

Empezado por engranaje (Mensaje 540865)
Si todos los dfm están en modo texto y al pasar refind como veo no has tenido ningún error p,odrías comprobar si el error al intentar abrir los dfm con delphi te pasa con todos los dfm que has cambiado o solo con unos pocos. Incluso abrirlo para comprobar si ves en ellos algo "raro".

Me temo que he estado intentando buscar algo de documentación al respecto para pegar un enlace pero con poca fortuna, pero la longitud de las líneas en modo texto de los .dfm en delphi 5 tien una longitud máxima, esa longitud cambió en los posteriores delphi y recuerdo que un error similar se producía si lanzabas el convert.exe que venía con delphi 7 contra algunos .dfm binarios de delphi 5. Cuando revisabas el los formularios que fallaban si no recuero mal, el problema eran siempre líneas demasiado largas para delphi 5.0. Podrías comprobar eso.


¿Por qué lanzabas convert.exe que venía con delphi 7 en ficheros de delphi 5? (por lo que veo, convert.exe viene con delphi 5 ¿por qué no usar ese?)

strelok 10-05-2021 11:21:55

Cita:

Empezado por movorack (Mensaje 540845)
Hola!

La función de refind.exe reemplaza texto con las reglas que le estableces y tus .dfm sin convertir, aunque se pueden tratar como archivos de texto, en realidad tienen cierto formato especifico que requiere Delphi. Así que modificarlos manualmente o con una herramienta externa puede afectarlos.

Entonces, se hace necesario que los conviertas a texto. Para ello puedes usar la herramienta convert.exe que se encuentra dentro de la carpeta bin en la instalación de Delphi (Incluido en Delphi 5).

No encontré documentación de esa herramienta en la web de embarcadero, encontré este link que puede servirte de ayuda.

No entiendo para qué sirve ese programa ¿no basta con ejecutarlo por línea de comandos? algo como: convert.exe *.DFM y luego hacer la inversa?

engranaje 10-05-2021 19:43:35

Cita:

Empezado por strelok (Mensaje 540874)
¿Por qué lanzabas convert.exe que venía con delphi 7 en ficheros de delphi 5? (por lo que veo, convert.exe viene con delphi 5 ¿por qué no usar ese?)


Por error :). Varias versiones de Delphi distintas instaladas en el mismo equipo y yo metiendo pata. De hecho .dfm en binarios en delphi 5.0 casi siempre era/es por error, procuro tenerlos siempre como texto. Lo de usar convert venía de los tiempos de delphi 2.0 cuando no tenía más remedio.


El motivo por el que comenté esto era más por el hecho de que a veces utilizar herramientas de una versión posterior para modificar .dfm puede causar que al intentar abrirlo salten ese tipo de errores.


Cita:

No entiendo para qué sirve ese programa ¿no basta con ejecutarlo por línea de comandos? algo como: convert.exe *.DFM y luego hacer la inversa?

Realmente convert sirve para pasar .dfm de formato binario a texto y a la inversa. Hacer lo que comentas en principio debería dejar el .dfm tal y como estaba. Ahora que en principio si el .dfm estuviera en modo texto con errores y le pasaras el convert.exe para convertirlo en binario deberías obtener un mensaje de error.

strelok 11-05-2021 07:08:19

Ayer lo estuve probando y parece ser que funciona a la perfección, no obstante, no los vuelvo a convertir a binarios. Es decir, los convierto a texto y luego aplico el refind.exe.

Miren el lio que me estoy montando:

Estoy creando un script de PHP que genere un fichero .BAT en base a unas configuraciones (que N componentes hay que reemplazar y por cuáles, qué propiedades, directorio del proyecto, etc). Una vez generado el fichero .BAT, el script PHP lo ejecutará. El fichero bat lo que hace es copiar convert.exe y refind.exe al directorio del proyecto, genera las expresiones regulares (para refind) y ejecuta ambos.

Puede que sea un lio, pero veo que se puede automatizar casi todo por esta vía.

strelok 11-05-2021 13:04:52

Aquí va la pregunta del millón:

¿Cómo puedo crea una expresión regular para refind.exe, de tal forma que le diga para reemplazar una propiedad, si sólo sí, esa propiedad forma parte de un componente?

De momento tengo esto:

refind.exe *.dfm *.pas /W /Y /B:0 /P:"Propiedad='valor'" /R:"Propiedad = valor"
refind.exe *.dfm *.pas /W /Y /B:0 /P:ComponteAReemplazar /R:ComponenteNuevo

El problema es que, muchos componentes pueden tener la propiedad del primer comando y lo que interesa es cambiar en el componente a reemplazar y no en todos.

Agradecería ayuda con esto


La franja horaria es GMT +2. Ahora son las 00:44:30.

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