Delphi 如何解决DSServerModule1.ClientHight:属性不存在错误

Delphi 如何解决DSServerModule1.ClientHight:属性不存在错误,delphi,client-server,server,Delphi,Client Server,Server,我编写了一个应用程序,使用firebird数据库,使用服务器和客户端。我最初使用Delphi XE2编写应用程序,一切都很好。我现在已经转到Delphi XE6 我重新编译了服务器,没有出现任何错误,但现在我重新编译了客户端,它给了我以下错误: ProjectPiping.exe引发了执行选项类TDBXError,并显示消息“远程错误:读取DSServerModule1.ClientHeight:Property Cliehight不存在” 我在网上读到,您需要将dfm文件从Object更改为I

我编写了一个应用程序,使用firebird数据库,使用服务器和客户端。我最初使用Delphi XE2编写应用程序,一切都很好。我现在已经转到Delphi XE6

我重新编译了服务器,没有出现任何错误,但现在我重新编译了客户端,它给了我以下错误:

ProjectPiping.exe引发了执行选项类TDBXError,并显示消息“远程错误:读取DSServerModule1.ClientHeight:Property Cliehight不存在”

我在网上读到,您需要将dfm文件从Object更改为Inherined,但这没有什么区别


除了返回Delphi XE2

之外,是否有任何人可以帮助我解决这个问题,因为在某些情况下,
数据模块
通常会出现缺少属性的错误,这些帧和
数据模块
不是直接从基本Delphi
TFrame
TDataModule
类继承的(随着每个Delphi版本的变化)Delphi将无法访问
Frame
DataModule
祖先,以确定它是处理
TFrame
还是
TDataModule
后代。如果发生这种情况,它将错误地将
Frame/DataModule
解释为
表单
,并污染它们的
。dfm
表单
特定属性

您不必回滚到XE2,您可以通过使用
Notepad
或类似的编辑器从
.dfm
文件中删除不好的属性来解决这个问题。由于这是一个操作,因此在对此类
帧/数据模块
进行设计工作时,您肯定会经常重复该操作,因此版本控制会有很大帮助。只是不要提交更改防止
.dfm
文件中零星更改的另一种方法是,在完成设计时使用文件后,将其设置为只读

更正空的
DataModule.dfm
文件:

inherited DataModule1: TDataModule1
  OldCreateOrder = False
  Height = 150
  Width = 215
end
断开的空
DataModule.dfm
文件

object DataModule1: TDataModule1
  Left = 0
  Top = 0
  ClientHeight = 188
  ClientWidth = 303
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
end

此问题是由已卸载、已禁用或无法访问的设计(组件)引起的包。如果Delphi无法找到数据模块继承自的组件,它将/可能会更改dfm文件,并用它知道的最可能的候选者替换其属性。因为dfm与UI相关,Delphi将在默认情况下将对象视为TForm,并相应地更改dfm中的属性和事件。但是源代码(谢天谢地)未与这些更改同步,因此在尝试使用数据模块时,属性不存在错误消息。代码和dfm不同步

将对象更改为“继承”不是解决方案。您必须先重新安装或启用缺少的组件包,关闭Delphi,然后用记事本编辑并保存dfm。或者更好,在版本控制系统中恢复到以前的声音版本。如果没有选择(什么?!)然后,只需从dfm中删除不正确的属性(或全部),即可恢复所有默认属性和事件。下次在Delphi中打开dfm时,它将使用有效的默认值进行恢复


您可以通过不忽略“属性不存在”来防止将来出现此问题“Delphi IDE中出现错误,但改用“取消”选项。这将阻止更改/保存dfm,并且项目将在运行时正常运行。

此解决方法将允许通过截取和忽略Delphi在dfm中插入的不存在的TForm属性的错误来创建DataModule。”(这只是一个解决方法,而不是您遇到的IDE问题的解决方案)

1) 将以下声明添加到datamodule类:

 private
    FSaveReaderOnError:TReaderError;
    procedure OnReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
 protected
    procedure ReadState(Reader: TReader); override;
我们覆盖的ReadState方法负责加载DFM,它使用Reader:TReader对象来完成

TReader公开了一个事件处理程序,我们可以拦截它来忽略错误:

procedure TMyDataModule.ReadState(Reader: TReader);
begin
   FSaveReaderOnError := Reader.OnError;
   try
      // install our error handler 
      reader.OnError := self.OnReaderError;
      // let the dfm loading continue
      inherited;
   finally
      // restore previous error handler
      Reader.OnError := FSaveReaderOnError;
      FSaveReaderOnError := nil;
   end;
end;
这是错误处理程序的一个示例:

procedure TMyDataModule.OnReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
var Ignora:boolean;
    tmp:string;
begin
   if Assigned(FSaveReaderOnError) then begin
      // in case there already was an error handler, we call if first
      FSaveReaderOnError(Reader,Message,Handled);
      if handled = true then
          exit;     
   end;

   // ignore errors about missing form properties  
   if not message.StartsWith('Error reading '+self.name) then exit;
   if not message.EndsWith(' does not exist') then exit;
   if not message.Contains(' Property ') then exit;

   Handled := true;
   if message.Contains('Font')  then exit;
   if message.Contains('ClientHeight')  then exit;
   if message.Contains('ClientWidth')  then exit;
   if message.Contains('Color')  then exit;
   if message.Contains('PixelsPerInch')  then exit;
   if message.Contains('TextHeight')  then exit;
   Handled := false;
end;

DSServerModule1
没有名为
ClientHeight
的属性。或者可能是
clietheight
。看起来您没有使用剪贴板,这一直是一个小问题。如果我们知道
DSServerModule1
是什么,这会有所帮助。而不是在不了解您要做什么的情况下尝试随机更改.dfm文件ing,首先诊断问题是明智的。我们看不到.dfm文件,也不知道它包含什么或对象是什么类型。@DavidHeffernan我在使用Firebird时使用DSServerModule编写了一个服务器应用程序。因此,当我试图编译一个必须访问服务器的客户端时,它会给我上述错误。就像我说的那样在它编译并运行良好之前,这个错误是从我转到Delphi XE6开始的。Google告诉我们这是一个已知的问题:@DavidHeffernan因为这个错误只发生在我使用Delphi XE6时,我想我必须回到使用Delphi XE2,或者在使用firebirdI时是否有其他替代datasnap的方法我不知道st谷歌搜索了你的错误消息。