掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
StringListがCreateされているかどうかの判定 (ID:44774)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
たぶん分かってないと思いますので…monaさんの言葉をよく読んでください。 >Assigned()だけでは判定できない場合がありますので > 解放後のnilの代入、FreeAndNil()もお忘れなく。 つまり変数を使い回す際は、あ さんの例のように、 aSL.Free; aSL := nil; // 追加。 とするか、 FreeAndNil(aSL); としてnilを代入しないと、後のAssigned()で判定できません。FreeだけではaSLにnilは代入されませんので。 初心者の方はこの辺りで悩むと思いますので、ぶっちゃけていくつかタネ明かしをしますと、 ・ TStringList型の変数 aSL とは、用途がTStringList型に限定されているポインタ型の変数です。 ・ ポインタ型変数の正体はInteger型です。が、コンパイラはこれに特別な意味を与え、特有の働きをさせます。 ・ nilの正体は、単なる 0(ゼロ)です。 ・ 「この場合の」Assigned()は、 aSLの値がnil(つまり 0)でなければTrueを返すという関数です。 「この場合の」と但し書きを付けたのは、手続き型変数(例えばOnなんとかというイベントのプロパティ) では違うからです。詳しくはヘルプでAssignedと手続き型を調べてください。 もう一つ、Jun2013さんが誤解している点があります。 var aSL: TStringList; このようにローカル変数を宣言しただけでは、aSLは(nilに)初期化されません。 というかローカル変数は基本的に初期化されないのが原則で、最初に入っている値は不定だと思ってください。 これはDelphiがネイティブコンパイラであるゆえに、無駄な処理を省き、ユーザーのコードですべてを まかなってもらおうという姿勢だと思います。 ※ただしString型や、クラス型・レコード型のインスタンス内の変数、グローバル変数などは初期化されます。 Delphi言語ガイド - データ型、変数、定数 - 変数 - Delphi リファレンス http://docwiki.embarcadero.com/RADStudio/XE4/ja/%E5%A4%89%E6%95%B0 >明示的に初期化されていないグローバル変数はコンパイラによって 0 に初期化されます。 >オブジェクトインスタンスデータ(フィールド)も 0 に初期化されます。 >Win32 プラットフォームでは、ローカル変数の内容は、値が代入されるまで定義されません。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.