【问题标题】:How to solve DSServerModule1.ClientHeight: Property does not exist error如何解决 DSServerModule1.ClientHeight: Property does not exist 错误
【发布时间】:2015-02-02 12:41:37
【问题描述】:

我编写了一个使用 firebird 数据库、使用服务器和客户端的应用程序。我最初使用 Delphi XE2 对应用程序进行了编码,并且一切正常。我现在已经转移到 Delphi XE6。

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

ProjectPiping.exe 引发执行类 TDBXError 并显示消息“远程错误:读取 DSServerModule1.ClientHeight 时出错:Propery CliehtHeight 不存在。

我在网上看到您需要将顶部的 dfm 文件从 Object 更改为 Inherinted ,但这并没有什么区别。

有没有人可以帮助我,因为我看不到我可以解决这个问题,除非回到 Delphi XE2

【问题讨论】:

  • DSServerModule1 没有名为 ClientHeight 的属性。或者CliehtHeight。看起来你没有使用剪贴板,这总是有点担心。如果我们知道DSServerModule1 是什么,那将会有所帮助。与其尝试在不了解您在做什么的情况下随意更改 .dfm 文件,不如先诊断问题。我们看不到 .dfm 文件,我们不知道它包含什么或您的对象是什么类型。
  • @DavidHeffernan 我在使用 Firebird 时使用 DSServerModule 编写了一个服务器应用程序。因此,当我尝试编译必须访问服务器的客户端时,它会给我上述错误。就像我在编译并运行良好之前所说的那样,这个错误现在开始了,因为我已经转移到了 Delphi XE6
  • Google 告诉我们这是一个已知问题:qc.embarcadero.com/wc/qcmain.aspx?d=110536
  • @DavidHeffernan 由于此错误仅在我使用 Delphi XE6 时发生,我想我将不得不重新使用 Delphi XE2,或者在使用 firebird 时是否有任何其他的 datasnap 替代方法
  • 我不知道。我刚刚用谷歌搜索了你的错误信息。

标签: delphi client-server server


【解决方案1】:

对于不直接从基本 Delphi TFrameTDataModule 类继承的 FramesDataModules,缺少属性错误很常见。在某些情况下(随每个 Delphi 版本而变化)Delphi 将无法访问 FrameDataModule 祖先以确定它是否处理 TFrameTDataModule 后代。发生这种情况时,它会将Frame/DataModule 错误地解释为Form 并用Form 特定属性污染它们的.dfm

您不必回滚到 XE2,您可以通过使用 Notepad 或类似编辑器从 .dfm 文件中删除 bad 属性来解决此问题。由于这是一个操作,您在对此类Frame/DataModule 进行设计工作时必然会经常重复,版本控制可以提供很大帮助。只是不要提交不应该存在的更改。另一种对抗 .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

【讨论】:

    【解决方案2】:

    此解决方法将允许通过拦截和忽略有关 Delphi 在您的 dfm 中插入的不存在的 TForm 属性的错误来创建您的 DataModule (这只是一种解决方法,而不是解决您的 IDE 问题正在经历)

    1) 将这些声明添加到您的数据模块类中:

     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;
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 2022-11-17
        • 2019-06-12
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 2021-10-09
        • 2020-09-12
        相关资源
        最近更新 更多