当前位置:主页>仓库管理软件> 列表

300分求解!

进销存管理软件版1楼: 如何将一个类分成几层?像ADOQuery1.sql.text这样用点号相隔!
var
A:TA; //已知有一个类TA
begin
A.string:=''111''; //TA类有一个string属性可以读入字符串
A.B.addstring;
//addstring是一个方法,写法跟ADOQuery1.sql.text相似,做成分层的效果
// 执行完addstring方法后,会将A.string属性加上''abc'',即执行完后,
// A.string=''111abc''
end;

2楼: type
TMyClass = class
private
FList: TList;
public
property List: TList read FList write FList;
end;
TMyClass2 = class
private
FMyClass: TMyClass;
public
property MyClass: TMyClass read FMyClass write FMyClass;
end;

myclass2 := TMyclass2.Create;
myclass2.myclass.list.add(''string1'');
..... 如易语言进销存

3楼: 楼上的说的 对,我就不说了

4楼: 你的类里面不会只包含变量吧?

5楼: 类继承类

6楼: to zqw0117:
按我的要求,再用你的写法,TMyClass2还应该有一个字符串属性,
执行这个方法后myclass2.myclass.list.add(''string1'');会修改这个属性
myclass2.属性,
这个属性在第二层,而zqw0117修改的List属性在第三层
问题的难度就在这里

进销存管理软件版7楼: // 执行完addstring方法后,会将A.string属性加上''abc'',即执行完后,
以上说法可能有问题,哪有父类对象执行来影响子类属性的?

8楼: to chnplzh:
哈哈,我都觉得有点问题,但有没有其它办法可以做到呢,或者子层不用类的方法

9楼: 其实就是使用了这个类来封装的: TStringList
TA = class(TObject)
private
FStrings: TStrings;
function GetString: TStrings;
procedure SetString(const Value: TStrings);
public

published
property MyString: TStrings read GetString write SetString;
end;

procedure TA.SetString(const Value: TStrings);
begin
FStrings.Assign(Value);
end;

