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

时间:2015-02-02 12:41:38

标签: delphi client-server server

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

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

  

ProjectPiping.exe引发了execption类TDBXError,消息为"远程错误:读取DSServerModule1.ClientHeight时出错:Propery CliehtHeight不存在。

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

有没有人可以帮助我,因为我不知道除了回到Delphi XE2之外我无法解决这个问题

3 个答案:

答案 0 :(得分:4)

FramesDataModules缺少属性错误,这些错误不会直接从基础Delphi TFrameTDataModule类继承。在某些情况下(随每个Delphi版本而改变),Delphi将无法访问FrameDataModule祖先,以确定它是否与TFrameTDataModule后代有关。如果发生这种情况,它会错误地将Frame/DataModule解释为Form并使用.dfm特定属性污染其Form

您不必回滚到XE2,您可以使用.dfm或类似的编辑器从Notepad文件中删除错误的属性来解决问题。由于这是操作,因此在对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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

这种解决方法无论如何都可以通过拦截和忽略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;