📄 27.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 + -