⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 27.htm

📁 水木清华的BBS文章
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://bbs.tsinghua.edu.cn"><font face="黑体"><big><big>水木清华★</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">         Delphi编程                            (BM: strayli FlyingBoy)          </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="454"> <p align="center">[<a href="index.htm">回到开始</a>][<a href="3.htm">上一层</a>][<a href="28.htm">下一篇</a>]
<hr><p align="left"><small>发信人: seader (海哥), 信区: Delphi <br>

标  题: Delphi 学习笔记之Object Pascal <br>

发信站: BBS 水木清华站 (Fri Oct  9 21:25:18 1998) WWW-POST <br>

  <br>

 Delphi 学习笔记之Object Pascal <br>

  <br>

   ______________________________________________________________________ <br>

  <br>

   [INLINE]  单元间以 uses 彼此参考 <br>

  <br>

   请问我要如何才能在 unit2 中改变 unit1 中的变数值. 例如,我 <br>

       在form1(unit1)中 show form2(unit2) ,且在 form2中得到 user 输入的字 <br>

       串,该如何将它传给 unit1. <br>

       [INLINE] <br>

       要存取另一个 unit 的变数、程序或函数, 只要利用uses述句中写明那个 <br>

       unit 的名称即可, 例如: <br>

uses <br>

  SysUtils, WinTypes, WinProcs, Messages, <br>

  Classes, Graphics, Controls, Forms, Dialogs; <br>

       不过, 在使用上有几个提醒请您注意的: <br>

       [INLINE] 两个 unit 均在 interface 互相 uses 对方是不可以的,一定要互 <br>

       相参考的话, 您可以在 unit1 的 interface uses unit2, 然後在 unit2 的 <br>

       implementation 中 uses unit1, 这点应该已经回答了您的问题。 <br>



       [INLINE] uses 只能使用对方 interface 部分的变数、程序或函数, 如果是 <br>

       类别(Class), 即使该类别的物件定义在interface 部分, 也不能存取到该类 <br>

       别界定为 private的部分 <br>

       [INLINE] uses 述句後的单元, 不论是.pas 或 .dcu , 不一定要与 <br>

       project 放在同一个目录, 如果这个单元在 project 所在的目录中找不到, <br>

       delphi 会在编译时, 按照主选单 Options | Project... | <br>

       Directories/Conditionals 这页的 Search path 设定,或者是 Options | <br>

       Environment | Library 这页的 Library path 设定的内容, 逐一去搜 寻这 <br>

       个指定的单元所以,您可以将一般通用性的单元(例如专为字串处理撰写的单 <br>

       元)整理在同一个目录, 日後使用与修改这些单元时,版本上会比较统一且易 <br>

       於管理. <br>

       希望这些能帮得上您的忙 <br>

  <br>

                                                           [返回文件开头] <br>

   ______________________________________________________________________ <br>

  <br>

   [INLINE]  指标与参考 <br>

  <br>

   在 c++ 中,宣告有两种 <br>

Shape abc; 和 <br>

  <br>

Shape *p; <br>

Shape *p; <br>

p= new Shape; <br>

       上述方法都可以行的通。但有用new ,就一定要 free 。 <br>

       问题一: <br>

       如果宣告, Shpae *p;而不 new 它,而直接拿来用好似也可以,那有没有 new <br>

       似忽一样? 在 delphi 中 <br>

Shape = class(..); <br>

begin <br>

. <br>

. <br>

end; <br>

  <br>

procedure ....; <br>

var <br>

  MyShape :Shape; <br>

begin <br>

  MyShape.xxx:= 12; <br>

. <br>

. <br>

end; <br>

       问题二: <br>

       delphi 中一般宣告好有一 create 的呼叫,类似 new,,但不 create好像也 <br>

       可以用,不懂差别在那? <br>



       [INLINE] <br>

       一般来说, 在 var 後面的定义只是在堆叠中配置一个指向某一特定类料型态 <br>

       的「指标」而已,在经过 Create 建构後, 该物件才真正存在 <br>

       上述的「指标」, 正确的称呼方法是「参考」(Reference), 有关於这点 -- <br>

       我先从记录(record)型态讲起, 假定: <br>

type <br>

  <br>

PMyRecord = ^TMyRecord; <br>

TMyRecord = record <br>

  A: integer; <br>

  ... <br>

end; <br>

  <br>

... <br>

