Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2021
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 14
engranaje Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 10-05-2021
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
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?
__________________
Sean los orientales tan ilustrados como valientes.
Responder Con Cita
  #3  
Antiguo 10-05-2021
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
Cita:
Empezado por engranaje Ver Mensaje
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?)
__________________
Sean los orientales tan ilustrados como valientes.
Responder Con Cita
  #4  
Antiguo 10-05-2021
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 14
engranaje Va por buen camino
Wink

Cita:
Empezado por strelok Ver Mensaje
¿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.
Responder Con Cita
  #5  
Antiguo 11-05-2021
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
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.
__________________
Sean los orientales tan ilustrados como valientes.
Responder Con Cita
  #6  
Antiguo 11-05-2021
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
Unhappy

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
__________________
Sean los orientales tan ilustrados como valientes.
Responder Con Cita
  #7  
Antiguo 12-05-2021
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 14
engranaje Va por buen camino
No tengo experiencia al respecto, siento no serte de ayuda, ya digo para eso uso Gexperts: http://www.gexperts.org/tour/index.h...omponents.html.

En delphi 5 también uso cnpack que tiene herramientas como el "Open High Version Forms Tool" :

Cita:
Welcome to Open High Version Forms Tool!

Forms in Delphi/C++Builder 6 and above used UTF8 to save AnsiStrings and WideStrings, if DFM files includes SCB case characters, it can not opened in Delphi/BCB 5, even if saved to text format.
This wizard can convert both text and binary format of high version forms.
You can use it to open high version forms directly. Notice: corresponding units will be opened again, so remember to save the unit before re-opening if changes are made.
Responder Con Cita
  #8  
Antiguo 12-05-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Hola, Strelok.

Por algunas de las respuestas que haz dado he dado por sentado que estás empezando, pero también llego a sentir algo de frustración por la poca diligencia que haz mostrado y me refiero mas que todo a la profundización del tema sea con la solución que he planteado o alguna otra.

- El convert.exe, como ya haz podido corroborar, cambia el contenido del .dfm de binario a texto y viceversa.

- No veo necesario copiar los ejecutables. Para eso puedes pasar rutas completas. Ej:

Código:
"C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\refind.exe" /S /Y /I /Q /B:2  "C:\Users\movorack\Documents\Embarcadero\Studio\Projects\Prueba1\*.dfm" /X:"C:\Users\movorack\Documents\Embarcadero\Studio\Projects\Prueba1\refind_Rules.txt"
- Con respecto a tu duda:

Cita:
¿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?
En la documentación de refind que se encuentra en embarcadero. (http://docwiki.embarcadero.com/RADSt...Ex_Expressions) explican que se puede usar la regla #migrate para modificar una propiedad. Y que este cambio puede limitarse a una clase en especifico.

En el archivo de ejemplo para migrar de BDE a Firedac, colocan entre otros ejemplos estos:
Código:
#migrate TTable:ReadOnly -> UpdateOptions.ReadOnly
#migrate TDatabase:Execute -> ExecSQL
Que modifica la propiedad ReadOnly solamente en la clase TTable y Execute en la clase TDatabase.

Entonces, si lo que requieres es modificar el nombre de la propiedad porque en el nuevo componente tiene otro nombre, esta es la opción.

Pero, si lo que buscas es modificar el valor de una propiedad, La cosa se complica un poco. Aunque no es nada que no puedas manejar.

Para este ejemplo, he añadido a un nuevo proyecto varios componentes que tengan la propiedad "Caption", pero solo requiero modificar el valor de Caption para el o los componentes TLabel

Ejemplo del DFM:

Código:
object Form1: TForm1
  Caption = 'Form1'
  object Label1: TLabel
    Caption = 'Label1'
  end
  object Button1: TButton
    Caption = 'Button1'
  end
  object RadioButton1: TRadioButton
    Caption = 'RadioButton1'
  end
end
Para esto debo crear un archivo de reglas que será usado por el refind. El archivo lo he creado con estas dos reglas

Código:
#migrate TLabel:Caption -> Caption = 'Mi nuevo caption'__REMOVE:
\'__REMOVE:\s*\=\s*\'.*\' -> '
(Aclaro que esto no está documentado, y puede que exista una mejor forma de hacerlo hasta con expresiones regulares.)

En la primera regla, se cambia la propiedad "Caption" por "Caption = 'Mi nuevo caption'__REMOVE", añadiendo tanto el nuevo valor como la marca "__REMOVE" para ser usada en la segunda regla

Si solo ejecutara el refind con esa primera regla obtendría en el dfm el siguiente resultado

Código:
object Form1: TForm1
  Caption = 'Form1'
  object Label1: TLabel
    Caption = 'Mi nuevo caption'__REMOVE: = 'Label1'
  end
  object Button1: TButton
    Caption = 'Button1'
  end
  object RadioButton1: TRadioButton
    Caption = 'RadioButton1'
  end
end
Lo que generaría error al abrir el archivo, por eso es necesaria la segunda regla, que corrige ese error.

La segunda regla se encarga de borrar desde la marca "__REMOVE" hasta el final de la línea y así obtenemos

Código:
object Form1: TForm1
  Caption = 'Form1'
  object Label1: TLabel
    Caption = 'Mi nuevo caption'
  end
  object Button1: TButton
    Caption = 'Button1'
  end
  object RadioButton1: TRadioButton
    Caption = 'RadioButton1'
  end
end
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #9  
Antiguo 13-05-2021
strelok strelok is offline
Miembro
 
Registrado: sep 2017
Posts: 181
Poder: 7
strelok Va por buen camino
Sí, se podría decir que recién estoy empezando, aunque tuve una experiencia en Delphi, fue muy corta y hace ya algunos años.

No indagué mucho, y la verdad es que, la solución que aportas para eliminar el valor de una propiedad, puede que nunca se hubiese ocurrido.

Muchas gracias por tu aporte
__________________
Sean los orientales tan ilustrados como valientes.
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
Cambio de dbgrid a otro macrossman Varios 3 22-03-2011 01:40:36
Cambio de foco a otro edit odrack Varios 30 14-03-2008 19:27:02
Como Automatizar mi backup de datos enecumene OOP 9 30-10-2007 16:14:38
¿Como hacer foco a otro componente de un TPageControl? burasu Varios 4 30-06-2004 17:04:43
Componentes Visuales, como propiedad de otro Componente ingacg OOP 5 01-07-2003 23:10:39


La franja horaria es GMT +2. Ahora son las 22:32:42.


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