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

Означает ли это, что я не могу делиться формой между delphi 2007 и 2009?


person Fabio Gomes    schedule 07.11.2008    source источник


Ответы (5)


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

person Lars Truijens    schedule 07.11.2008
comment
Вы попробовали мой ответ? Мне показалось, что это сработало с оговоркой, как уже упоминалось - специфические для D2009 свойства не сохраняются обратно в .dfm в D2007 - но пока вы не изменяете и не повторно сохраняете форму в D2007, они, по крайней мере, будут сохранены. - person Ondrej Kelle; 18.11.2008
comment
Я думаю, это возможно, но не очень практично - person Lars Truijens; 19.11.2008

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 в его раздел requires и добавьте к нему следующий модуль:

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:

Сообщения об ошибках IDE

person Ondrej Kelle    schedule 08.11.2008
comment
+1 за простое наблюдение, что собственность существует до D2009. Я этого не знал. Теперь я могу исправить некоторые проблемы, просто включив его во время загрузки в FormCreate. Очень полезно! - person Chris Thornton; 27.09.2012

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

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

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

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

person Bruce McGee    schedule 07.11.2008
comment
Я не согласен с тем, что Delphi легко переносит проекты. Раньше я выполнял миграции, и кажется, что большинство компонентов / элементов управления нуждаются как минимум в незначительных, а часто и в серьезных изменениях. Это по сравнению с тем, что проект на C #, выполненный в Visual Studio, намного хуже. - person Boris Yankov; 02.02.2009
comment
Значит, ваш опыт отличался от моего. Начиная с Delphi 1, я не думаю, что работал над одним проектом, который не был перемещен хотя бы раз. Это почти всегда было очень простым. Я даже могу пересобрать некоторые из них в предыдущие версии. - person Bruce McGee; 03.02.2009
comment
Проблемы, которые у меня были, были ограничены моим кодом для обхода ошибок VCL. Затем, когда выходит новая версия, мне иногда приходится отменять обходные пути, а затем находить и внедрять исправления для всех новых ошибок VCL. Но основная совместимость от одной версии к другой в Delphi превосходна. - person David Heffernan; 03.12.2010

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

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

И это работало без сообщений. Но может тебе не так повезло.

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

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

person Toon Krijthe    schedule 07.11.2008

Вы можете безопасно добавить свойства в код в методе OnCreate для формы и обернуть их {$ IFDEF VER200} // NEW PROPERTIES {$ ENDIF} вокруг них. Вы можете оставить DoubleBuffered вне ifdefs, как это было в Delphi 2007, просто недоступным для инспектора свойств.

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

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

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

person skamradt    schedule 07.11.2008