gpt4 book ai didi

delphi - 创建表单时不调用 TPicture 属性的 Set 方法

转载 作者:行者123 更新时间:2023-12-03 18:40:44 25 4
gpt4 key购买 nike

这是我的组件整体结构:

  • 我的组件
  • 属性类别:TCollection(TCategory 的)
  • T类别
  • 属性Icon: TPicture 读FIcon 写SetIcon;
  • 属性示例:整数读取 FExample 写入 SetExample;
  • (其他类别属性...)
  • (其他属性...)

  • 在 IDE 的 Object Inspector 中,我选择了一张图片并成功序列化(我在表单 View 中将其作为文本进行了检查)。我在 SetIcon 上设置了一个断点方法,当我编译和运行应用程序时,它根本不会被调用。同时, SetExample被正确调用。
    TPicture 有什么问题?属性(property)?

    P.S: Set 方法在 IDE 中被调用,而不是在运行时。

    这是代码的 MCVE:
    unit MCVE;

    interface

    uses
    System.SysUtils, System.Classes, Vcl.Controls, Graphics, Dialogs;

    type
    TMyCollectionItem = class(TCollectionItem)
    private
    FIcon: TPicture;
    procedure SetIcon(const Value: TPicture);
    public
    constructor Create(Collection: TCollection); override;
    published
    property Icon: TPicture read FIcon write SetIcon;
    end;

    TMyCollection = class(TCollection)
    end;

    TMCVE = class(TCustomControl)
    private
    FCollection: TMyCollection;
    procedure SetCollection(const Value: TMyCollection);
    public
    constructor Create(AOwner: TComponent); override;
    published
    property MyCollection: TMyCollection read FCollection write SetCollection;
    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Samples', [TMCVE]);
    end;

    { TMyCollectionItem }

    constructor TMyCollectionItem.Create(Collection: TCollection);
    begin
    inherited;
    FIcon := TPicture.Create;
    end;

    procedure TMyCollectionItem.SetIcon(const Value: TPicture);
    begin
    ShowMessage('SetIcon is called!');
    FIcon.Assign(Value);
    end;

    { TMCVE }

    constructor TMCVE.Create(AOwner: TComponent);
    begin
    inherited;
    FCollection := TMyCollection.Create(TMyCollectionItem);
    end;

    procedure TMCVE.SetCollection(const Value: TMyCollection);
    begin
    FCollection := Value;
    end;

    end.

    最佳答案

    对于像 Integer 这样的简单类型, Boolean , Double等等,流媒体按照您描述的方式运行。流框架读取该值,并调用属性 setter 。

    对于更复杂的类型,如 TPicture ,它不会那样发生。流框架不能调用属性 setter 。为了做到这一点,它需要掌握一个完全形成的TPicture。 .它不知道如何做到这一点,先验。

    那么反而会发生,流框架调用属性的 getter 来获取 TPicture组件的构造函数创建的实例。然后以 TPicture 的状态流式传输存储在 .dfm 文件中。

    碰巧,TPicture没有已发布的属性。图片数据保存在名为 Data 的属性下的 .dfm 文件中。 .那么,这从何而来。答案在被覆盖的 DefineProperties 中。方法。代码如下所示:

    procedure TPicture.DefineProperties(Filer: TFiler);

    function DoWrite: Boolean;
    begin
    // .... code removed for brevity
    end;

    begin
    Filer.DefineBinaryProperty('Data', ReadData, WriteData, DoWrite);
    end;
    WriteDataReadData方法进行流式传输。

    所以,回顾一下。你问为什么 TPicture 的二传手在图片的属性中流式传输时未调用属性。它没有被调用,因为您在构造函数中创建的图片对象在其属性中流动。

    关于delphi - 创建表单时不调用 TPicture 属性的 Set 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858026/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com