var <br>

  OneRecord: PMyRecord; <br>

       那麽记录的记忆体配置的确是用 New() 即可, 当配置了一块 TMyRecord 的 <br>

       记忆体空间後, OneRecord 是指向这块记忆体空间的指标, 要存取各个栏 <br>

       位, 语法即是 OneRecord^.A , 关於这种'依址取值', C 与 Pascal 的作法 <br>

       都一样, 只不过语法不同罢了. <br>

       然而当 record 演化成 class 时, 建构物件就不只是配置记忆体这麽单纯而 <br>

       已, 从此处起, C 与 Pascal 有了不同的作法 -- <br>

与 Pascal 有了不同的作法 -- <br>

       [INLINE] 首先, Pascal 要用 MyObject = TMyObjectClass.Create 的方法 <br>

       建构物件. <br>

       [INLINE] 其次, 不同於 record pointer 的是, 要参考物件中的公开介面, <br>

       Pascal 简化了语法, 不再采用 MyObject^.PropertyName, 而是直接写成: <br>

       MyObject.PropertyName <br>

       虽然也是指标的观念, 但毕竟有些不同, 是吗? 於是, Object Pascal特别将 <br>

       之称为'参考'(Refrence). <br>

       也就是说, 如果要讲语法统一的话, 物件.属性, 物件.方法 也应该像是 C <br>

       语言一样(物件->方法), 写成 物件^.属性, 物件^.方法,但是Delphi 用的却 <br>

       是VB的语法, 是用一个「.」(句点)而已, 但毕竟是指标的概念, Compiler <br>

       代理了那个 ^ 符号, 所以, Delphi 管这种'物件指标'一个特别的名词: '物 <br>

       件参考'(Object Reference). <br>

  <br>

                                                           [返回文件开头] <br>

   ______________________________________________________________________ <br>

  <br>

   [INLINE]  内嵌物件的类别的解构元 <br>

  <br>

   问题如下: <br>

type <br>

  media=class(TObject) <br>

    a:Integer; <br>

    a:Integer; <br>

    MyImage: TImage; <br>

    MyMCI: TMediaPlayer; <br>

        . <br>

        . <br>

  end; <br>

  <br>

procedure xxx.Formcreate(...); <br>

var <br>

  Mymedia : media; <br>

begin <br>

  Mymedia := media.Create(self); <br>

        . <br>

end; <br>

       只写这样, media class 中的 MyImage,MyMCI 有被create 吗? <br>

       [INLINE] <br>

       该物件还没有建构 <br>

       我实验的方法是, 在子类别的建构程序中显示一段测试文字, 以该测试文字 <br>

       是否出现来推论该物件是否建构 <br>

       一般来说, 在 var 後面的定义只是在堆叠中配置一个指向某一特定类料型态 <br>

       的「指标」而已,在经过 Create 建构後, 该物件才真正存在 <br>

       以我的实验结果看来, 的确如此, 因此, 在类别中如果嵌入其他类别, 在建 <br>

       构程序必须同时畏建构这些嵌入的类别, 在解构程序中将这些嵌入的类别一 <br>



       并解构目前我仅知的例外是在 DELPHI IDE 中, Delphi 为我们自动加入的 <br>

       TFromXXX 是个例外 <br>

       不知道其他网友对这个题目的看法如何? <br>

       实验的过程一并 post 如下: <br>

       [INLINE] 1. 新开一个 project <br>

       [INLINE] 2. 在 form1 中安置一个 button, 并为该按钮撰写事件处理程序 <br>

       [INLINE] 3. 实验的原始程式码: <br>

unit Unit1; <br>

  <br>

interface <br>

  <br>

uses <br>

  SysUtils, WinTypes, WinProcs, Messages, Classes, <br>

  Graphics, Controls,  Forms, Dialogs, StdCtrls; <br>

  <br>

type <br>

  TForm1 = class(TForm) <br>

    Button1: TButton; <br>

    procedure Button1Click(Sender: TObject); <br>

  private <br>

    { Private declarations } <br>

  public <br>

  public <br>

    { Public declarations } <br>

  end; <br>

  <br>

  (* 一个子类别 *) <br>

  TSubTest = Class(TObject) <br>

    private <br>

      iTest: integer; <br>

    public <br>

      constructor Create; <br>

  end; <br>

  <br>

  (* 一个测试用的简单类别 *) <br>

  TTest = class(TObject) <br>

    Circle: boolean; <br>

    ASubTest: TSubTest; <br>

  end; <br>

  <br>

var <br>

  Form1: TForm1; <br>

  <br>

implementation <br>

  <br>

  <br>

{$R *.DFM} <br>

  <br>

constructor TSubTest.Create; <br>

