2002.06.271,(1)在一个面板区域设置右键菜单,只是这样Panel1.PouupMenu:=PopupMenu还不够,一个简单的做法是设窗体的ActiveControl属性为Panel1.
(2)PopupMenu1.PopupComponent返回右键菜单点击的控件。2,ParamCount 函数返回命令行参数的个数;ParamStr(0), 传回执行档的档名(含路径);ParamStr(n), 传回第n个参数的内容。3,对于一般的构件而言,height就是clientheight,width就是clientwidth,而对于窗体而言,height是包括标题条在内的高度,而clientheight是指窗体工作区的高度。同理,clientwidth是指定窗体工作区的宽度。4,通常在OnCreate或Onshow中直接用Close关闭窗体会出现保护性错误,用PostMessage(self.handle, WM_CLOSE, 0, 0);5,(1)给数值加上千位分隔符:Format('%*.*n',[10,2,n]);
(2)设定DateTimePicker的日期格式:DateTimePicker1.Perform(DTM_SETFORMAT, 0, DWORD(PCHAR('MM/dd/yyyy')))。6,浮点数相除:/;整数:div。━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2002.06.281,当用户选取菜单时,Windows会向程序发送WM_INITMENU消息,例:
{procedure WMInitMenu(var msg: TMessage); message WM_INITMENU;
  if msg.WParam = GetMenu(Handle) then
  N1.Enabled := Clipboard.HasFormat(CF_OEMTEXT);
  else inherited;}2,拖动Panel控件
在MouseDown事件中添加:
const
  SC_DragMove = $F012;  { a magic number }
begin
  ReleaseCapture;
  panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
{适用于其他一些控件如TEdit,TMemo,TButton;不能用于TLabel但TStaticText可;SC_DragMove  = $F011- $F019 效果相同,SC_DragMove  = $F020-$F029
鼠标单击时控件最小化,双击恢复;SC_DragMove  = $F030-$F039时最大化,SC_DragMove  = $F060-$F069 时隐藏}3,使RichEdit能添加大于64K的内容
SendMessage(RichEdit1.Handle, EM_EXLIMITTEXT, 0, $7FFFFFFF);4,√√√TFrame(框架)的使用√√√5,WM_EXITSIZEMOVE判定用户改变窗口大小或改变窗口位置的事件是何时
完成的。━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2002.06.291,使用Random取任意值函数,加上initialization randomize或在代码前面直接添加randomize;2,把应用程序添加到打开方式中
例:uses Registry;
var
  reg: TRegistry;
begin
  try
    reg := TRegistry.Create;
    try
      reg.RootKey := HKEY_CLASSES_ROOT;
      reg.OpenKey('*\Shell\Trc', true);     { 写入注册表,'Trc'为标识,
                                               可自行指定 }
      reg.WriteString('', 'Open with Trc'); { ‘Open...'为应用程序
                                               在打开方式中显示的名称 }
      reg.CloseKey;                         { 关闭注册表项 }
      reg.OpenKey('*\Shell\Trc\Command', true); { 打开命令参数项,此项用
                                                 来保存命令行及参数 }
      reg.WriteString('', '"' + ParamStr(0) + '" "%1"'); { ParamStr(0)
                                         命令行参数此处为可执行文件路径 }
      reg.CloseKey;
    finally
      reg.Free;
    end;
  except
    raise;
  end;  { 打开文件 }
  if ParamCount >= 1 then { 直接运行时 ParamCount=0,用打开方式运行时
                              ParamCount=1 }
  begin
    MyOpenFile(ParamStr(1)); { ParamStr(1)命令行参数为待打开文件的路
                                 径 ,MyOpenFile为自定义的打开文件过程}
    { 另外GetCommandLine函数取得ParamStr各项值 }
  end;
