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.
Prueba esta herramienta Delphi DFM properties remover
, funciona con versiones anteriores de Delphi pero quizás pueda ayudarte.
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;