質問
コピーして一部のデコードからプロジェクトも、こんでコンパイルに新しいプロジェクトもいました。をコードするとどうなるのかわかりません
procedure TForm1.CalculateGP(..)
const
Price : money = 0;
begin
...
Price := 1.0;
...
end;
このように新しいプロジェクトは、Delphiと文句を"左側に譲渡できない"-わかりやすい!このコード統のプロジェクト.その後、私の質問は、 なぜ?がコンパイラのスイッチをconstsする再割り当て?どのようなものか。と思ったconstsに置き換えにその値はコンパイル時間がかかる?
解決
必要なものを割り当型の定数です。プロジェクト->オプション>コンパイラ>切な型の定数
も追加できます {$J+}
または {$WRITEABLECONST ON}
のpasファイルすることで、よりよいかんに動いてもファイルを別のプロジェクト.
他のヒント
種類-推定される定数でスカラー値(のような整数を表すdouble値。これらの種類の定数は、コンパイラは実際に一定のシンボルの定数の値までに表現です。
型定数の一方で、できる構造の価値アレイ記録です。これらのう必要が実際のストレージに実行するとといて保管して割り当てられるところにより、その場合、OSの荷重実行の値の型定数を物理的に含まれる一部の箇所に。
明らかにしていくもの、歴史的に入力定数の初期デルフィとその前身であるターボパスカルは、書き込み可能な(つまり、基本的に初期化されたグローバル変数)まに戻らなければならないときには可能です。
DOSにリアルモードでは、x86ます。このプログラムに直接アクセスの物理メモリなし MMU この仮想物理的マッピング.時プログラムに直接アクセスメモリ、メモリに保護しています。※その他の言葉があった場合、メモリを指定アドレスでも読み書き可能な実質モードに切り替わります。
なので、Turbo PascalプログラムのためのDOSを入力一定なのに対し、その値が割り当てられるアドレスにメモリのランタイム時において、その型定する書き込み可能.ありませんハードウェアMMUが邪魔になって防止のプログラムを書いています。同様に、パスカルがないという概念'const'ness C++ているものはありません、タイプシステムに入力して検索することができます多くの人の本来Turbo Pascalとするmicrosoft社の最新製品もサポートしなかった当時の初期化がグローバル変数として特徴です。
移動インタラクティブなプロトタイ、層間のメモリのアドレス、物理アドレス:のメモリ管理ユニットです。このチップのページ指数(シフトしたマスク、メモリアドレスまアクセスしようとしている、そのような属性をこのページ ページテーブル.これらの属性を含む読み、書き込み可能な、現代のx86チップ、実行可能フラグがあります。この支援は、このマーク部分。エグゼいます。DLLとの属性をみると、Windowsのローダの荷重の実行可能な画像メモリにロードで付けを適切なページ属性のためのメモリページの地図ディスクのページをご用されます。
時には32-bit Windows版は、Delphiコンパイラの頃は、このように感をconstようなもの 本当に constのOSにもおすすめします。
なぜ:なので以前のバージョンとインターネットで提供の型定数が割り当によるデフォルトの保存性により以前のバージョンが常に書き込み可能(Delphi1初期パスカル).
デフォルトが変更されている定数も定---コンパイラのスイッチ:{$J+}または{$J}{$WRITEABLECONST ON}または{$WRITEABLECONST OFF}
のプロジェクトオプションのためのコンパイラ:チェック割当可能型定数- どのような著作物:の場合はコンパイラで計算する値をコンパイルで置き換えのconstによる価値のありとあらゆるところで活躍コード、それ以外でのポインタをメモリ領域値を保持できる書き込み可能です。
- 参照3.
のようにハーモニーランドのパスポートと人のconsts;一つの方法で使用されていたものためのテストシングルトンう場合がございます。見ているとクラシックシングルトンの実装では、ます:
// Example implementation of the Singleton pattern.
TSingleton = class(TObject)
protected
constructor CreateInstance; virtual;
class function AccessInstance(Request: Integer): TSingleton;
public
constructor Create; virtual;
destructor Destroy; override;
class function Instance: TSingleton;
class procedure ReleaseInstance;
end;
constructor TSingleton.Create;
begin
inherited Create;
raise Exception.CreateFmt('Access class %s through Instance only', [ClassName]);
end;
constructor TSingleton.CreateInstance;
begin
inherited Create;
// Do whatever you would normally place in Create, here.
end;
destructor TSingleton.Destroy;
begin
// Do normal destruction here
if AccessInstance(0) = Self then
AccessInstance(2);
inherited Destroy;
end;
{$WRITEABLECONST ON}
class function TSingleton.AccessInstance(Request: Integer): TSingleton;
const
FInstance: TSingleton = nil;
begin
case Request of
0 : ;
1 : if not Assigned(FInstance) then
FInstance := CreateInstance;
2 : FInstance := nil;
else
raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
end;
Result := FInstance;
end;
{$IFNDEF WRITEABLECONST_ON}
{$WRITEABLECONST OFF}
{$ENDIF}
class function TSingleton.Instance: TSingleton;
begin
Result := AccessInstance(1);
end;
class procedure TSingleton.ReleaseInstance;
begin
AccessInstance(0).Free;
end;