regex delphi properties delphi-2006 dfm

regex - Una forma rápida de eliminar propiedades de archivos.dfm en Delphi



properties delphi-2006 (4)

Recientemente modifiqué uno de mis componentes, y resulta que ya no usa una de las propiedades que usaba antes.

Sin embargo, esas propiedades están escritas en múltiples archivos .dfm a lo largo del proyecto. Ahora, cuando intento compilar el proyecto, aparece "Error al leer.: Propiedad <...> no existe"

La parte complicada es que el valor de la propiedad es información binaria (almacenada en varias líneas), y no puedo borrarla con Delphi replace o notepad ++ regexp (ya que están basados ​​en una única línea).

Entonces mi pregunta sería:

¿Hay alguna herramienta de terceros o formas de eliminar fácilmente propiedades de múltiples archivos .dfm?


El Jedi VCL contiene una herramienta llamada DFMCleaner :

DFMCleaner es una herramienta para eliminar propiedades no admitidas de los DFM. Si guarda un archivo dfm en una versión de Delphi y desea usarlo en una versión anterior, es probable que haya algunas propiedades no admitidas, generando un error cuando se abre el formulario en Delphi. Lo que es aún peor, si el dfm es parte de un paquete de tiempo de diseño, Delphi instalará el paquete sin errores, pero cuando intente acceder al formulario en tiempo de diseño (por ejemplo, si el formulario es utilizado por un editor de propiedades), Delphi genera un AV en su lugar.

Se encuentra en jvcl-install / devtools / DFMCleaner (proyecto con código fuente y archivo de configuración de ejemplo)


En mi caso, el simple cierre del proyecto y la eliminación del archivo DProj ayudaron.



Un posible enfoque es modificar su componente para que sea simplemente capaz de ignorar estas propiedades. De esta forma no tienes que buscarlos en todos y cada uno de los archivos .dfm.

Por ejemplo:

type TIgnoreFormPropertyHelper = class public class procedure IgnoreBooleanProperty(Reader: TReader); class procedure IgnoreIntegerProperty(Reader: TReader); end; { TIgnoreFormPropertyHelper } class procedure TIgnoreFormPropertyHelper.IgnoreBooleanProperty(Reader: TReader); begin Reader.ReadBoolean; end; class procedure TIgnoreFormPropertyHelper.IgnoreIntegerProperty(Reader: TReader); begin Reader.ReadInteger; end; type TMyComponent = class(...) .... protected procedure DefineProperties(Filer: TFiler); override; .... procedure TMyComponent.DefineProperties(Filer: TFiler); begin inherited; Filer.DefineProperty(''MyLegacyBooleanProperty'', TIgnoreFormPropertyHelper.IgnoreBooleanProperty, nil, False); Filer.DefineProperty(''MyLegacyIntegerProperty'', TIgnoreFormPropertyHelper.IgnoreIntegerProperty, nil, False); end;