Delphi编码规范

       以下是在之前的公司与别人共同参与制定的Delphi开发规范(5年前了,那时用的还是Delphi7,部分规则可能有些过时,但不整理了,觉得有用的人,自己整理成适合自己的开发规范吧),

目    录 一、序言 二、通用源代码格式规则 2.1 缩格 2.2 页边空格 2.3 Begin…End 配对 2.4代码文件中通用符号含义 2.5注释写法 三、Object Pascal 3.1 括号 3.2 保留字和关键字 3.3 过程和函数(例程) 3.3.1 命名/格式化/声明 3.3.2 形式参数 3.3.2.1 格式化 3.3.2.2 命名 3.3.2.3 参数的排序 3.3.2.4 常量参数 3.3.2.5 名称的冲突 3.4 变量 3.4.1 变量的命名和格式 3.4.2 局部变量 3.4.3 全局变量的使用 3.5 类型 3.5.1 大写约定 3.5.1.1 浮点指针类型 3.5.1.2 枚举类型 3.5.1.3 变数和ole变数类型 3.5.2 结构类型 3.5.2.1 数组类型 3.5.2.2 记录类型 3.6 语句 3.6.1 if 语句 3.6.2 case 语句 3.6.2.1 一般性话题 3.6.2.2 格式 3.6.3 while 语句 3.6.4 for 语句 3.6.5 repeat 语句 3.6.6 with  语句 3.6.6.1 一般话题 3.6.6.2 格式 3.7 结构异常处理 3.7.1 一般话题 3.7.2 try…finally的使用 3.7.3 try…except的使用 3.7.4 try…except…else的使用 3.7.5异常处理 3.8 类类型 3.8.1 命名和格式 3.8.2 域 3.8.2.1 命名/格式 3.8.2.2 可视化 3.8.3 方法 3.8.3.1 命名/格式 3.8.3.2 使用静态的方法 3.8.3.3 使用虚拟/动态的方法 3.8.3.4 使用抽象的方法 3.8.3.5 属性存取方法 3.8.4 属性 3.8.4.1 命名/格式 3.8.4.2 使用存取的方法 四、文件 4.1 工程文件 4.2 窗体文件 4.3 数据模板文件 4.4 远端数据模板文件 4.5含报表构件窗体 4.6只存放代码的“.PAS” 五、包 5.1 使用运行包和设计包的比较 5.2 文件命名标准 六、构件 6.1 用户自定义构件 6.2 构件单元 6.3 使用注册单元 6.4 构件实例命名约定 6.5 构件的前缀 一、序言 ?   本文档详述了使用Delphi 6进行编程的代码编写标准。本文档的目的在于阐述一种方法,通过该方法,开发小组可以在他们所编写的代码中保持一贯的风格。这样做的目的是使在开发小组中的每一个程序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一贯性。 ?   本文档并不意味着包含了所有存在于代码中的标准。但是,它的内容已足够帮你起个好头。你可以自由的增加修改这些标准来满足你的需要。我们严禁你偏离这些由Borland开发人员所使用的标准。我们推荐这么做是因为一旦有新的程序员加入到你的开发小组中,而他们最喜欢和最熟悉的是Delphi的标准。 二、通用源代码格式规则 2.1 缩格 缩格是指在每一级有两个空格。不要在源代码中保留tab字符,这是因为tab字符会随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等)而代表不同的宽度。 ?   你可以通过关闭Environment选项对话框中Editor页上的“Use tab character”和“Optimal fill”检查框(通过Tools|Environment)来禁止保存tab字符;通常这是默认的配置,可以不用去管它。 2.2 页边空格 ?   页边空格会被设置成80字符宽。通常,源码不会超出这个边界,但这个方针会有一些弹性。不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后与前面的语句相连。当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。? 2.3 Begin…End 配对 ?Begin 子句应写在独立的一行。例如,下面第一行是错误的写法而第二行是正确的。 for I := 0 to 10 do begin  //错误,begin同for在同一行 for I := 0 to 10 do        //正确,begin出现在独立的一行 begin ?这个规则的例外是当begin子句的出现是作为一个else子句的一部分-参考例子: if some statement then begin   … end else begin      someOtherStatement; end; ?end 语句永远出现在独立的一行。 当begin语句不是一个else子句的一部分时,相应的end语句永远缩进到与begin部分相对应的位置。 2.4代码文件中通用符号含义 ?//// 四个斜杠代表当前有未实现的内容,相当于占位符 2.5注释写法 a.单行代码注释://注释语句(注释人 日期) b.函数注释: 在函数提前需加注释 ////////////////////////////////////////////////// //函数功能说明: //参数说明: //返回值说明: //作者: //日期: ////////////////////////////////////////////////// c.文件注释 在文件头部需加注释 ////////////////////////////////////////////////// //文件内容说明: //作者: //日期: ////////////////////////////////////////////////// 三、Object Pascal 3.1 括号 永远不要在一个语句中使用不必要的括号。括号只应在源代码中需要的地方使用。以下的例子示范了错误和正确的使用: if (I = 42) then                    //错误 - 多余的括号 if (I = 42) or (J = 42) then        //正确 - 需要括号 3.2 保留字和关键字 Object Pascal 保留字和关键字永远是全部小写。 3.3 过程和函数(例程) 3.3.1 命名/格式化/声明 ?为使程序阅读清晰,每一个过程、函数代码通常不超过50行,否则分解为子函数。 ?自定义过程、函数声明,如果不被外部调用则放在Form的private部分。 ?自定义过程、函数声明,如果被外部调用则放在Form的public部分。 ?自定义过程、函数实现部分,放在implementation的起始部分,Delphi自动声明的过程、函数之前。 ?动态连接库的声明部分,可根据情况放在Form的private部分或public部分。 ?程序中,过程及函数必须添加注释,详见2.5。 ?命名规则: 例程的名字永远应该以大写的字母开头并且中间错落分明以便于可读性。下面是一个不正确格式的过程名称:          procedure thisisapoorlyformattedroutinename; 下面是一个合适的大小写例程名称的例子:          procedure ThisIsMuchMoreReadableRoutineName; 例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头。例如:          procedure FormatHardDrive; 一个用于设置输入参数的例程应以单词set作为前缀,例如:          procedure SetUserName; 一个用来接收某个值的例程应以单词get作为前缀,例如:          function GetUserName : string; 3.3.2 形式参数 3.3.2.1 格式化 ?如果有的话,相同类型的形参应合并在一个语句中:   procedure Foo(Param1,Param2,Param3 : Integer; Param4 : string); ?3.3.2.2 命名 ?    所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到例程中的标志符的名称为基础。一个好的参数名称应以字符a为前缀 - 例如:   procedure SomeProc(aUserName : string; aUserAge : integer); ?“a”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。 ?3.3.2.3 参数的排序 ?下面的形参的顺序重点说明了注册者调用约定调用的好处。 - 最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。 - 输入参数列表应放在输出参数列表的左边。 - 将通用的参数放在特殊参数的左边,例如:       procedure SomeProc(aPlanet,aContinent,aCountry,aState,aCity) - 排序有可能有些例外,比如事件的处理。类型为TObject的Sender参数经常放在第一位。 ?3.3.2.4 常量参数 ?    当一个参数为记录型、数组类型、ShortString、或接口类型并且在例程中不被改变时,这些参数应做上常量标记。这样做会让编译器更加有效率的产生有关这些不改变的参数的代码。而例程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提高效率,这将会给调用例程的使用者提供更多的信息。 ?3.3.2.5 名称的冲突 ?    当使用拥有两个名称相同的例程的两个单元时,如果你调用该例程时,在uses子句中排在后面的单元中的例程将会被调用。为了解决这种“在uses子句上的模糊”冲突,要在调用该例程时写上相关的单元的前缀,例如:         SysUtils.FindClose(SR); 或         Windows.FindClose(Handle); 3.4 变量 3.4.1 变量的命名和格式 变量的命名应以使用它们的目的相符,循环控制变量应采用一个单独的字符作为名字,比如 I,J,或K,也可以采用更加有意义的名字,比如 UserIndex。 逻辑变量的名字应能充分表达准确的真或假的意思。 变量命名以简明、清晰为准,采用匈牙利命名法,前缀小写字母表示变量数据类型,后跟简短英文说明含义。 数  据  类  型缩写 ArrayArr BooleanIs CharC ClassT FloatF IntegerI RecordR SetSet StringS ?3.4.2 局部变量 一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应合理。 如果必须的话,在一进入例程就应初始化局部变量。局部的AnsiString变量会自动初始化为一个空的字符串。局部接口和派分接口类型变量将会自动初始化为nil,并且局部变数和ole变数类型变量会自动初始化为Unassigned。 ?3.4.3 全局变量的使用 ?   使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例如,一个全局变量只应在一个单元的implemntation部分内是全局的。如果打算在多个单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。 ?   全局变量可以在var子句中直接初始化为一个值。记住,所有的全局数据会自动初始化为0,因此不要将全局变量初始化为一个“空”值比如 0、nil、’’、Unassigned、等等。这样做的一个理由是因为零-初始化的全局数据在exe文件中不会占据任何空间。零-初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内存中。非零-初始化的全局数据在硬盘的exe文件占用空间。 ?   全局变量命名应加上前缀glb,如glbUserName。 3.5 类型 3.5.1 大写约定 如果类型的名字是保留字,那么它应全部小写。 Win32 API类型通常全部大写,并且你必须遵循在Windows.pas或其他API单元中的详细类型名称的约定。 常量应全部大写; 对于其他变量名字,第一个字母应为大写,而其他字母应错落有致。下面是一些例子:       var         MyString : string;          //保留字         WindowHandle : HWND;        //Win32 API 类型         I : Integer;                //在System单元中引进的类型标识符 3.5.1.1 浮点指针类型 不推荐使用Real类型,因为它的存在只是为了向前兼容早期的Pascal代码。在通常情况下用Double来实现浮点指针的需要。并且,Double对处理器和总线而言是做了最优化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出Double所定义的范围时才使用Extended。Extended是intel定义的类型且在Java中不支持。只有当浮点指针变量的实际字节大小有其意义时才使用Single。(比如当使用另一种语言的DLLs时)。 3.5.1.2 枚举类型 枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表明这是一个类型。枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于该枚举类型的名字 -例如:   TSongType = (stRock,stClassical,stCountry,stAlternative,stHeavyMetal,stRB); 一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更好的原因来赋予该变量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2 等等。 3.5.1.3 变数和ole变数类型 通常不建议使用变数和Ole变数类型。但在只有运行时刻才能知道数据类型的程序中必须使用该类型,这种情形多出现在COM和数据库开发中。Ole变数使用在以COM为基础的编程中例如自动化和ActiveX控制,而变数使用在非COM的编程中,这是因为变数可以十分有效地存储本地Delphi字符串(同一个字符串变量一样),但Ole变数会将所有的字符串转换为Ole字符串(WideChar 字符串)并且并不实例运算 - 它们永远拷贝。 3.5.2 结构类型 3.5.2.1 数组类型 数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀T。如果须声明该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。例如:         type           PCycleArray = ^TCycleArray;           TCycleArray = array[1…100] of integer; 在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀T。 3.5.2.2 记录类型 记录类型的名字应符合使用它们的目的。其类型的声明应加以前缀T。如果要声明该记录类型的指针,就应加以前缀P并且应紧靠在类型声明的前面声明。例如:       type           PEmployee = ^TEmployee;           TEmployee = record             EmployeeName : string;             EmployeeRate : Double;           end; 3.6 语句 ?3.6.1 if 语句 在if/then/else语句中最常发生的行为应放在then子句中,而其它发生可能性较小的行为应放在else子句中。尽量避免使用嵌套的if语句,在这种情形下应用多个if语句来判断各种可能。 不要使用if嵌套超过五级深度。应使代码编写得更加清晰、明了。 不要在if语句中使用不必要的圆括号。 如果在if语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从左到右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获得最佳的优化。举例来说,如果条件1快过条件2,而条件2快过条件3,那么在if语句中的排列应是:          if 条件1 and 条件2 and 条件3 then 3.6.2 case 语句 3.6.2.1 一般性话题 ?在一个case语句中的各个独立的单元应以数字或字母顺序排列。 ?   每一个case单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。 Case语句中的else子句只有当需要缺省行为或处理错误时才使用。 3.6.2.2 格式 ?case语句应遵循其它结构的缩格和命名约定。 3.6.3 while 语句 在一个while语句中不建议使用Exit过程来跳出循环,尽量仅使用循环条件来跳出循环。在一个while循环中所用的初始化代码应紧靠在进入while循环前面出现而不要被其它不相关的语句隔开。任何结束后的处理应在循环之后立即进行。 3.6.4 for 语句 ?for语句只有当循环次数已知的情况下才能取代while语句使用。 3.6.5 repeat 语句 ?repeat语句的使用同while语句一样,并且遵循同样的通用方针。 3.6.6 with  语句 ?3.6.6.1 一般话题 ?    with语句应节省使用,并且带有大量的警告。避免过度使用with语句并且在with语句中小心使用多个对象、记录等等。例如:          with Record1,Record2 do 这些事情会使程序员感到困惑并难以发现问题所在。 3.6.6.2 格式 ?with 语句遵循本文档所说明的命名约定和缩格的格式规则。 3.7 结构异常处理 ?3.7.1 一般话题 ?    异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一个try…finally必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一个单元的initializition/finalization或一个对象的constructor/destructor中进行资源的分配和释放。 设计过程中应尽量减少通过返回值判断结果,应通过触发异常模式处理错误。 3.7.2 try…finally的使用 ?    任何情形下,每一次的分配都应跟随一个try…finally。举例来说,下面的代码会造成可能的错误:      SomeClass1 := TSomeClass.Create;      SomeClass2 := TSomeClass.Create;      try        { do some code }      finally        SomeClass1.Free;        SomeClass2.Free;      end; 一个更安全更合适的分配过程应是:      SomeClass1 := TSomeClass.Create;      try        SomeClass2 := TsomeClass.Create;        try          { do some code }        finally          SomeClass2.Free;        end;      finally        SomeClass1.Free;      end; 3.7.3 try…except的使用 只有当在异常被触发而你想执行一些任务时才使用try…except。通常,你没有必要为了只是简单地在屏幕上显示一个错误信息而使用try…except语句,因为这会被Application对象自动执行。如果你想在except子句中执行完一些任务之后调用缺省的异常处理,使用raise来重新触发异常到下一个句柄。 3.7.4 try…except…else的使用 ?    try…except中的else子句不建议使用,因为它会打断所有的异常包括那些你没有准备的异常。 3.7.5异常处理 3.8 类类型 3.8.1 命名和格式 类类型的名称应符合使用它们的目的。类型名字应加以前缀T以表明这是一个类型的定义 - 例如: type   TCustomer = class(TObject) 类型的实例通常是没有前缀T的类型的名字 - 例如: var   Customer :TCustomer; 注意:查阅“构件类型的命名标准”来获得更多有关构件命名的信息。 3.8.2 域 3.8.2.1 命名/格式 类的域名遵循与变量标识符同样的约定除了它们应以F为前缀,来表明这是一个域的名称。 3.8.2.2 可视化 所有的域都必需是私有的。想在类的范围之外存取域得通过属性来使用。 3.8.3 方法 3.8.3.1 命名/格式 方法的命名应遵循本文档中有关过程和函数的约定叙述。 3.8.3.2 使用静态的方法 如果使用一个静态的方法,那么该方法就不能被该类的后代类所继承。 3.8.3.3 使用虚拟/动态的方法 如果你打算该类的方法能被后代的类所继承就得使用虚拟的方法。只有在该方法有多个继承时(直接的或间接的)才使用动态的方法。例如,一个类类型包含一个可继承的方法,而100个后代类要继承这种方法,那么这个方法就会动态地产生为100个后代类使用的内存。 3.8.3.4 使用抽象的方法 如果在一个类中使用抽象的方法,该类就不能被创建。只有在那些永远不会被创建的类中使用抽象的方法。 3.8.3.5 属性存取方法 所有存取类的方法都只能出现在类的private或protected部分。属性存取方法的命名应遵循过程和函数的约定规则。读取存取方法(方法读取器)必需以单词Get为前缀。写入存取方法(方法写入器)必需以单词Set为前缀。方法写入器的参数的名字应为Value,并且它的类型应是它所操作的属性的类型。例如:  TSomeClass = class(TObject)  private     FsomeField: Integer;  protected     function GetSomeField: Integer;     procedure SetSomeField(Value : Integer);  public    property SomeField : Integer read GetSomeField write SetSomeField;  end; 3.8.4 属性 3.8.4.1 命名/格式 属性如果是表示为一个私有域的存取器的话,那么它的名字应是它们所操作的域的名字除去解释符F。 属性的名字应是名词,不是动词。属性表示的是数据,而方法表示的是行为。数组类型的名称应为复数。一般情况下属性的名称应为单数。 3.8.4.2 使用存取的方法 尽管没有要求,但还是建议尽量少地为一个表示私有域的属性而使用写入存取方法。 四、文件 4.1 工程文件 工程文件应取个描述性的名字。例如,错误管理器的工程名字是:Bugs.dpr。一个有关系统信息的程序的名字就应象 SysInfo.dpr。 4.2 窗体文件 含窗体构件(Form)的“.PAS”,使用型如“wn……”的英文缩写,“wn”表示Window,“……”为窗口逻辑功能的简述。Delphi会自动给“*.DFM”文件起相同文件名。例如:“wnCard.PAS”,“wnCard.DFM”。 窗体文件使用型如“fm……”的英文缩写,“fm”表示Form,“……”为窗口逻辑功能的简述,应与文件名对应。 例如: “fmCard”与“wnCard.PAS” 4.3 数据模板文件 含数据模块(Data Module)的“.PAS,使用型如“dn……”的英文缩写,“dn”表示Data Module Unit,“……”为窗口逻辑功能的简述。例如:“dnMain.PAS”。 数据模板窗体文件使用型如“dm……”的英文缩写,“dm”表示Data Module Form,“……”为窗口逻辑功能的简述,应与文件名对应。例如:“dmMain” 与“dnMain.PAS” 4.4 远端数据模板文件 含远端数据模块(Remote Data Module)的“.PAS,使用型如“rdn……”的英文缩写,“rdn”表示Remote Data Module Unit,“……”为窗口逻辑功能的简述。例如:“rdnMain.PAS”。 远端数据模板窗体文件使用型如“rdm……”的英文缩写,“rdm”表示Remote  Data Module Form,“……”为窗口逻辑功能的简述,应与文件名对应。例如:“rdmMain” 与“rdnMain.PAS” 4.5含报表构件窗体 含报表构件(Quick Report)的“.PAS”使用型如“pn……”的英文缩写,“pn”表示Print Unit,“……”为窗口逻辑功能的简述。例如:“pnCard.PAS”。 含报表构件的窗体文件使用型如“pm……”的英文缩写,“pm”表示Print Form,“……”为窗口逻辑功能的简述,应与文件名对应。例如:“pmCard” 与“pnCard.PAS” 4.6只存放代码的“.PAS” 使用型如“un……”的英文缩写,“un”表示Unit,“……”为窗口逻辑功能的简述。 例如:“unDlgShell.PAS”。 五、包 5.1 使用运行包和设计包的比较 运行时刻的包应只包含其它构件包所要求的单元或构件。另外,包含属性/构件编辑器和其它只为设计的代码应放入到设计时刻包中。注册单元应放在设计包中。 5.2 文件命名标准 包的名称应依照下面的例子: “iiilibvv.pkg” - 设计时刻包 “iiistdvv.pkg” - 运行时刻包 字符“iii”表示一个3字符标识前缀。这个前缀用来表明公司、个人或其它有标识意义的实体。如jm0字符“vv”表示为该包想要对应Delphi某个版本的包的版本号。 注意,包的名字中包含“lib”或“std”的意思是表明这是一个设计时刻包还是一个运行时刻包。如果既是设计时刻包又是运行时刻包,该文件的命名是同上面一样的,例如,名称应为: jm0Lib40.pkg – 设计时刻包 jm0Std40.pkg – 运行时刻包 六、构件 6.1 用户自定义构件 在标准构件中命名出来的构件的名称同在“类类型”部分定义中的一样定义成一个类类型,不同的是它们有一个3字符的指示前缀,这个前缀可以表示公司、个人或其它实体。例如,一个时钟构件的名称定义为:       Tjm0Clock = class(TComponent) 注意,那三个前缀字符是小写的。 6.2 构件单元 构件单元应只包含一个主要的构件,一个主要的构件是指出现在构件栏中的构件。主要构件的辅助构件/对象应放入到同一个单元中。 6.3 使用注册单元 构件的注册过程应从构件本身的单元中剔除,并放入到一个独立的单元中。这个注册单元可以用来注册任何构件、属性编辑器、构件编辑器、专家器等。 构件的注册只应在设计时刻包中进行,注册单元应包含在设计时刻包中而不应放在运行时刻包中。 推荐使用的注册单元的名称是: XxxReg.pas 上面的3个前缀字符“Xxx”用来表示一个公司、个人或任何其它的实体。例如,注册单元的名称应为 jm0Reg.pas。? 6.4 构件实例命名约定 所有的构件都应取个描述性的名称。由Delphi创建的缺省名的构件不会被遗弃。在设计构件类型时应设计一个小写的前缀。使用前缀而不使用后缀的原因是在搜寻时,在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易实现。 6.5 构件的前缀 以下构件的前缀可以用来设计Delphi 6中的标准构件。在此列表中加入了第三方构件的前缀。由于这些前缀不好记,所以也可采用比较长的构件命名方法,而忽略一下内容,如OkButton、CancelButton、StartDateTimePicker,即后面是构件的类型,前面是构件的名称,这种命名方法也是Borland的标准命名方法;对于同一类型的构件,如TButton、TSpeedButton、TBitBtn可以用同样的后缀Button;除了在代码中不会设计的界面构面,如Label、Panel等,永远不要用一大堆的Button1、Button2等Delphi默认的名称。 6.6 Standard页 前缀      构件 fm        TFrame mm        TMainMenu pm        TPopupMenu mmi       TMainMenuItem pmi       TPopupMenuItem lbl       TLabel edt       TEdit mem       TMemo btn       TButton cb        TCheckBox rb        TRadioBox lb        TListBox cb        TComboBox scb       TScrollBar gb        TGroupBox rg        TRadioGroup pnl       TPanel al        TActionList 6.7 Additional页 bbtn      TBitBtn sb        TSpeedButton me        TMaskEdit sg        TStringGrid dg        TDrawGrid img       TImage shp       TShape bvl       TBevel sbx       TScrollBox clb       TCheckListbox spl       TSplitter stx       TstaticText cb        TcontrolBar ae        TApplicationEvents cht       TChart 6.8 Win32页 tbc       TTabControl pgc       TPageControl il        TImageList bm        TBatchMove usql      TUpdateSQL ntbl      TnestedTable re        TRichEdit thr       TTrackBar prb       TProgressBar ud        TUpDown hk        THotKey ani       TAnimate dtp       TDateTimePicker tv        TTreeView lv        TListView hdr       TheaderControl stb       TStatusBar tlb       TToolBar clb       TcoolBar ps        TpageScroller 6.9 System页 tm        TTimer pb        TPaintBox mp        TMediaPlayer olec      TOleContainer ddcc      TDDEClientItem ddci      TDDEClientItem ddsc      TDDEServerConv ddsi      TDDEServerItem 6.10 Internet页 csk       TClientSocket ssk       TServerSocket wbd       TWebDispatcher pp        TPageProducer tp        TQueryTableProducer dstp      TDataSetTableProducer dspp      TDataSetPageProducer wb        TWebBrowser 6.11 Data Access页 前缀      构件 ds        TDataSource tbl       TTable qry       TQuery sp        TStoredProc db        TDataBase ssn       TSession ol        TOutline tnb       TTabbedNoteBook nb        TNoteBook hdr       THeader flb       TFileListBox dlb       TDirectoryListBox dcb       TDriveComboBox fcb       TfliterComboBox dbll      TDBLookupList dblc      TDBLookupCombo 6.12 Data Controls页 dbg       TDBGrid dbn       TDBNavigator dbt       TDBText dbe       TDBEdit dbm       TDBMemo dbi       TDBImage dblb      TDBListBox dbcb      TDBComboBox dbch      TDBCheckBox dbrg      TDBRadioGroup dbll      TDBLookupListBox dblc      TDBLookupComboBox dbre      TDBRichEdit dbcg      TDBCtrlGrid dbch      TDBChart 6.13 Decision Cube页 dcb       TDecisionCube dcq       TDecisionQuery dcs       TDecisionSource dcp       TDecisionPivot dcg       TDecisionGrid dcgr      TDecisionGraph 6.14 QReport页 注:建议不要使用。报表用reportbuilder qr        TQuickReport qrsd      TQRSubDetail qrb       TQRBand qrcb      TQRChildBand qrg       TQRGroup qrl       TQRLabel qrt       TQRText qre       TQRExpr qrs       TQRSysData qrm       TQRMemo qrrt      TQRRichText qrdr      TQRDBRichText qrsh      TQRShape qri       TQRImage qrdi      TQRDBMImage qrcr      TQRCompositeReport qrp       TQRPreview qrtf      TQRTextFilter qrcsvf    TQRCSVFilter qrhtmlf   TQRHTMLFilter qrch      TQRChart 6.15 Dialogs页 对话框构件是由构件封装的真正的窗体,因此,它们应遵循窗体的命名约定。类型已由构件的名称定义。它的实例的名称是Delphi自动生成的类型实例名字去掉数字后缀。举例如下:       类型                    实例名字     TOpenDialog             OpenDialog     TSaveDialog             SaveDialog     TOpenPictureDialog     OpenPictureDialog     TSavePictureDialog     SavePictureDialog     TFontDialog             FontDialog     TColorDialog            ColorDialog     TPrintSetupDialog      PrintSetupDialog     TFindDialog             FindDialog     TReplaceDialog         ReplaceDialog 6.16 Win3.1页 ts        TTabSet npop      TNMPop3 smtp      TNMSMTP ntm       TNMTime nudp      TNMUdp ?6.17 Samples页 gg        TGauge cg        TColorGrid spb       TSpinButton spe       TSpinEdit dol       TDirectoryOutline cal       TCalendar ibea      TIBEventAlerter 6.18 ActiveX页 cfx       TChartFX vsp       TVSSpell f1b       TF1Book vtc       TVTChart 6.19 Midas页 cds       TClientDataSet dcom      TDCOMConnection sck       TSocketConnection dsp       TdataSetProvider sob       TsimpleObjectBroker wc        TwebConnection cc        TcorbaConnection 6.20 ADO页 注:不建议使用 adoc     TADOConnection adocd    TADOCommand adods    TADODataSet adot     TADOTable adoq     TADOQuery adosp    TADOStoredProc rdsc     TRDSConnection 6.21 InterBase页 ibt       TIBTable ibq       TIBQuery ibsp      TIBStoredProc ibd       TIBDatabase ibtc      TIBTransaction ibus      TIBUpdateSql ibds      TIBDataset ibs       TIBSql ibdi      TIBDatabaseInfo ibsm      TIBSqlMonitor ibe       TIBEvents 6.22 InternetExpress页 xmlb      TXMLBroker mpp       TMidasPageProducer 6.23 FastNet页 nmdt      TNMDayTime nMsg      TNMMsg nmsg      TNMMSGServ nec       TNMEcho nftp      TNMFtp nhttp     TNMHttp nntp      TNMNNTP nst       TNMStrm nsts      TNMStrmServ url       TNMUrl nuup      TNMUUProcessor psk       TPowerSock ngs       TNMGeneralServer nf        TNMFinger Tedit控件可以命名为:edt+代表的字段名称。     TLabelEdit控件可以命名为:Ledt+代表的字段名称。   用于查询的Query控件命名为:qry+主表名;       用于更新的Query控件命名为:upd+主表名;       用于删除的Query控件命名为:del+主表名; 保存数据的函数可以命名为:SaveData;       更新数据的函数可以命名为:UpDateData;       删除数据的函数可以命名为:DeleteData; 进行判断的函数可以命名为:checkData;  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。可能是作者故意这样做的?本文最后提供修正后的下载地址。原文如下:一、关于API Hook1.什么是API Hook不知道大家是否还记得,在DO
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。 这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。需要修改mess.pas中代码才行。其实文中提到的一个结构,代码中并没有使用typePIMAGE_IMPORT_DESCRIPTOR = ^IMA
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把部分api 翻译成了dephi版的 记录一下 地址 ffmpegvcl.zip
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:(dst) <--(src) 1.dst和src类型必须匹配,即必须同为字节
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂,比较少用。 2.WinExec主要运行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW); 3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 首先必须引用shellapi
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) 参数 类型及说明 lpExistingFileName String,欲移
附带通用控件安装方法: ---------- 基本安装 1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install; 2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可; 3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可; 4
type   TRec=Record     msg:string;     pic:TMemoryStream; end; procedure TForm2.BitBtn1Click(Sender: TObject); var   ms:TMemoryStream;   Rec1,Rec2:TRec;   cc:tmemorystream;   jpg:TJPEGImage; begin   R
program Project1; { Types and Structures Definition } type   WNDCLASSEX = packed record     cbSize: LongWord;     style: LongWord;     lpfnWndProc: Pointer;     cbClsExtra: Integer;     cbWndExtra: In
   在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂 的,或重复性的操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。这主要是通过两个API函数来实现的。      下面以Delphi为例来介绍一下如何实现这两个功能。模拟键盘我们用Keybd_event这个ap
delphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针,也就是对象/类的函数/方法 区
Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:     (1)不用登陆进系统即可运行.     (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.     笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.     运行Delphi7,选
方法一: 1.调试delphi 写的服务程序,有这么一个办法。原来每次都是用attach to process方法,很麻烦。并且按照服务线程的执行线路,可能会停不到想要的断点。笨办法是,在procedure TsvcFrm.ServiceExecute(Sender: TService);中想要下断的语句前加个人定胜天的sleep(20000),但实际上这种办法是主观臆测的。可行,没问题。记得大学
Delphi For iOS开发指南(17):让应用程序禁止竖屏(也就是只显示横屏)     最近好多人问,怎么样让Delphi For iOS开发的应用程序禁止竖屏,也就是想让它一直横屏显示,横屏是好,一行可以放好几个控件,表格的话也可以多显示几列,看起来方便。 只要一句代码就可以让Delphi For iOS开发的应用程序禁止竖屏,如下: Application.FormFactor.Orie
一个比较完整的Inno Setup 安装脚本,增加了对ini文件设置的功能,一个安装包常用的功能都具备了。 [Setup] ; 注: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; (生成新的GUID,点击 工具|在IDE中生成GUID。) AppId={{A9861883-31C5-4324-BD9A-DC3271EEB675} ;程序名 AppName
在Delphi自带的Indy控件中其实是提供了MD2,MD4,MD5对象的,我们可以直接使用它们来完成MD5的签名算法。而不需要再去找其它的DLL或是Pas了。 在Uses单元中引用 IdHashMessageDigest,IdGlobal, IdHash 单元,再写如下代码即可以达到MD5的实现。 示例代码 procedure TForm1.Button1Click(Sender: TObjec
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下: 1 2 3 4 5 6 7 8 9 _NOTIFYICONDATAA = record    cbSize: DWORD;    Wnd: HWND;    uID: UINT;    uFlags: UINT;    uCallback
声明: 1. type Name = Existing type; 2. type Name = type Existing type; 3. type Name = (EnumValue1 [=value], EnumValue2 [=value] ...); 4. type Name = Expression1..Expression2; 5. type Name = ^Existing ty