從前筆者曾經對以下的程式產生過疑惑:
{$J+}
procedure TForm1.Button1Click(Sender: TObject);
const
  VarConst: integer = 4;
begin
  VarConst := 5;
  ShowMessage(IntToStr(VarConst));
end;
const不是常數嗎? 為什麼可以改呢? 在先前的Pascal版本中, 以
const VarName: DataType = const value;
定義的具型態常數的確是可以改的, 假如您希望常數就是常數, 它不應該允許修改, 
請將這個Compiler directive設為{$J-}
不論是{$J+}或{$J-}, 以const VarName = const value; 定義的常數(
沒有加上型別宣告), 是一個真正的常數, 其他的程式不可以改變其內容。
其實{$J+}時還有一個妙用, 那就是宣告出類似C語言static的變數, 換句話說, 
產生了一個與Application相同生命週期的變數。在這種情形下, 變數只在第一
次使用時才會建立, 函數或程序結束時, 該變數也不會消滅, 下一次再呼叫到這個函數
或程序時, 我們仍然可以參考到上次執行結束時的值。讓我們試一下這個例子:
{$J+}
procedure TForm1.Button1Click(Sender: TObject);
const
  i: integer = 0;
begin
  ShowMessage(IntToStr(i));
  Inc(i);
  ShowMessage(IntToStr(i));
end;
第一次執行時, 我們分別會看到「0」「1」, 再點一次這個按鈕時, 看到的將是「1」「2」。

在工程文件的最前面添加上
{$APPTYPE CONSOLE}

在代码中加上如下调试代码:
{$IFDEF CONSOLE}
  Writeln('=====');
{$ENDIF}
将会在控制台中输出信息。

-------------------------------------------------------

其实应该这样写(一旦完成定义,可立即关闭开关,不影响后面使用):

{$J+}
procedure TForm1.Button1Click(Sender: TObject);
const
i: integer = 0;
{$J-}
begin
ShowMessage(IntToStr(i));
Inc(i);
ShowMessage(IntToStr(i));
end;

摘自:

http://blog.csdn.net/henreash/article/details/3962975

-------------------------------------------------------

心得:编程的时候,这种用法对自动记住变量的上一次值十分有用,而不用程序员自己去另外定义一套变量并加以复制和管理了。真是不实际使不知道它的精妙。

Delphi里J+开关作用类似C语言的static变量的更多相关文章

  1. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  2. 在delphi中, reintroduce作用

    在delphi中, reintroduce作用 当在子类中重载或者重新声明父类的虚方法时,使用     reintroduce   关键字告知编译器,可以消除警告信息.如:          TPar ...

  3. SNF快速开发平台3.0之--系统里广播的作用--迅速及时、简明扼要的把信息发送给接收者

    广播信息,即速度快捷.迅速及时.简明扼要的把信息发送给接收者. 当然在SNF快速开发平台上你也可以作为公告使用.不管当做什么使用要满足以下需求: 简单操作:页面操作简单 只需要输入内容就可以发送. 灵 ...

  4. DELPHI NEXTGEN编译开关

    DELPHI NEXTGEN编译开关 {$IFDEF NEXTGEN} UTF8String = type _AnsiString(65001); RawByteString = type _Ansi ...

  5. Delphi里的Windows消息(可查MSDN指定位置)

    各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->C ...

  6. DELPHI跨平台编译开关

    DELPHI跨平台编译开关 DELPHI 现在是跨平台的开发工具,已经不仅仅针对WINDOWS OS. 跨平台的时候,一些WINDOWS特有的API或语法是不能用的,必须使用跨平台的新语法,要用编译开 ...

  7. [汇编与C语言关系]3. 变量的存储布局

    以下面C程序为例: #include <stdio.h> ; ; ; int c; int main(void) { ; char b[] = "Hello World" ...

  8. Go语言中的变量

    1 概述 变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念.变量,是通过变量的标识符定位值的过程.变量的内 ...

  9. C语言基础 (10) 变量作用域,生命周期 内存结构

    01 课程回顾 1.指针数组 注意: 对于数组来说,在使用sizeof的时候a和&a[0]是不一样的, 虽然以%x打印出来他们都是地址 2.值传递 int a; fun(a); int *** ...

随机推荐

  1. 字符编码笔记:ASCII、Unicode、UTF-8 和 Base64

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态(-128~127),这被称为一 ...

  2. Java微信公众平台开发_01_本地服务器映射外网

    做微信开发之前,我们需要先做一个内网穿透,让我们的工程可以在公网上被访问. 一.工具列表 内网穿透的相关工具有: (1)natapp 官网 :https://natapp.cn/ (2)花生壳 官网: ...

  3. maven 在 mac中的配置

    思前想后,还是在mac中把maven配置一下吧. 1.下载安装包,由于公司用的版本比较低,考虑到兼容性,建议用低版本的.我用3.0.5 下载地址:http://archive.apache.org/d ...

  4. 浅谈正则表达式-PHP为例

    第一次比较系统的学习正则表达式,本篇文章以PHP语言为例来学习. 基本概念 正则表达式=普通字符(如a-z)+分隔符(正斜线(/).hash符号(#) 以及取反符号(~))+特殊字符(称为元字符) 两 ...

  5. Python的功能模块[4] -> pdb/ipdb -> 实现 Python 的单步调试

    pdb / ipdb 模块 / pdb / ipdb Module pdb 和 ipdb 的主要作用是用于 Python 程序的单步调试,Python 的调试可参考链接. 下面是一个简单的使用示例 i ...

  6. LCA【bzoj3364】 [Usaco2004 Feb]Distance Queries 距离咨询

    Description  奶牛们拒绝跑马拉松,因为她们悠闲的生活无法承受约翰选择的如此长的赛道.因此约翰决心找一条更合理的赛道,他打算咨询你.此题的地图形式与前两题相同.但读入地图之后,会有K个问题. ...

  7. codevs——1553 互斥的数

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解     题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同 ...

  8. JavaScript 函数调用的 this词法

    函数调用时的this实际上是在函数被调用时发生绑定,它指向什么完全取决于函数在哪里被调用. 特例:当函数作为构造函数被调用时,即使用new 来构造一个新对象,会自动执行以下操作: [1]创建一个新对象 ...

  9. 「CTSC2018」假面

    真~签到题qwq 昨天在考场上先写了个70分暴力dp,然后发现好像可以优化.因为结界技能的模型相当于要求出 对于每个物品,仅仅不选它的背包是什么....  于是当场脑补出两种做法: 前缀和后缀背包卷积 ...

  10. Android入门之文件系统操作

    Android入门之文件系统操作(二)文件操作相关指令 (转)   (一)获取总根 File[] fileList=File.listRoots(); //返回fileList.length为1 // ...