end;
{ 一郎 2002.7.6 }3,SHAddToRecentDocs(uFlags: Cardinal, pv: Point)用于在开始菜单的文档
中加入指定的文件{例:SHARD_PATH, pChar(s),s为路径},函数位于ShlObj
单元;清除文档SHAddToRecentDocs(SHARD_PATH, nil){速度慢}。━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2002.07.011,
-------编码风格-------------------------------------------
*Uses 子句:interface 部分的 uses 子句应该只包括 interface 部分中代码需要的单元.Delphi 自动加入的无关的单元名应该删除.
{注:一个空白窗体所需要的单元:Forms,Dialogs;删除单元不影响编译后可执行文件大小}
*implementation 部分的 uses 子句应该只包括 implementation 部分中代码需要的单元.无关的单元名应该删除.
*Interface 部分:Interface 部分应该只包括可被外部单元访问的类型声明, 变量声明, 过程/函数的预先声明, 等等.其他内容应该在 implementation 部分.
*Implementation 部分:Implementation 部分应该包括类型本单元私有的类型声明, 变量声明, 过程/函数.
*Initialization (初始化)部分:不要将耗费大量时间的代码放在单元的 initialization 部分.这将导致应用程序启动缓慢.
*Finalization 部分:确保你释放了在 Initialization 部分分配的全部项目.
2,
--------OLE控件的使用--------------------------------------------------
(1)装载一个文件:CreateObjectFromFile(const FileName: string;Iconic: Boolean) 例:{OleContainer1.CreateObjectFromFile('C:\sample.doc', true);}{注意:文件的后缀名是需要,且不能直接用LoadFromFile方法}{当AutoActivate属性为aaDoubleClick:Iconic对应值为true时(即上例)在OLE控件中显示的是文件类型图标,为false时若为文档类型直接在OLE控件中显示文档内容。AllowActiveDoc属性为false,在外部运行OLE程序,为true,则在OLE控件中打开OLE程序。AutoActivate属性决定运行应用程序时通过OLE控件打开文件的方式,为aaManual或aaGetFocus时自动打开文件}?OleContainer1.Run 和 OleContainer1.DoVerb(ovShow)的区别,作用
?在OLE控件上直接运行OLE程序时,如果窗体上无主菜单,则OLE程序的菜单也将不显示出来 ;如果窗体上已经有了菜单,OLE程序的菜单会被融合进来,即只能显示一部分菜单。怎么办?(2)通过OLE控件从数据库中读写数据(使用TStream类):{参考,细节待更正}
读出数据:
{var
  sm: TStream;
begin
  with ADOQuery1 do
  begin
    sm := CreateBlobStream(FieldByName('sample'), bmRead);
  end;
  OleContainer1.LoadFromStream(sm);
  sm.Free;
end;}
写入数据:
{var
   sm: TStringStream;
begin
  sm := TStringStream.Create('');
  OleContainer1.CreateObjectFromFile('C:\sample.doc', true);
  OleContainer1.SaveToStream(sm);
  sm.Position := 0;
  with ADOQuery1 do
  begin
    FieldByName('sample').AsString := sm.DataString;
    ExecSQL;
  end;
  sm.Free;
end;
}----------------
3,信息提示:
{$MESSAGE '提示信息'}
To-Do List: {TODO|DONE [n] [-o<owner>] [-c<category>] : <to-do item text>} 例:{TODO 1 -oTRC: Uniform}

