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)

engranaje 12-05-2021 09:27:16

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.

movorack 12-05-2021 17:29:25

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


strelok 13-05-2021 07:52:18

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 :D


La franja horaria es GMT +2. Ahora son las 21:05:57.

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