function TA.GetString: TStrings;
begin
Result := FStrings;
end;
//你照着下面写不就可以了吗
//下面是TADOQuery
TADOQuery = class(TCustomADODataSet)
private
FSQL: TStrings;
FRowsAffected: Integer;
function GetSQL: TStrings;
procedure SetSQL(const Value: TStrings);
protected
procedure QueryChanged(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function ExecSQL: Integer; {for TQuery compatibility}
property RowsAffected: Integer read FRowsAffected;
published
property CommandTimeout;
property DataSource;
property EnableBCD;
property ParamCheck;
property Parameters;
property Prepared;
property SQL: TStrings read GetSQL write SetSQL;
end;

10楼: 可以定义一个类的属性和方法,要引用属性和方法就用A.string
属性里面如果包含另外的类类型如(TB)
则在创建对象A的时候就创建了对象B,要改变B的属性就要用A.B.string;
在创建B的时候把A的string属性地址传给B就应该可以实现你要的

11楼: to kk2000:
上面的写法,我已经看过了,并写好了,
但最难的地方是要用第三层的方法修改第二层的属性
这点chnplzh已经看到了



to wanshi131:
具体些,听上去好似行

12楼: 修改第三层的方法,让他的参数为指针类型,然后把第二层的属性传给第三层的方法 如用友软件销售技巧

13楼: 咳,先去看看面向对像的基础知识吧、

进销存管理软件版14楼: //类A
TB = class; //前置类
TA = class(TComponent)
private
FString: String;
FTB: TB;
function GetString: String;
procedure SetString(const Value: String);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property MyString: String read GetString write SetString;
property B: TB read FTB ;
end;

constructor TA.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTB := TB.Create;
end;
destructor Destroy; override;
begin
inherited ;
FTB.free;
end;
procedure TA.SetString(const Value: String);
begin
FString := Value;


end;
function TA.GetString: String;
begin
Result := FString ;
if FTB.GetText <> '''' then Result := Result + FTB.GetText ;
end;

//类B
TB = class(TObject)
private
FStrings: TStrings;
function GetString: TStrings;
procedure SetString(const Value: TStrings);
function GetText: String;
public
published
property AddString: TStrings read GetString write SetString;
end;
procedure TB.SetString(const Value: TStrings);
begin
FStrings.Assign(Value);
end;
function TB.GetString: TStrings;
begin
Result := FStrings;
end;
function GetText: String;
begin
result := FStrings.Text;
end;
//剩下的自己改改啊.

15楼: to kk2000:
AddString是一个方法或过程,而不是属性
执行A.B.AddString;后自动修改MyString属性

16楼: published
property AddString: TStrings read GetString write SetString;
你修成一个方法不就可以了!

public
procedure AddAddString(AStr: String = '''');

procedure TB.AddAddString(AStr: String );
begin
FStrings.Add(AStr);
end;

17楼: 值得注意,分层引起接口一定性的交集,使用不慎将产生不良设计

18楼: to kk2000:
我要更改的是TA类的MyString,不是TB类的FString

19楼: //这个就是修改MyString 字符了
function TA.GetString: String;
begin
Result := FString ;
if FTB.GetText <> '''' then Result := Result + FTB.GetText ;
end;

20楼: 感觉一般类能够到4层,类A.成员B.属性C.方法D
子类继承到是可以分得更多。

进销存管理软件版21楼: to kk2000:
好乱,我要花时间整理再试试,没有问题会开贴派分.

22楼: 呵呵 如傻瓜进销存注册码

23楼: to xfz8124:
说来听听,分享一下

24楼: to kk2000:
有问题!你的方法是TB类先修改本类的属性,然后TA类读属性时再读取刚才修改的TB类属性,但我是多个类都要修改TA类的属性的,读取的时候怎么知道要读取那个类的属性,和读哪个类的属性先?

25楼: to 饭前饭后
在那个类中SQL如果不是一个类对象,那么就是一个结构体,就是先定义一个结构体这样呢结构体套结构体可以实现无数层。下面我给你个例子,属性里面用了结构体的,而应用了其他类的就不说了,前面都有。
[:D][:D]
unit Aunit;
interface
Type
//结构体1
property1=^Tproperty1;
Tproperty1=record
XString:TString;
end;
//结构体2
property21=^Tproperty21;
Tproperty21=record
Xproperty:Property1;//注意此处调用了结构体property1
end;
//结构体3
property321=^Tproperty321;
Tproperty321=record
Yproperty:Property21;//注意此处调用了结构体property21
end;
//下面定义一个类
TTest=Class(TObject)
XYproperty:property321;//此处设置一个结构体property321的变量
private
public
constructor Create;
destructor Destroy; override;
///////////////......................
end;

......................
//这里假设一个函数处理了类的参数
Test1:=TTest.create;
Test1.XYproperty.Yproperty.Xproperty.XString:=''haha[:D]'';//看是不是分层了?
......................

如果定义N个结构体依次套用,那么N+1层属性的调用[:D],N>0;N->无穷,哈哈,可惜内存不够啊,如果你要多层嵌套应用方法也可以就是 把 若干个类和结构体相互套用,哈就OK了。个人感觉结构体在这里很类似于一个简单的类。


[8D][8D]有空交流一下我的msn:mazhanyin@hotmail.com

26楼: 我是不是写错了阿!

27楼: 也许我没有理解你的意图!

进销存管理软件版28楼: to seekmzy:
你又何必担心,先看看我的提问记录,我也不是骗答案的人吧.
300分算什么,试过无问题就开贴派分呀.

29楼: [^]我好像搞错了 完了菜鸟的自尊心都没了 楼住虽然错了 要给点苦劳费阿

30楼: 有类A和类B,如果类A的实例是类B的public成员变量,就可以实现楼主的愿望。当然,必须在类B的create中创建类A的实例。

31楼: 有那么复杂吗?
将TB设成带 Owner的就可以了。
TB = class
private
FOwner: TA;
public
constructor Create(AOwner: TA);
procedure AddString;
end;

constructor TB.Create;
begin
FOwner := AOwner;
end;

procedure TB.AddString;
begin
FOwner.Sring := FOwner.String + ''abc'';
end;

在 TA 中直接调用就可以了
TA = class(TComponent)
private
FTB: TB;
FString: String;
public
constructor Create(AOwner: TComponent); override;
property B: TB read FTB ;
published
property String: String read FString write FString;
end;

constructor TA.Create;
begin
inherited;
FTB := TB.Create(Self);
end;

32楼: 单纯的子集类修改父集类字段的做法是不可取的,除非是java中的内部类
type
TB=class
private
FString:string;
public
procedure addstring;
property Text :string read FString write FString;
end;
TA=class
private
B:TB;
procedure SetString(Value:string);
function GetString: string;
public
constructor Create;
destructor Destroy; override;
property Text:string read GetString write SetString;
end;

{ TB }

procedure TB.addstring;
begin
FString:=FString+''abc'';
end;

{ TA }

constructor TA.Create;
begin
B:=TB.Create;
end;

destructor TA.Destroy;
begin
B.Free;
inherited;
end;

function TA.GetString: string;
begin
Result:=B.Text;
end;

procedure TA.SetString(Value: string);
begin
if B.Text<> Value then
B.Text :=Value;
end;

33楼: to wrl_001
也没人说用 单纯的子集类修改父集类字段 阿
还有你的代码 前面已经有很多了 饭前饭后也说了这样类的互相套用不符合这样的意思

[:D]用结构体还是最合适的

34楼: 谢谢大家的帮忙,上面的方法还是不太合适
wanshi131说可以用指针的方法来实现
有没有办法通过指针的方法来实现呢?
我要具体方法

进销存管理软件版35楼: 结构体只是实现了套用,它并没有修改类中的string字段值.就单纯实现"点号相隔"有必要吗?
如果一定要求父集类不包含String字段的话我想jeffrey_s的方法最可行了.但是在类似于我写的代码中对于外部程序Text就是一个String,你可以给它赋值,或取得它的值.而不需要管它是怎么操作的.

36楼: //来自:wrl_001, 时间:2005-10-12 11:10:16, ID:3234773
//单纯的子集类修改父集类字段的做法是不可取的,除非是java中的内部类

TA 和 TB 不可以称为 父类、子类,而应该 叫主类 和 引用类。
引用类可以用来修改主类的方法。还可以是复数个主类的情况。
就Delphi来说,就是利用 Action 去控制个组件 Caption,Enable,Checked等情况的。
不过这也算复杂情况。多个 TA实例 只拥有 一个 TB实例,有 TB去控制 这些 TA的部分特征。这个实现起来就有点难度。

不过也有简单的情况,就是 每个 TA都有且只有 自己的一个TB私有实例,就好象类似 TLabeledEdit 类的情况,那么就可以简单的将 TB的创建等 都交给 TA,至于例子上面有提到,不再重写了。

按个人理解,用简单的情况写就可以了。或者干脆不要 TB,在TA直接实现方法也可以。

37楼: 有没有办法通过指针的方法来实现呢?
我要具体方法

38楼: jeffrey_s: 子集类,父集类和父类,子类的叫法是有区别的哦,当然我是想不出主类和引用类,嘻嘻
不明白饭前饭后你实现过程中有什么特殊的要求,否则前面的方法中不都可以实现你的要求了吗?
1.引用类中直接修改主类的字段值
2.主类在读取字段值的时候通过函数读取引用类的值.

39楼: to zqw0117:
按我的要求,再用你的写法,TMyClass2还应该有一个字符串属性,
执行这个方法后myclass2.myclass.list.add(''string1'');会修改这个属性
myclass2.属性,
这个属性在第二层,而zqw0117修改的List属性在第三层
问题的难度就在这里


==================================================================
你的严重问题在于,修改了List.AddString后,你希望同步修改mycalss2的某个属性,你想法是颠倒的!
你的myclass2比如有个substring的属性对把?给它一个读写方法,分别读取list.add添加 的字符啊!?难道这样不就解决问题了?
type
tmyclass2=class
private
FList: TList;
function GetSubString: string;
public
property SubString: string read GetSubString;
end;

function tmyclass2.getsubstring: string;
begin
Result := Trim(FList.Text);
///做你想做的任何事情
end;

40楼: 或者,你给你的FList增加一个OnChange事件,并且在tmyclass2里面手工添加事件处理方法,在事件里面改你的tmyclass2里面的某个变量啊!这都是很基础的!建议楼主先好好看看面向对象编程方面的学习材料。

41楼: 另外还有个办法
类互相引用
type
tmyclass2=class; //前置声明
tmyclass1=class
private
fmyclass2: tmyclass2;
fstring: string;
public
constructor create;
end;
tmyclass2=class
private
fclass1: tmyclass1;
procedure AddStr(S:string);
constructor create(ownerclass: tmyclass1);
end;

constructor tmyclass1.create;
begin
inherited
fclass2: tmyclass2.create(self);
end;

constructor tmyclass2.create(ownerclass: tmyclass1);
begin
inherited;
fclass1:=ownerclass;
end;

procedure tmyclass2.AddStr(S:string);
begin
fclass1.fstring := fclass1.fstring + s;
end;

进销存管理软件版42楼: 上面修改了下

43楼: to 饭前饭后
难道结构体里面用的不是指针吗??????
[:D]我是用结构体,delphi结构体里就是用的是指针阿
下面这个代码能够直接运行
unit Aunit;

interface
Type
//结构体1
property1=^Tproperty1;//指针
Tproperty1=record
XString:String;
end;
//结构体2
property21=^Tproperty21;//指针
Tproperty21=record
Xproperty:Property1;//注意此处调用了结构体property1
end;
//结构体3
property321=^Tproperty321;//指针
Tproperty321=record
Yproperty:Property21;//注意此处调用了结构体property21
end;
//下面定义类
TTest=Class(TObject)
private
public
XYproperty:property321;//此处设置一个结构体property321的变量
constructor Create;
destructor Destroy;
///////////////......................


end;
procedure TestFun;
implementation

constructor TTest.Create;
begin
//.........
end;

destructor TTest.Destroy;
begin
//............
end;

procedure TestFun;
var Test1:TTest;
begin
Test1:=TTest.create;
//饭前饭后看下面这句.是不是符合你的意思啊,这可是用结构体实现的,也就是你说的指针实现的
Test1.XYproperty.Yproperty.Xproperty.XString:=''符合你的意思'';
end;

end.

44楼: to seekmzy
1.你这是为指针而指针
2.addstring是一个过程
3.TTest还应该有个string字段,那么你如何同步修改它的值,难不成:
Test1.XYproperty.Yproperty.Xproperty.XString:=''符合你的意思'';
Test1.string:=''符合你的意思'';

45楼: 郁闷我都不明白在讨论什么了!!!!!!。。。。。。。。

46楼: 接受答案了.