Свойство DoubleBuffered, добавляемое в dfm в Delphi 2009, не существует в Delphi 2007

При использовании для украшения элементов атрибуты могут содержать параметры инициализации, которые будут отправлены в конструктор атрибута.

Для экземпляра

[DataMember(EmitDefaultValue = true)]
public int Property { get; set; }

компилируется в

.custom instance void
[System.Runtime.Serialization]System.Runtime.Serialization.DataMemberAttribute::.ctor() = 
( 01 00 01 00 54 02 10 45 6D 69 74 44 65 66 61 75 6C 74 56 61 6C 75 65 01 )

Последовательность кодов байтов, которую вы видите, соответствует инициализации параметра EmitDefaultValue.

В вашем случае

01 00 00 00

- это последовательность байтов, используемая, когда никакие параметры не передаются в конструктор атрибутов.

6
задан Cœur 9 December 2017 в 17:31
поделиться

5 ответов

Да. Это не возможно, если Вы не удаляете свойства, которые не публикуются в Delphi 2007 от DFM.

6
ответ дан 8 December 2019 в 03:40
поделиться

DoubleBuffered был в TWinControl в течение некоторого времени теперь. Различие в Delphi, который 2009 - то, что это публикуется теперь. Если можно жить только с игнорированием ошибок (и не создание работы свойств вместо этого), вот возможное решение:

unit Delphi2009Form;

interface

uses
  Windows, Classes, SysUtils, Controls, Forms;

type
{$IFDEF VER200}
  TDelphi2009Form = class(TForm);
{$ELSE}
  TDelphi2009Form = class(TForm)
  private
    procedure ReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
  protected
    procedure ReadState(Reader: TReader); override;
  end;

  TReaderErrorProc = procedure(const Message: string);

var
  ReaderErrorProc: TReaderErrorProc = nil;
{$ENDIF}

implementation

{$IFNDEF VER200}
type
  THackReader = class(TReader);

procedure TDelphi2009Form.ReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
begin
  with THackReader(Reader) do
    Handled := AnsiSameText(PropName, 'DoubleBuffered') or AnsiSameText(PropName, 'ParentDoubleBuffered');
  if Handled and Assigned(ReaderErrorProc) then
    ReaderErrorProc(Message);
end;

procedure TDelphi2009Form.ReadState(Reader: TReader);
begin
  Reader.OnError := ReaderError;
  inherited ReadState(Reader);
end;
{$ENDIF}

end.

Затем измените объявления форм в Вашем проекте наследоваться TDelphi2009Form, например:

type
  TFormMain = class(TDelphi2009Form)
  ...

Это будет работать во времени выполнения - ошибки свойства будут проигнорированы. Для создания это работать во время проектирования также создает пакет только для дизайна, добавляет, что designide.dcp к требует пункта, и добавьте следующую единицу к нему:

unit Delphi2009FormReg;

interface

uses
  Delphi2009Form;

procedure Register;

implementation

uses
  DesignIntf, DesignEditors, ToolsAPI;

procedure ShowReaderError(const Message: string);
begin
  with BorlandIDEServices as IOTAMessageServices do
    AddTitleMessage(Message);
end;

procedure Register;
begin
  RegisterCustomModule(TDelphi2009Form, TCustomModule);
  ReaderErrorProc := ShowReaderError;
end;

initialization

finalization
  ReaderErrorProc := nil;

end.

Установите пакет в IDE Delphi 2007, и ошибки свойства для свойств DoubleBuffered и ParentDoubleBuffered будут проигнорированы автоматически при открытии форм в IDE. Значения свойств будут потеряны при сохранении формы в Delphi 2007, таким образом, необходимо инициализировать их в коде вместо этого.

Править: Я добавил код для вывода сообщений об ошибках читателя к окну IDE Messages:

IDE error messages

14
ответ дан 8 December 2019 в 03:40
поделиться

Проекты Delphi всегда были чрезвычайно легки к порту вперед к новым версиям. Необходимо быть более осторожными, но использование текущего кода с более старыми компиляторами является довольно прямым, также. Я поддержал код в Delphi 2005/2006/2007, который другие люди все еще должны были использовать в Delphi 6 и 7.

Если Вы удаляете несовместимые свойства из DFMs, они должны работать правильно в более старых версиях, не портя их для Delphi 2009. Самым большим примером является явное* свойства, представленные в Delphi 2006. У меня есть дом варивший "скребок DFM", который разделяет их. Помните, эти свойства существуют по причине, таким образом, необходимо только вычистить, что Вы намереваетесь быть обратно совместимыми.

Вы могли бы также считать инвестирование в статические инструменты анализа кода как CodeHealer или Паскаль Анализатором. Вдобавок к указанию на проблемы (особенно CodeHealer) и помощь Вам очистить Ваш код, можно выбрать который версия Delphi проанализировать против, помогая найти несовместимости кроме свойств DFM. И они могут быть автоматизированы как часть Вашего процесса сборки.

Просто примечание. Совместно используйте исходный код, но разделите проекты для каждой версии. Это особенно важно между Delphi 2007 и Delphi 2009. Более свежий .dproj файл использует то же расширение, но не совместим с Delphi 2007. Вы могли работать в к некоторой провине с несовместимыми ресурсами, также.

4
ответ дан 8 December 2019 в 03:40
поделиться

Можно безопасно добавить свойства в коде в методе OnCreate для формы и перенестись {$IFDEF VER200}//НОВЫЕ СВОЙСТВА {$ENDIF} вокруг них. Можно покинуть DoubleBuffered вне ifdefs, поскольку он присутствовал в Delphi 2007, просто не доступный инспектору свойств.

Необходимо будет ТОЛЬКО волноваться о свойствах, которые Вы устанавливаете отличающийся от значения по умолчанию. Для с двойной буферизацией только необходимо волноваться об этом, если это имеет значение true.

При загрузке формы Delphi 2009 в Delphi 2007 Вы получите предупреждение, что свойство собирается быть уничтоженным, просто сделайте примечание тех свойств, поскольку это - те, что необходимо будет иметь дело с.

Я использую просто такой метод для миграции моего кода в Delphi 2009 от Delphi 2006. Большинство моих проектов содержит несколько совместно используемых устройств и должно скомпилировать в Delphi 2006 для поставлющейся версии и Delphi 2009 для "следующего" выпуска. Я также делаю большое использование {UNICODE $IFDEF} определяет, где я должен обеспечить, чтобы строка была widestring или ansistring в зависимости от стандартной программы.

2
ответ дан 8 December 2019 в 03:40
поделиться

Каждая форма имеет dfm файл, который содержит настройки свойства формы и ее компонентов. Некоторые значения свойств имеют значения по умолчанию, таким образом, они не хранятся, если значение по умолчанию сохранено. Просто сделал маленький тест:

  • Создайте форму в 2009
  • Добавьте несколько стандартных средств управления
  • Сохраните его
  • Откройте его в 2006 (жаль № 2007 на этом ПК)

И это работало без сообщений. Но возможно Вы не так удачливы.

С Delphi это часто немного неприятно для обмена данными между версиями. Обновляющие возможности являются большими, но понижение неприятно. Таким образом, я отговариваю от совместно использования файлов формы между различными версиями.

Насколько я знаю, не возможно добавить, что условное выражение определяет в dfm файле. Но с другой стороны, сделайте мы действительно хотим это... Я предпочел бы механизм, который игнорирует неизвестные свойства.

2
ответ дан 8 December 2019 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: