这是否意味着我不能在delphi 2007和2009之间共享表单?
发布于 2008-11-07 12:26:48
是。除非您从DFM中删除未在Delphi 2007中发布的属性,否则这是不可能的。
发布于 2008-11-08 20:32:22
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.在Delphi2007IDE中安装该包,在集成开发环境中打开窗体时,将自动忽略DoubleBuffered和ParentDoubleBuffered属性的属性错误。当您在Delphi2007中保存表单时,属性的值将丢失,因此您应该在代码中初始化它们。
编辑:我已经添加了代码来将读卡器错误消息输出到集成开发环境消息窗口:

发布于 2008-11-07 13:06:02
Delphi项目总是非常容易移植到新版本。您必须更加小心,但是在较老的编译器中使用当前代码也非常简单。我在Delphi2005/2006/2007中维护了其他人仍然需要在Delphi6和7中使用的代码。
如果您从DFM中删除不兼容的属性,它们应该可以在旧版本中正常工作,而不会弄乱Delphi2009。最大的例子是Delphi2006中引入的显式*属性。我有一个自制的"DFM洗涤器“,可以把它们去掉。请记住,这些属性的存在是有原因的,因此您应该只清除您打算向后兼容的属性。
您还可以考虑投资静态代码分析工具,如CodeHealer或Pascal Analyzer。除了指出问题(尤其是CodeHealer)并帮助您清理代码之外,您还可以选择要分析的Delphi版本,这样除了DFM属性之外,还可以更容易地发现不兼容性。它们可以作为构建过程的一部分进行自动化。
只是一张纸条。共享源代码,但为每个版本保留单独的项目。在Delphi 2007和Delphi 2009之间,这一点尤其重要。较新的.dproj文件使用相同的扩展名,但与Delphi2007不兼容。你也可能会遇到一些资源不兼容的问题。
https://stackoverflow.com/questions/271843
复制相似问题