1

以下のユニットでは、IMPLEMENTATION セクションで宣言された変数があります - ユニットに対してローカルです。また、引数を取り、その引数を問題のローカル変数に割り当てる TYPE セクションで宣言されたプロシージャもあります。この TFrame の各インスタンスには、 を介して一意の変数が渡されますpassMeTheVar

私がやりたいことは、フレームの各インスタンスがその変数の独自のバージョンを保持し、他のインスタンスとは異なり、それを使用してそれがどのように動作するかを定義することです。ただし、各インスタンスに異なる変数を明示的に渡したとしても、すべてのインスタンスが同じ値を使用しているように見えます。

すなわち:

Unit FlexibleUnit;
interface
uses
//the uses stuff
type
TFlexibleUnit=class(TFrame)
   //declarations including
   procedure makeThisInstanceX(passMeTheVar:integer);
private
//
public
//
end;

implementation
uses //the uses
var myLocalVar;

procedure makeThisInstanceX(passMeTheVar:integer);
begin
myLocalVar:=passMeTheVar;
end;

//other procedures using myLocalVar 
//etc to the 
end;

ここで、別のフォームのどこかに、このフレームをデザイン ペインにドロップしました。これらのフレームの 2 つを 1 つのフォームにドロップし、適切な場所で宣言することもあります。それぞれが次の点で一意です。

ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;

そして私がするとき:

ThisFlexibleUnit.makeThisInstanceX(var1); //want to behave in way "var1"
ThatFlexibleUnit.makeThisInstanceX(var2); //want to behave in way "var2"

どちらも同じ変数「myLocalVar」を共有しているようです。

原則として、私はこれを間違っていますか?これが正しい方法である場合、それは私が持っているものをデバッグすることの問題です(これは投稿するには大きすぎます)が、これが原則として正しくない場合、私が提案していることを行う方法はありますか?

編集:

さて、ここで学んだ教訓は、クラス定義はまさにそれだということです。多くのクラスを 1 つのユニットに入れることができ、セクション内のすべてのクラスのすべてのインスタンスがTypeユニットの実装セクションを共有します。

4

3 に答える 3

8

myLocalVar はグローバル変数ですが、ユニット内でのみ表示されます。

ローカル変数は、次のようにプロシージャ/関数内にあります

procedure makeThisInstanceX(passMeTheVar: integer);
var
  myLocalVar: Integer;
begin
  myLocalVar := passMeTheVar;
end;

インスタンス変数が必要な場合、つまり各フレームに独自のコピーがある場合は、それをクラスに入れます。

type
  TFlexibleUnit = class(TFrame)
     procedure makeThisInstanceX(passMeTheVar:integer);
  private
    myLocalVar: Integer;
  ...
  end;
于 2010-05-12T19:43:25.693 に答える
1

makeThisInstanceXクラスのインスタンスを作成してオブジェクト メソッドとして呼び出すのではなく、メソッドをクラス (静的) メソッドとして呼び出しています。このリファレンスを見てください:

http://oreilly.com/catalog/delphi/chapter/ch02.html

于 2010-05-12T19:34:27.417 に答える
-2

フレーム / ユニット / クラス / コントロール

コードを改善しようとするあなたの英雄的な試みに拍手を送ります。しかし、あなたの質問とコメントから判断すると、あなたの理解が非常に限られていることを残念に思います。

フレームは、クラスではない単位ではありません。フレームはクラスですが、すべてのクラスがフレームであるとは限りません。フレームはコントロールですが、すべてのコントロールがフレームであるとは限りません。ユニットには、インターフェイスと実装 (および初期化とファイナライズ) セクションがあります。クラスには、非公開部分と公開部分 (および保護部分と公開部分) があります。

教えようとして最後の段落を入れたのではなく、理解度を測れるようにしました。Delphi 開発者は、段落に問題がないはずです。気分を害したり自慢したりするつもりはありません。ただ助けたいだけです。現時点では、スタック オーバーフローは適切なツールではない可能性があります。

初めて Delphi を学習したばかりの私は、一見冗長な機能のいくつかに混乱するかもしれません。しかし、この製品には長い歴史があり、追加されるたびに意味がありました。また、一度に 1 つずつ学ぶだけでよかったので、習得も簡単でした。

于 2010-05-12T20:43:03.900 に答える