各インスタンスを一意にするためにどのように - Delphiのユニットはローカル変数?

StackOverflow https://stackoverflow.com/questions/2822117

質問

I以下のユニットで

は変数は、実装部で宣言された - ユニットに対してローカル。私はまた、問題のローカル変数に引数という議論および譲受人を取る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;
それぞれがその中で一意であるなど、

は今どこか別のフォームIのきた内の1つのフォームでこれらのフレームの2時に、設計ペインにこのフレームを落とし、それが適切な場所で宣言されています:

ThisFlexibleUnit : TFlexibleUnit;
ThatFlexibleUnit : TFlexibleUnit;

と私が行うとき:

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

それが思われる彼らの両方を共有同じ変数「myLocalVar」ます。

アム私は原則的に、この間違っていますか?これが正しい方法であれば、それは私が(ポストにあまりにも巨大である)持っているもののデバッグの問題だが、これは原則的に正しくない場合、私は示唆しています何をする方法は何ですか?

EDITます:

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

役に立ちましたか?

解決

myLocalVarグローバル変数であるが、唯一のユニット内に見える。

は、ローカル変数は、プロシージャ/関数であろうような

procedure makeThisInstanceX(passMeTheVar: integer);
var
  myLocalVar: Integer;
begin
  myLocalVar := passMeTheVar;
end;
あなたは、各フレームでインスタンス変数を、したい場合は、

は、クラスに入れて、それ自身のコピーを持っています:

type
  TFlexibleUnit = class(TFrame)
     procedure makeThisInstanceX(passMeTheVar:integer);
  private
    myLocalVar: Integer;
  ...
  end;

他のヒント

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

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

フレーム/ユニット/クラス/制御

私はより良いコードにあなたの英雄的な試みを称賛します。しかし、私はあなたの理解が非常に限られていることを通知する後悔ご質問やコメントから判断します。

はフレームがクラスではない単位ではありません。フレームはクラスではなく、すべてのクラスは、フレームです。フレームはコントロールですが、必ずしもすべての制御は、フレームです。ユニットは、インタフェースと実装(と初期化とファイナライズ)のセクションを持っています。クラスは、プライベートとパブリック(および保護されたと公表)の部分を持っています。

私が教えることを試みることができますが、ご理解のレベルを測定することを可能にするには、最後の段落を入れていません。 Delphiの開発者は、段落と何の問題もないはずです。ちょうど支援しようと - 私はあなたが悪い気分にさせるか誇示しようとしていませんよ。おそらく、スタックオーバーフローが、この時点であなたのための適切なツールではありません。

誰かがちょうど初めてのDelphiを学ぶように、私は、一見冗長機能のいくつかによって混同される可能性があります。しかし、製品には長い歴史を持っており、それぞれの添加は、それが追加されたときに意味がありました。あなたがそれだけを一度に作品を学ばなければならなかったときに学ぶことも簡単だった。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top