3

Delphi 7 のフレームと継承に問題があります。

visible=false(設計時に) Frame を定義するとします。ここで、このフレームを何らかのフォームに埋め込み、フォームvisible=true内のフレームの埋め込みインスタンスに設定します (設計時も)。

ここで、設計時に設定された可視プロパティに従って、埋め込みフレームを初期化するとします。問題は、コンストラクター内で常に取得するため、フレームのコンストラクターを単純にオーバーライドしても機能しないvisible=falseことです (DFM プロパティがまだ読み取られていないためだと思います)。また、フォーム ユニット内に初期化コードを配置したくありません。このロジックはフレームにのみ属しているためです。

そのような場合に対処するための最善の経験則は何ですか?

説明 Frame.Visibleはほんの一例です。この質問は、設計時に設定されるフレームまたはその内部コンポーネントの他のすべてのプロパティに関連しています。たとえば、Frame 内の TEdit の色について話しているとします。

4

2 に答える 2

5

コンストラクターでプロパティに依存するコードを記述することはできません。これは、コンストラクターの実行時に DFM プロパティがまだ読み取られていない場合があるためです。Loaded代わりに、フレーム クラスのメソッドをオーバーライドして、そこにコードを配置します。プロパティが DFM からロードされた後に呼び出されます。

注意を追加Visibleすると、その手法では機能しませんが、他のプロパティは機能します。

于 2012-12-10T04:26:31.513 に答える
4

Visibleプロパティは、設計時に無視されます。表示に関するすべての情報は、フレームのdfmにのみ保存されます。フレームを使用するフォームでインスタンスの可視性をtrueに設定しても、フォームのdfmには保存されません。手動で追加しても効果はありません。無視され、次回の保存時に削除されます。

明確化した後、たとえばプロパティカラーで表示できます。デザイン時にclBlackでフレームの色を作成し、2つのフレームを使用したフォームで、色をclRedとclBlueに設定しました。

unit Unit7;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TCallOnCreate=Procedure(Sender:TObject) of object;

  TFrame7 = class(TFrame)
    Button1: TButton;
    Procedure Loaded;override;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Public Constructor Create(AOwner:TComponent);Override;
  end;

implementation
uses RTTI;
{$R *.dfm}

{ TFrame7 }

constructor TFrame7.Create(AOwner: TComponent);
var
   ToCall    : TCallOnCreate;
   Routine : TMethod;
begin

  inherited;
     Showmessage('Created ' + IntToStr(Color));


   Routine.Data := Pointer(AOwner);
   Routine.Code := AOwner.MethodAddress('InfoOnFrameCreate');
   if Assigned(Routine.Code) then
      begin
        ToCall:= TCallOnCreate(Routine);
        ToCall(Self);
      end;

end;

procedure TFrame7.Loaded;
begin
  inherited;
    Showmessage('Loaded ' + IntToStr(Color));
end;

end.

次の例では、次にフレームが使用されるフォームにコードを実装する方法を示します。

unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit7;

type
  TForm6 = class(TForm)
    Frame71: TFrame7;
    Procedure InfoOnFrameCreate(Sender:TObject);
  private

    { Private-Deklarationen }
  public

    { Public-Deklarationen }
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

{ TForm6 }

procedure TForm6.InfoOnFrameCreate(Sender: TObject);
begin
  Showmessage('Frame Created');
end;

end.
于 2012-12-09T15:01:20.660 に答える