2

「self」をパラメーターとして別のクラスのメソッド(別のユニット内)に渡したいと思います。ただし、最初のユニットを 2 番目のユニットの uses セクションに入れることができないため、最初のクラスのタイプは 2 番目のクラスでは不明です。そのため、パラメータの型をポインタとして定義しますが、最初のクラスからメソッドを呼び出そうとすると、Delphi 7 パーサーから classtyp が必要であると通知されます。

では、この問題をどのように解決すればよいでしょうか。

4

2 に答える 2

6

実装部分でクラスを認識させることで、指定された参照をキャストできます。

unit UnitY;

interface
uses Classes;
type
    TTest=Class
       Constructor Create(AUnKnowOne:TObject);
    End;



implementation
uses UnitX;
{ TTest }

constructor TTest.Create(AUnKnowOne: TObject);
begin
    if AUnKnowOne is TClassFromUnitX then
      begin
         TClassFromUnitX(AUnKnowOne).DoSomeThing;
      end
    else
      begin
         // .... 
      end;
end;

end.
于 2013-04-24T11:22:18.173 に答える
4

このタイプの問題に対するインターフェースアプローチが好きです。ユニットが非常に緊密に結合されていない限り (ユニットを共有する必要がある場合)、インターフェースは、各タイプの完全な知識がなくてもクラスの関連部分を交換するための整然とした方法です。

検討 :

unit UnitI;
interface
type
  IDoSomething = Interface(IInterface)
    function GetIsFoo : Boolean;
    property isFoo : Boolean read GetIsFoo;
  end;
implementation
end.

unit UnitA;
interface
uses UnitI;
type
  TClassA = class(TInterfacedObject, IDoSomething)
     private
       Ffoo : boolean;
       function GetIsFoo() : boolean;
     public
       property isFoo : boolean read GetIsFoo;
       procedure DoBar;
       constructor Create;
  end;
implementation
uses UnitB;

constructor TClassA.Create;
begin
  Ffoo := true;
end;

function TClassA.GetIsFoo() : boolean;
begin
  result := Ffoo;
end;

procedure TClassA.DoBar;
var SomeClassB : TClassB;
begin
  SomeClassB := TClassB.Create;
  SomeClassB.DoIfFoo(self);
end;

end.

TClassBは、それを含むユニットについて何も知る必要がないことに注意してください。インターフェイス コントラクトTClassAに従うすべてのオブジェクトを受け入れるだけです。IDoSomething

unit UnitB;
interface
uses UnitI;
type
  TClassB = class(TObject)
    private
      Ffoobar : integer;
    public
      procedure DoIfFoo(bar : IDoSomething);
      constructor Create;
  end;

implementation

constructor TClassB.Create;
begin
  Ffoobar := 3;
end;

procedure TClassB.DoIfFoo(bar : IDoSomething);
begin
  if bar.isFoo then Ffoobar := 777;
end;

end.
于 2013-04-24T12:45:08.557 に答える