Delphi里J+开关作用类似C语言的static变量
從前筆者曾經對以下的程式產生過疑惑:
{$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变量的更多相关文章
- C语言中static的作用及C语言中使用静态函数有何好处
转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...
- 在delphi中, reintroduce作用
在delphi中, reintroduce作用 当在子类中重载或者重新声明父类的虚方法时,使用 reintroduce 关键字告知编译器,可以消除警告信息.如: TPar ...
- SNF快速开发平台3.0之--系统里广播的作用--迅速及时、简明扼要的把信息发送给接收者
广播信息,即速度快捷.迅速及时.简明扼要的把信息发送给接收者. 当然在SNF快速开发平台上你也可以作为公告使用.不管当做什么使用要满足以下需求: 简单操作:页面操作简单 只需要输入内容就可以发送. 灵 ...
- DELPHI NEXTGEN编译开关
DELPHI NEXTGEN编译开关 {$IFDEF NEXTGEN} UTF8String = type _AnsiString(65001); RawByteString = type _Ansi ...
- Delphi里的Windows消息(可查MSDN指定位置)
各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->C ...
- DELPHI跨平台编译开关
DELPHI跨平台编译开关 DELPHI 现在是跨平台的开发工具,已经不仅仅针对WINDOWS OS. 跨平台的时候,一些WINDOWS特有的API或语法是不能用的,必须使用跨平台的新语法,要用编译开 ...
- [汇编与C语言关系]3. 变量的存储布局
以下面C程序为例: #include <stdio.h> ; ; ; int c; int main(void) { ; char b[] = "Hello World" ...
- Go语言中的变量
1 概述 变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念.变量,是通过变量的标识符定位值的过程.变量的内 ...
- C语言基础 (10) 变量作用域,生命周期 内存结构
01 课程回顾 1.指针数组 注意: 对于数组来说,在使用sizeof的时候a和&a[0]是不一样的, 虽然以%x打印出来他们都是地址 2.值传递 int a; fun(a); int *** ...
随机推荐
- Curl请求方法封装
/** * GET请求 * @param $url * @return bool|mixed */ function http_get($url) { $oCurl = curl_init (); i ...
- select 动态添加 获取 整理
比如<select class="selector"></select> 1.设置value为pxx的项选中 $(".selector" ...
- 两个imageView实现图片轮播
前言 在不少的项目中,都会用到图片轮播这个功能,现在网上关于图片轮播的轮子也层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里给大家介绍笔者的主要思路以及大概步骤. ...
- [POI2010]Beads
题目大意: 给定一个长度为$n(n\leq200000)$的串$S_{1\sim n}$,选择一个$l$,从$S_1$开始,将$S$分为连续的若干段,使得每一段长度为$l$.令$k$为分出来不同的子串 ...
- Jenkins的安装方法(Windows/Linux)
前提:要确定本机全部安装了JDK 一.先说官方的安装方式 打开网址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins,会留意 ...
- asp.net mvc 生成二维码
生成二维码,帮助类: using Gma.QrCodeNet.Encoding; using Gma.QrCodeNet.Encoding.Windows.Render; using System; ...
- java中终止线程的三种方式
在java中有三种方式可以终止线程.分别为: 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和sus ...
- 【power designer】使用power designer编辑pdm物理模型图时,为字段添加中文备注
如下图: 1.双击下图修改 应用如下 2.为数据列添加备注属性 然后为备注列添加 中文备注 [注意,这里有个小技巧,如果光标已经点进去这个单元格,是不能复制进去文字的,但是第一次点击单元格,是可以复制 ...
- Kubernetes:理解资源的概念
不知你是否已清楚,Kubernetes 是支持 Docker 和 rkt(当前是这两种)的容器调度系统.除了下面这些优美的特性,比如简易部署,配置管理,服务发现,等等,它还允许我们以一种更高效的方式来 ...
- NPM安装报错:WARN PACKAGE.JSON, NO REPOSITORY FIELDS
今天在安装npm包时遇到了这个错误,出现如下提示: npm WARN package.json xxx@0.0.0 No repository field. npm WARN package.json ...