解决方案 »

  1.   

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.07.031,TBookStr为Ansistring类型,因此分配于的内存是自动管理的,清除书签:
    {var bm: TBookStr;
      bm := ADOQuery1.Book; bm := '';}
     var BM: TBook;
        BM := ADOQuery1.GetBook;
        ADOQuery1.GotoBook(BM);2,Cancel()方法取消对当前数据集的更改,并返回对数据集的浏览模式。3,BLOB(Binary Large Object)字段用来保存不定量的数据,BLOB最适合于保存大量的文本、图像或类似O L E对象那样的原始数据流。4,把单元添加到另一个单元的uses子句,使用Alt+F11快捷键。5,Delphi 5 开发人员指南(第28,29,30章)6,编辑框的撤消 RichEdit1.Perform(EM_UNDO,0,0);
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.07.061,使用帮助文件:按下帮助内容中的Quick Info按钮,查看Import Library中指定的是哪个库文件,添加至程序中uses部分。2,直接调用类似Writeln,Readln之类的函数,会出现I/O错误(EInOutError),需
    在单元中加上{$APPTYPE CONSOLE}。3,指针:将@运算符放在变量的前面,将获取变量的地址,并可以把地址赋值为同样
    数据类型的指针。当把^运算符放在一个数据类型的前面,则可以定义该类型的一个指针类型;如果放在一个指针的后面,则获取该指针指向的地址空间的内容。4,在声明常量的时候,等号右边可以使用一些预定义的函数,如Abs、Addr、ArcTa n、Chr、Cos、Exp、Frac、Hi、High、Int、Length、Ln、Lo、Low、Odd、Ord、Pr ed、Round、Sin、SizeOf、Sqr、Sqrt、Succ、Swap和Trunc等。5,定义过程与函数时对调用约定起作用的指令字:
      Directive 指令参数        传递顺序
         register               从左向右
         pascal                 从左向右
         cdecl                  从右向左
         stdcall                从右向左
         safecall               从右向左
    其他的具体区别?━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.07.071,类引用(class reference)的定义形式如下:class of type
    例如:
    type TClass = class of TObject ;
    var AnyObj: TClass;
    异常类 Delphi5开发人员指南第2章Page53。
    TFileTime 第11章Page11。2,raise语句的形式如下:raise object at address
    其中object和at address是可选项,address通常是一个指向过程或函数的指针。
    一个抛出的异常在处理过后自动地被删除,一般不去主动地删除一个异常对象。3,从路径取得文件名:
    function GetFileNameFromPath(var sFilePath: string): string;
    var
      i: integer;
      s: string;
    begin
      i := Pos('\', sFilePath) + 1;
      s := Copy(sFilePath, i, Length(sFilePath));
      while Pos('\', s) <> 0 do
        s := GetFileNameFromPath(s);
      result := s;
    end;
    {去掉后缀名:
    s2 := GetFileNameFromPath(s1);s2 := Copy(s2, 0, Pos('.', s2) - 1);}
    {函数ExtractFileName()返回文件名和扩展名}4,编译指令{$HINTS ON}与{$HINTS OFF}用来进行设置在编译时是否显示提示信息
      CTRL+O+O ---显示编译指令5,使用代码模板
    代码模板将一些常用的语句块保存在模板中,只要在代码编辑器中按下Ctrl+J,则会弹出一个小窗口,其中对已有的语句块进行了列表显示。可以选择其中的一个并按下回车键,则该模块语句就整个地出现在当前光标所在的位置。
    编辑代码模板:Tools | Editor Options...打开Editor Properties对话框,选中其中的Code Insight标签即可。6,定义两个相互包含的类
    如果要定义两个类,其中第一个类中有一个成员的数据类型为第二个类,而第二个类中有一个成员的数据类型为第一个类,这时就需要在定义两个类之前预先对第二个类进行声明。7,引用参数传递
    引用参数传递是一种参数传递的方式。只要在参数列表中形参的前面加上保留字var,参数传递方式就成为了引用参数传递。在传递参数的过程中,并没有把参数的值复制
    到过程或函数的堆栈中,只是把参数的地址传递给了过程或函数。这样做,对于普通
    变量,尤其是比较大的对象来说,可以大大减少对堆栈操作的时间。同时,在函数体中,可以像使用普通形参一样使用引用参数。所以说,引用参数传递集中了普通参数
    传递和指针参数传递的优点。8,统一操作改变组件大小
    先选中几个组件,然后通过主菜单Edit | Size...命令将打开Size对话框。在Size对话框中选择宽度和高度的有关设置。例如,分别选中Size对话框中的Width|Grow to largest和Hight|Grow to largest,按下OK按钮后,选中的一组组件的大小就同其中尺寸最大的一个组件一样了。9,设置可视组件的TabOrder
    在对话框中,可以通过按下Tab键,依次定位到各个具有输入焦点的可视组件。可以通过设置组件的TabOrder属性来确定这种定位的顺序。通过主菜单的Edit|Table Order. . .命令弹出Edit Tab Order对话框在其中的Controls listed in tab order项中选中某个组件后,点击对话框右部的上、下箭头就可以方便地改变该组件的TabOrder属性。10,---《Delphi5编程实例与技巧》---------------------------------------11,组件的锁定与解锁
    一般在窗体中将组件的大小和位置安排好后,可以将组件锁定,这样就不会因为误操作而改变已经设置好的大小和位置。可以通过菜单命令“Edit|Lock Controls”将窗体中的组件“锁定”和“解除锁定”。12,CharCase最初是作为TCustomEdit类的属性出现的, TEdit类将其作为公共属性继承了下来,所以Edit组件具有CharCase属性。然而TCustomMemo类并没有从TCustomE dit类处继承CharCase属性,所以TMemo类与TRichEdit类就没有CharCase属性。13,ListView:属性ViewStyle确定显示方式(除了vsReport外其他选项无法显示子项目?)14,HeaderControl组件用在数据分列的时候可以提供一个标题。15,过程ShowMessageFmt可以在信息对话框上显示一个格式化串,
    例如:ShowMessageFmt( '文件%s 共有%d 字节。' ,[ 'MyDoc.txt ',123456]) ;16,函数MessageDlgPos用以在指定位置显示消息对话框;函数MessageDlgPosHelp显示的信息对话框中可以单独指定一个帮助文件。17,IME属性
    IME是输入法编辑器(Input Method Editor)的英文缩写,也就是可以自动实现输入法的切换。
    例如,在窗口中有一个Edit组件,如果希望当输入焦点定位在该组件上时,输入法自动切换到中文输入方式,则可以通过设置Edit组件的IME属性来实现。
    具体做法如下:
    1) 设置ImeMode属性。如果要设置为中文输入法,可以将ImeMode属性设置为imChinese。
    2) 接着设置ImeName属性。可以通过下拉组合框选择一个具体的输入法。18, 将菜单项移到菜单栏的最右边
    BOOL ModifyMenu(HMENU hMnu,UINT uPosition,UINT uFlags,
    UINT uIDNewItem, LPCTSTR lpNewItem);
    第一个参数hMenu指的是要修改菜单的句柄;第二个参数uPosition指的是要修改的菜单项索引,其值从零开始到菜单项的总数减一;第三个参数uFlags指的是新菜单项的状态;第四个参数uIDNewItem是指新菜单的句柄;第五个参数lpNewItem指的是修改后菜单的标题。19, 线程
    →TThread类是一个抽象类,不可以直接创建它的实例,但是可以创建它的派生类。
    →构造函数Create原型如下:
    constructor Create(CreateSuspended: Boolean);
    其中参数CreateSuspended为一个布尔类型的变量。如果设置为False,则线程对象创建后立即调用TThread类的另一个过程Execute,也就是立即开始执行线程的操作;如果设置为True,则线程对象创建后,要调用过程Resume后线程的操作才开始。
    →一些属性和方法:
    ① Priority 优先级属性。可以设置线程的优先级。属性取值:
      tpIdle 最低的优先级。只有系统处于空闲状态时才执行
      tpLowest 比普通优先级低两级
      tpLower 比普通优先级低一级
      tpNormal 普通的优先级
      tpHigher 比普通优先级高一级
      tpHighest 比普通优先级高两级
      tpTimeCritical 最高的优先级
    ② ReturnValue 返回值属性。当线程结束时返回给其他线程的一个数值。
    ③ Suspended 挂起属性。可以判断线程是否被挂起。
    ④ ThreadID 线程标识号属性。是整个系统中线程的标识号。使用Windows API函数的
       时候,该属性非常有用。
    ⑤ DoTerminate 产生一个OnTerminate事件,但是不结束线程的执行。
    ⑥ Resume 唤醒一个线程继续执行。
    ⑦ Suspend 挂起一个线程。
    ⑧ Synchronize 由主VCL线程调用的一个同步过程。
    ⑨ Terminate 将Terminated属性设置为True,中止线程的执行。
    ⑩ WaitFor 等待线程的中止并返回ReturnValue属性的数值。
    →使用Synchronize函数
    TThread类的Synchronize过程原型如下:
    type TThreadMethod = procedure of object;
    procedure Synchronize(Method: TThreadMethod);
    其中参数Method为一个不带参数的过程名。在这个不带参数的过程中是一些访问VCL的
    代码。可以在Execute过程中调用Synchronize过程来避免对VCL的并发访问。程序运行期间的具体过程实际上是由Synchronize过程来通知主线程,然后主线程在适当的时机执行Synchronize过程的参数列表中个不带参数的过程。在多个线程的情况下,主线程将Synchronize过程所发的通知放到消息队列中,然后逐个地响应这些消息。通过这种机制Synchronize实现了线程之间的同步。20,如果在DLL中需要显示信息对话框,最好采用MessageBox代替ShowMessage,因为这样可以大量地减少动态链接库的大小。21,DLL
    →动态装入DLL
    使用下面的三个Windows API函数可以在程序运行期间动态地装入动态链接库:
    1) LoadLibrary
    函数LoadLibrary将DLL动态地装入内存。原型如下:
    HINSTANCE LoadLibrary(
    LPCTSTR lpLibFileName // 指
      

  2.   

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.07.091,SQL
    →排序:ORDER BY Name ASC(降序DESC)
    →子查询:SELECT Name FROM Student WHERE SID IN
    (
    SELECT StudentNumber
    FROM Enrollment
    WHERE ClassName="C191"
    )
    →连接不同数据表:
    SELECT Student.SID,Student.Name,Enrollment.ClassName
    FROM Student,Enrollment
    WHERE Stident.SID=Enrollment.StudentNumber
    →添加数据:
    INSERT INTO Enrollment (StudentNumber,ClassNumber,PositionNumber)
    VALUES(3,"C191", 20)
    →修改数据:
    UPDATE Student
    SET Name="Jerry"
    WHERE Name="Tom"2, COM
    →所有的COM对象必须实现IUnknown接口。IUnknown定义了3个方法:AddRef、
    Release和QueryInterface。
    →全局唯一标志符(GUID)在系统中唯一地标志了一个COM接口。GUID是一个128位的数字,在Delphi编辑器中,使用Ctrl+Shift+G组合键可以生成一个GUID(重复机率非常小)3,运行时隐藏程序:
    Form1.Visible := True;
    OnActive 事件中添加
    ShowWindow(Handle, SW_HIDE);
    不在任务栏显示:SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.07.171,字符串类型 s := '#10' 和 s := #10之间的转换:
      s := WideChar(StrToIntDef(Copy(s, 2, MaxInt), 0));
     //或 s := WideChar(StrtoInt(Copy(s, 2, Length(s))));
      注:从右到左的转换:(暂时没有找到理想的方法)
      可以这样:(1),var s: WideChar;s := #10;s := '#' + IntToStr(Ord(s));
               (2),var s: string;s :=  '#' + IntToStr(Ord(#10));
      不可以这样:var s: string;s := #10;s := '#' + IntToStr(Ord(s));2,能赋初值的变量仅是全局变量,过程或函数中局部变量不可以。3,使用RichEdit组件时应注意:
    1) 如果PlainText属性设置为True,则在RichEdit组件中显示RTF文件的时候,将格式标记以普通文本的方式显示出来。如果PlainText属性设置为False,则根据RTF文件中的格式设置来显示。通常将PlainText属性设置为False。
    2) 存取RTF文件:Lines.LoadFromFile和Lines.SaveToFile。
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.07.181,ADO
    要使用ADO的BatchUpdate功能,必须在ADOExpress组件中进行一些必要的设定,才
    能够让ADO进入BatchUpdate的模式。下面就是进入BatchUpdate模式的必要设定:
    →设定CursorType为KeySet或Static。
    →设定LockType为BatchOptimistic。
    → 执行的SQL命令必须是Select。
    →可选:CursorLocation为clUseClient。
    { 虽然在Microsoft的文件中说明,BatchUpdate可以使用Server-Side Cursor或Client-Side Cursor。但是,如果使用BatchUpdate再搭配Server-Side Cursor ,那么不但无法使用Briefcase模型,在执行效率上也不好。(最好使用Client-Side Cursor)}
    UpdateBatch方法的原型:
    procedure UpdateBatch(AffectRecords: TAffectRecords = arAll);
    UpdateBatch方法的参数说明如下:
    选项常数                意义
    arCurrent           只把目前记录的修改更新回数据源之中
    arFiltered          只把符合过滤条件的数据的修改更新回数据源之中
    arAll               把所有数据的修改更新回资来源之中
    arAllChapters       更新所有被影响到的chapters (ADO chapters)取消所有客户端对于数据的修改,可以调用TADODataSet等组件的CancelBatch方法。CancelBatch能够把客户端所有尚未更新回数据源的数据修改恢复成原来的数值,并且释放储存修改数据的资源。ADO数据集FilterGroup属性值意义
    FgUnassigned 指定不使用任何的过滤器来过滤数据
    fgNone 移去任何的过滤器,让所有的数据都显示出来。(这也可以通过设定ADO的
                                              Filtered属性值为False来达到)
    fgPendingRecords 只显示被修改过但尚未更新回数据源的数据或被修改过但尚未
                     被取消更新的数据
    fgAffectedRecords 只显示受到上一次更新回数据源影响的数据
    fgFetchedRecords 只显示在目前更新缓存之中的数据。这些数据是在上一次从数据
                     源取得之后所有储存在客户端的数据
    fgPredicate      只显示刚被删除的数据
    fgConflictingRecords 只显示被修改过但当更新回数据源时发生错误的数据ADO数据集的UpdateStatus方法常数数值意义
    usUnmodified 目前这笔数据没有被修改过
    usModified   目前这笔数据已经被修改过
    usInserted   这笔数据是新增的数据
    usDeleted    这笔数据已经被删除了SaveToFile方法接受两个参数,第一个参数是储存的文件名称,第二个参数则是储存的格式。在ADO 2.1以上的版本中,它可以使用两种格式来储存数据。
    格式常数       意义
    pfADTG     以Advanced Data Tablegram格式储存
    pfXML        以XML的格式储存ApplyUpdates方法接受一个参数,这个参数为更新数据时允许更新错误的次数,为0
    代表不允许更新错误,为-1为允许任何数目的更新错误。多字段搜寻:ADOQuery1.Locate('City;Country', VarArrayOf([Edit1.Text,
    Edit2.Text]), [loCaseInsensitive, loPartialKey]);一个简单的主明细表结构
    组件:ADOConnection1,ADOQuery1,ADOQuery2,DataSource1,DataSource2。属性设置:
    ADOQuery1.Connection  : ADOConnection1;
    ADOQuery2.Connection  : ADOConnection1;
    DataSource1.DataSet   : ADOQuery1;
    DataSource2.DataSet   : ADOQuery2;
    ADOQuery2.DataSource  : DataSource1;
    ADOQuery2.SQL         : select top 1 * from y_Customer
    ADOQuery2.SQL         : select * from y_Order where CustomerID =: ID;
    (ID---y_Customer;CustomerID---y_Order,通过y_Order数据表CustomerID字段
    关联)
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    2002.07.201,GetTickCount 取得当前系统时间,可以用GetTickCount() 或timeGetTime()
    来判断一段代码的执行时间在多线程环境下,因为在执行程序中间,操作系统可能会把CPU时间片分给别的进程。所以,用上述方法测出的时间会不真实。为了解决这个问题,Windows NT提供了一个函数GetThreadTimes() ,它可以提供详细的时间信息。(GetThreadTimes只适用于WINNT、2000)2,移位运算符:shl 左移;shr 右移。(i1 := i2 shl N 等同于 i1等于i2乘以2的N次方,shr即除以)。
    Delphi帮助文件说明:
    The operations x shl y and x shr y shift the value of x to the left or right by y bits, which is equivalent to multiplying or dividing x by 2^y; the result is of the same type as x. For example, if N stores the value 01101 (decimal 13), then N shl 1 returns 11010 (decimal 26). Note that the value of y is interpreted modulo the size of the type of x. Thus for example, if x is an integer, x shl 40 is interpreted as x shl 8 because an integer is 32 bits and 40 mod 32 is 8.3,Real是Double类型的别名,6字节的浮点数仍然有,但现在是Real48。
    通过编译开关{$REALCOMPATIBILITY ON}可以使Real仍然代表6字节的浮点数。4,编译开关$H来将string类型定义为Shortstring,当$H编译开关的值为负时($H-),string变量是Shortstring类型;当$H编译开关的值为正时(缺省情况),字符串变量是Ansistring类型。shortString缺省的最大长度为256个字节,这表示在S hortString中不能有大于255个字符(255个字符+1个长度字节=256)。
    使用$H规则的一个例外是,如果在定义时特地指定了长度(最大在255个字符内),那么总是ShortString:
    var
    S: string[63]; //63个字符的ShortString字符串5,因为一个字符在长度上并不表示一个字节,所以不能在应用程序中对字符长度进行硬编码,而应该使用Sizeof()函数。Sizeof()标准函数返回类型或实例的字节长度。
    例:
    type
      CustRec = record
        Name: string[30];
        Phone: string[14];
      end;
     var
      P: ^CustRec;
    begin
      GetMem(P, SizeOf(CustRec));
      Canvas.TextOut(10, 10, 'The size of the record is ' + IntToStr(SizeOf(CustRec)));
      FreeMem (P, SizeOf(CustRec));
    end;6,能用+运算符或Concat()函数来连接两个字符串,推荐使用+运算符,因为Concat()函数主要用来向后兼容。7,→能像数组一样对字符串进行索引,但注意索引不要超出字符串的长度,例如,下面的代码会引起一个错误:
    var
    S: string;
    begin
    S[1] := 'a'; //不能工作,因为S没有被分配空间
    end;
    然而,代码改成如下,就能正常工作了:
    var
    S: string;
    begin
    SetLength(S, 1);
    S[1]:='a'; //现在S有足够空间来容纳字符
    end;
    →{var
    S: String;
    begin
    SetLength(S,256); //重要!首先给字符串分配空间
    //调用API函数,S现在包含目录字符串
    GetWindowsDirectory(PChar(S),256);
    SetLength(s2, StrLen(PChar(s2)));//设置S的长度为null结束的长度,不可少的 过程,去除一连续的空格。StrLen返回字符串中的字符数}
    对长字符串设置长度时,必--须用SetLength()过程,过去那种通过直接访问字符串第0个元素来设置长度的方法,在应用程序从16位的Delphi 1.0升级到32位时会出现问题。
    →例:SetLength(s, 2);
        s[1] := '1';
        s[2] :='2';{ S := ‘12’}8,动态数组
    var
      i1, i2: Array of integer;
    begin
      SetLength(i1, 6);
      i2 := i1;
      i1[0] := 6;
      i2[0] := 11;{i1[0] := 11}
    end;
    赋值语句A2 : = A1并不创建新的数组,仅将A1数组的引用赋给A2,因此对
    A2数组的任何