begin <br>

   inherited Create; <br>

   (* 在建构时显示一段测试资料 *) <br>

   (* 这样子我们可以清楚知道它建构了没 *) <br>

   MessageDlg('A TSubTest object created', mtInformation, <br>

     [mbOK], 0); <br>

end; <br>

  <br>

(* Button1 的 OnClick 事件 *) <br>

procedure TForm1.Button1Click(Sender: TObject); <br>

var <br>

  ATest: TTest; (* 一个指向 TTest 的参考 *) <br>

begin <br>

  ATest := TTest.Create;  (* 少了这列会产生 GP Error *) <br>

  (* 并没有出现 'A TSubTest object created' *) <br>

  (* 因此, 可推论该子类别尚未建构 *) <br>

  MessageDlg('Test Pause', mtInformation, [mbOK], 0); <br>

  ATest.Circle := True; <br>

  ATest.ASubTest := TSubTest.Create; (* 少了这列一样会产生 GP Error *) <br>



  ATest.ASubTest.iTest := 1; <br>

  ATest.Free; <br>

end; <br>

  <br>

end. <br>

  <br>

                                                           [返回文件开头] <br>

   ______________________________________________________________________ <br>

  <br>

   [INLINE]  秘密一旦公开了, 就不可能再是秘密了 <br>

  <br>

   请教一个有关delphi物件继承的问题: 我写了一个如下的程式 <br>

type <br>

        TMyObject=class(TObject) <br>

        private <br>

                i1:integer; <br>

        public <br>

                i2:integer; <br>

                procedure setvalue(i:integer);virtural; <br>

                function getvalue:integer;virtual; <br>

        end; <br>

  <br>

  <br>

        TMyObject2=class(TMyObject) <br>

        private <br>

                procedure setvalue(i:integer);override; <br>

                function getvalue:integer;override; <br>

        end; <br>

       以上两个定义都在同一个unit中,在另一个unit中 <br>

        procedure Tform2.Bbutton1Click(Sender:TObject); <br>

        var <br>

                MyObject:TMyObject2; <br>

        begin <br>

                MyObject:=TMyObject2.Create; <br>

                MyObject.setvalue(10); <br>

                MyObject.free; <br>

        end; <br>

       在上面程式中,虽然是不同unit为何能叫用到TMyObject2的private method, <br>

       难道是因为它是继承TMyObject的public method吗?如果是这样,请问该如何 <br>

       将一个public或published的method或property经过继承後,让它无法再使用 <br>

       呢? <br>

       [INLINE] <br>

       是的, 原因正如您所推论的, 想法没有错 <br>

       可是, 以我目前所知, Delphi 一个类别在继承自另一个类别时, 可以将父类 <br>

       别属於的 private 或protected 的部分公开出来, 但是如果已经是公开了, <br>



       就不能再重新定义成 private, 换句话说,在继承的过程中, 可以逐渐公开, <br>

       反之则不可以 <br>

       这就好像□密一样, □密一旦公开了, 就不可能再是□密了 <br>

       关於这部分, 您可以参考 Delphi 软体所附的Component Wirter's Guide 第 <br>

       三十三页 <br>

  <br>

                                                           [返回文件开头] <br>

   ______________________________________________________________________ <br>

  <br>

   [INLINE]  Sender 与 Typecasting <br>

  <br>

   在 Delphi1.0的user's guide 中 用到 Sender这个通用的prarmeter有时要用 <br>

       sender as ClassRef 的形式 有时只用Sender就可以, 如 <br>

with Sender as TButton do <br>

begin <br>

  Caption := '&Ok'; <br>

  OnClick := OkClick; <br>

end; <br>

  <br>

if Sender = Button1 then <br>

  AboutBox.Caption := 'About ' + Application.Title <br>

else AboutBox.Caption := ; <br>

.Caption := 'About ' + Application.Title <br>

else AboutBox.Caption := ; <br>

       也有人写成 <br>

case TButton(sender).Tag of <br>

       以上这三种形式到底适用在什麽情况下呢? <br>

       [INLINE] <br>

       这是个观念的问题, 我尝试解释看看, 不对与不足的地方还请其他网友不吝 <br>

       指正: <br>

       (Sender as TButton) 与 TButton(Sender) 都是 Typecasting,只是语法不 <br>

       同罢了, 因此, 写成 (Sender as TButton).Caption := 'Test';或者 <br>

       TButton(Sender).Caption := 'Test'; 结果都一样 <br>

  <br>

-- <br>

  <br>

                   快乐的海哥 <br>

  <br>

※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.5.44] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="3.htm">上一层</a>][<a href="28.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -