类的问题:东东该放哪里?(200分)

  • 主题发起人 主题发起人 archy
  • 开始时间 开始时间
A

archy

Unregistered / Unconfirmed
GUEST, unregistred user!
遍一个加密程序,主要用到
主窗体Unit frmMain,排序Unit sort.

排序Unit sort
以下皆只列出主要代码
Unit sort;

interface

type
rcdtype=record
key:char;
data:array [1..maxsize] of char;
end;
listtype=array [0..maxKey] of rcdtype;

Tsort = class
public
procedure binsort(var r:array of rcdtype
pwl:integer);

end;

implementation
.......
.......


一开始我在frmMain中这样封装
uses sort;

type
TfrmMain = class(TForm)
GroupBox1: TGroupBox;
Memo1: TMemo;
btnOpen1: TSpeedButton;
cmb1: TComboBox;
....
procedure btnOpen1Click(Sender: TObject);
procedure btnOpen2Click(Sender: TObject);
....
procedure Jiami1(mm:Tstrings);
private
//********
sort:Tsort;
//********
var
frmMain: TfrmMain;
filename:string;

implementation

procedure TfrmMain.Jiami1(mm:Tstrings);
{.......
其中我用到了sort排序
sort:=tsort.Create;
sort.binsort(r,pwl)
// r为数组记录,pwl为关键字
sort.free;
......}
***************************************8
之所以我将sort:Tsort放在private中是因为这样sort可以在TrmMain的所有子过程中被使用,不用再sort前加frmMain.那么累赘了。而且今后可以使用其他更好的排序算法。程序是完全成功通过的。


可是后来我觉得应该把加密子过程procedure Jiami1(mm:Tstrings)也分出来,更能符合模块化和封装的思想,于是程序变成了三块:主窗体Unit frmMain,各种加密方法Unit codeOperation,和排序Unit sort.
我这样封装
unit codeOperation;

interface
uses sort;
....

type
TcodeOperation = class
private
sort:Tsort;
public
procedure Jiami1(mm:Tmemo;password:string;Var mmTarget:Tmemo);

end;

implementation

procedure TcodeOperation.Jiami1(mm: Tmemo
password: string;Var mmTarget:Tmemo);
{....
其中用到了sort排序
sort:=tsort.Create;
sort.binsort(r,pwl);
sort.free;
.....}

*******************************************
unit frmMain;

interface

uses codeOperation;

type
TfrmMain = class(TForm)
....
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Memo1: TMemo;
Memo2: TMemo;
procedure btnCloseClick(Sender: TObject);
...
procedure btnJiamiClick(Sender: TObject);
private
{ Private declarations }
code:TcodeOperation;
public

end;

var
frmMain: TfrmMain;
filename:string;

implementation

procedure TfrmMain.btnJiamiClick(Sender: TObject);
begin
code.jiami1(memo1,txt1.text,memo2)
//memo1原文,txt1.text密钥,memo2密文
end;

可是为何现在一运行到sort.binsort(r,pwl);就发生错误呢?
另:1 我这样的封装思想对吗?
2 象我这样uses 就不能放在implementation中了?

谢谢!!
 
Object Pascal 中,声明一个类时缺省的父类是 TObject,所以
你的 TSort 和 TCodeOperation 的父类是 TObject, 对于它们的对象实例
都必须显式地创建,因此,必需 Code := TCodeOperation.Create 后才能
调用 code.jiami1(memo1,txt1.text,memo2)

另:1 我想是对的,将相对独立,可重用的部分分离出来;
2 对,不能。因为类的声明中用到 TCodeOperation,要在 interface 部分的
uses 子句中引用。
 
接受答案了.
 
后退
顶部