【问题标题】:How to override loading a TImage from the object inspector (at run-time)?如何覆盖从对象检查器加载 TImage(在运行时)?
【发布时间】:2010-10-08 01:09:13
【问题描述】:

为顶帖致歉。这困扰了我多年,现在我真的需要知道答案。我放了 150 点赏金以吸引兴趣,但可能会增加正确答案。

这是我需要的:

我使用来自TMS Scripter Pro 的TMS obejct inpsctor 允许用户在运行时设计表单。您可以假设它源自标准的 Delphi Object Inspector,并添加了一些功能,但其中 90% 只是调用继承的方法。

当我单击 TImage 的 Picture 属性旁边的省略号时,它会调用一个继承的方法 - 我不知道是哪个 - 允许我加载图片。完成后,我不知道图像是从哪个文件加载的,我想将其以相同的名称保存在不同的目录中。

  • 我可以提示用户输入文件名,但这让他看起来很困惑,而且很草率。
  • 我可以找到一个 TImage / TPicture 后代,它存储文件名并允许我查询它。任何能指出此类 FOSS 组件的人都会获得奖励。
  • 我可以从 TPicture 和/或 TImage 派生并自己编写代码,但不确定要更改什么。任何能准确告诉我如何编码的人都会得到赏金。确切地说,我的意思是命名类和方法。

提前感谢您的帮助。这个真的让我很烦。


对于my previous question,尽管获得了赏金,但没有得到有用的答案,我将尝试重新表述这个问题。

基本上,当用户在对象检查器中单击省略号时,Delphi 会打开一个文件/打开对话框。我想用我自己的替换这个处理,这样我就可以保存图像的路径。

我原以为我需要做的就是从 TImage 派生一个类并覆盖 Assign() 函数,如下面的代码所示。但是,当我这样做时,永远不会调用分配函数。所以,看起来我需要覆盖其他东西,但是什么?

unit my_Image;


interface

uses
  Classes, ExtCtrls, Jpeg, Graphics;

type
  Tmy_Image = class(Timage)
    private
      FPicture : TPicture;

    protected
      procedure OnChange(Sender: TObject);

    public { Public declarations }
      Constructor Create(AOwner: TComponent); override;  
      procedure   SetPicture(picture : TPicture); 
      procedure   Assign(Source: TPersistent); override;

    published  { Published declarations - available in the Object Inspector at design-time }
      property Picture : TPicture read FPicture write SetPicture;
  end;  // of class Tmy_Image()

  procedure Register;

implementation

uses Controls, Dialogs;

  procedure Register;
  begin
    RegisterComponents('Standard', [Tmy_Image]);
  end;

  Constructor Tmy_Image.Create(AOwner: TComponent);
  begin
    inherited;  // Call the parent Create method
    Hint := 'Add an image from a file|Add an image from a file'; // Tooltip | status bar text
    AutoSize := True;  // Control resizes when contents change (new image is loaded)
    Height := 104;
    Width  := 104;
    FPicture := TPicture.Create();
    self.Picture.Bitmap.LoadFromResourceName(hInstance, 'picture_poperty_bmp');
  end;

  procedure Tmy_Image.OnChange(Sender: TObject);
  begin
    Constraints.MaxHeight := Picture.Height;
    Constraints.MaxWidth  := Picture.Width;
    Self.Height := Picture.Height;
    Self.Width  := Picture.Width;
  end;

  procedure   Tmy_Image.SetPicture(picture : TPicture);
  begin
    MessageDlg('Tmy_Image.SetPicture', mtWarning, [mbOK], 0);   // never called
  end;


  procedure Tmy_Image.Assign(Source: TPersistent);
  begin
    MessageDlg('Tmy_Image.Assign', mtWarning, [mbOK], 0);   // never called
  end;

end.

【问题讨论】:

  • 您想要改变对象检查器,还是想要在运行时工作?您是真的在谈论 Object Inspector,还是在谈论您忘记提及的第三方供应商提供的其他一些外观相似的组件?
  • TMS 对象检查器不能是“Delphi 标准”。 Delphi Object Inspector 使用 Delphi 包中的设计时代码,这些代码无法重新分发给客户。
  • 这里的“Delphi Standard”是指装在盒子里,而不是“un-Delphi”。您似乎想要的是一种改变此第三方软件行为 (TMS) 的方法。因此,“对象检查器”对于这个问题来说是一个非常糟糕的标题:它应该特定于第三方软件,并包含在标签等中。它可能非常具体,以至于你不会在这里得到问题,并且可能必须询问 TMS 的支持热线。 Delphi 不包含对象检查器,并且设计时支持不是用户可分发的,因此 TMS 必须手动重新实现几乎所有内容。你可能需要问他们。
  • 快速搜索tmssoftware.com/site/products.asp?t=vcl 显示没有称为“对象检查器”的组件。如果您需要有关特定组件的帮助,请提供该组件的名称。否则,当我们试图猜测你在说什么时,你就是在浪费你和我们的时间;你最好只是在键盘上疯狂地挥舞着,希望你能按到正确的键。
  • 您应该尝试将所有信息放在您的帖子中以获得帮助。但是,在写一个问题之前,我认为您应该阅读有关您正在使用的产品的文档:应该在某处说明您想要什么(如果可能)或者是否有可用于 TMS 产品的支持?只要问他们你想要的是否可能。也许在 TMS Software 上的用户论坛之类的东西上,您会发现在这组控件/组件方面有经验的人愿意为您提供帮助。

标签: delphi


【解决方案1】:

看看这是否有效:

  [...]

  procedure Tmy_Image.PictureChange(Sender: TObject);
  begin
    ShowMessage('Should work');
  end;

  [...]

  constructor Tmy_Image.Create(AOwner: TComponent);
  begin
    inherited;  // Call the parent Create method
    Hint := 'Add an image from a file|Add an image from a file'; // Tooltip | status bar text
    AutoSize := True;  // Control resizes when contents change (new image is loaded)
    Height := 104;
    Width  := 104;
    FPicture := TPicture.Create();
    FPicture.OnChange := PictureChange; /// <<<<
    self.Picture.Bitmap.LoadFromResourceName(hInstance, 'picture_poperty_bmp');
  end;

  [...]

上帝保佑你!

【讨论】:

  • 请描述您认为在使用此代码时会“起作用”的内容。这段代码将如何改变 Object Inspector 的省略号按钮的默认行为?
  • +1 你是对的,罗伯。当然,这行得通,但它只告诉我图片已更改。我需要做的是获取加载图片的文件的名称。为了做到这一点,我认为我需要重写省略号单击的处理,以提供我自己的 TSavePictureDialog。我对如何做到这一点感到困惑。
  • Rob,他并没有试图覆盖 Delphi 的属性编辑器(在设计时工作)。他试图覆盖 TMS 的组件运行时行为。
【解决方案2】:

好的,我破解了 TMS 代码。这似乎是唯一的方法。

【讨论】:

  • 我会使用 JVCL TJvInspector。它可以在省略号按钮上包含您喜欢的任何内容,而无需破解源代码。它可以检查 RTTI 发布的属性,就像 TMS 一样。
  • +1 谢谢,Warren,也许是为了未来的项目,但出于其他原因,我致力于 TMS。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2020-10-11
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多