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

webghufk  于 2023-08-04  发布在  其他
关注(0)|答案(4)|浏览(125)

我写了一个应用程序,它使用一个firebird数据库,使用一个服务器和一个客户机。我最初使用 Delphi 编写应用程序,所有工作都很好。现在我已经转移到 Delphi XE6。
我重新编译了服务器,没有错误,但是现在我重新编译了客户端,它给了我以下错误:
ProjectPiping.exe引发执行类TDBXError,并显示消息“Remote error:阅读DSServerModule1.ClientHeight时出错:您访问的页面不存在。
我在网上读到过,你需要将顶部的dfm文件从Object更改为Inherined,但这并没有什么区别。
有没有人可以帮助我,因为我没有看到无论如何,我可以解决这个问题,除了回到 Delphi XE2

zvokhttg

zvokhttg1#

缺少属性的错误对于FramesDataModules来说是很常见的,它们不是直接从Delphi的 Delphi TFrameTDataModule继承而来的。在某些情况下(随每个 Delphi 版本而变化),Delphi将无法访问FrameDataModule祖先,以确定它是否处理TFrameTDataModule后代。当这种情况发生时,它将错误地将Frame/DataModule解释为Form,并使用Form特定的属性污染它们的.dfm
你不必回滚到XE2,你可以通过使用Notepad或类似的编辑器从.dfm文件中删除 * 坏 * 属性来解决这个问题。由于这是您在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

yptwkmov

yptwkmov2#

这个解决方法将允许你的DataModule被创建,通过拦截和忽略不存在的TForm属性的错误, Delphi 正在插入你的dfm (这只是一个解决方法,不是你遇到的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对象来加载DFM。
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;

qyyhg6bp

qyyhg6bp3#

此问题是由未安装、禁用或无法访问的设计(组件)包引起的。如果 Delphi 无法找到数据模块继承的组件,它将/可能更改dfm文件,并将其属性替换为它所知道的最可能的候选项。由于dfm与UI相关, Delphi 默认情况下将对象视为TForm,并相应地更改dfm中的属性和事件。然而,源代码(谢天谢地)没有与这些更改同步,因此在尝试使用数据模块时Property不存在错误消息。代码和dfm不同步。
将对象更改为继承并不是解决方案。您必须重新安装或启用丢失的组件包,关闭 Delphi ,然后用记事本编辑并保存dfm。或者更好的方法是,在版本控制系统中恢复到以前的声音版本。如果没有选择(什么?)!),那么您可以通过从dfm中删除坏的属性和事件(或全部)来恢复所有的默认属性和事件。下次在 Delphi 中打开dfm时,它将恢复为有效的默认值。
您可以通过不忽略 Delphi IDE中的“属性不存在”错误,而是使用取消选项来防止将来出现此问题。这将防止更改/保存dfm,并且项目将在运行时正常运行。

bnl4lu3b

bnl4lu3b4#

在 Delphi 中转到菜单组件,然后安装Packeges...查找以Embarcadeiro开头且未选中的组件。在我的案例中,“Embarcadero DBExpress DataSnap Native Server Components”未选中。我把它收藏起来,保存下来,然后重新启动 Delphi 。一旦这样做了, Delphi 就停止向源代码添加不存在的属性,但是那些已经用错误的属性保存的属性必须手动更改。
由@DanielZanutto更正。

相关问题