一个TCsdner类

s11ss 2009-11-18 10:52:39
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TCsdner = class(TObject)
private
FName: string;
FLevel: string;
FScore: Integer;
public
constructor Create(const AName: string; const ALevel: string = 'low'; const AScore: Integer = 0); virtual;
class function IsPureMan: Boolean;
procedure GiveScore(const AScore: Integer); virtual;
procedure RecvScore(const AScore: Integer); virtual;
published
property Score: Integer read FScore stored False default 0;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const
SCORE: Integer = 100;
var
LZ, Me: TCsdner;
begin
if TCsdner.IsPureMan then
ShowMessage('Pure Man!');
LZ := TCsdner.Create('LZ', 'high', 10000);
Me := TCsdner.Create('Me');
try
LZ.GiveScore(SCORE);
Me.RecvScore(SCORE);
ShowMessageFmt('LZ: %d; Me: %d', [LZ.Score, Me.Score]);
finally
Me.Free;
LZ.Free;
end;
ExitThread(0);
end;

{ TCsdner }

constructor TCsdner.Create(const AName, ALevel: string;
const AScore: Integer);
begin
FName := AName;
FLevel := ALevel;
FScore := AScore;
end;

class function TCsdner.IsPureMan: Boolean;
asm
MOV @Result, True
end;

procedure TCsdner.GiveScore(const AScore: Integer);
asm
SUB Self.FScore, EDX
end;

procedure TCsdner.RecvScore(const AScore: Integer);
asm
ADD Self.FScore, EDX
end;

end.

没事写着玩儿的
...全文
82 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
s11ss 2009-11-20
  • 打赏
  • 举报
回复
还有人发表高见吗:)
apilove 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 willflyz 的回复:]
学习,不过好像有点问题,执行了程序没有退出来。请教一下,在FormCreate里面为什么要用ExitThread(0)为什么不用Application.Terminate;还有MOV @Result, True;和MOV Result, True有什么区别。后面两句汇编SUB [EAX].FScore, EDX,ADD [EAX].FScore, EDX也可直接用[EAX]吧,看VCL里面的汇编好?-
[/Quote]
爱思考的人!
willflyz 2009-11-19
  • 打赏
  • 举报
回复
学习,不过好像有点问题,执行了程序没有退出来。请教一下,在FormCreate里面为什么要用ExitThread(0)为什么不用Application.Terminate;还有MOV @Result, True;和MOV Result, True有什么区别。后面两句汇编SUB [EAX].FScore, EDX,ADD [EAX].FScore, EDX也可直接用[EAX]吧,看VCL里面的汇编好象还少用self哦。
s11ss 2009-11-19
  • 打赏
  • 举报
回复
sf
s11ss 2009-11-19
  • 打赏
  • 举报
回复
竖个大拇哥:)
s11ss 2009-11-19
  • 打赏
  • 举报
回复
( )
_ _( )
(_ )
(_ )
(_ )
(_ _ )
willflyz 2009-11-19
  • 打赏
  • 举报
回复
呵呵,因为在类里面EAX存放的是类的基址就是self,所以类方法参数传递就是从EDX开始,如果你的方法定义在类以外的话就是EAX。至于FScore不能访问也是和在类里面定义有关,因为要根据类的基址(self)在这个变量的偏移地址才能访问到,如果定义在类外面的全局变量就可以直接访问。ExitThread是用在线程里面的,用你的代码在D7里面测试一下退出不出来,程序还在进程里面。你用这个似乎不太合适吧。
s11ss 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 willflyz 的回复:]
学习,不过好像有点问题,执行了程序没有退出来。请教一下,在FormCreate里面为什么要用ExitThread(0)为什么不用Application.Terminate;还有MOV @Result, True;和MOV Result, True有什么区别。后面两句汇编SUB [EAX].FScore, EDX,ADD [EAX].FScore, EDX也可直接用[EAX]吧,看VCL里面的汇编好?-
[/Quote]
1、使用ExitThread(0), 线程退出时,如果没有其他线程了,就退出进程(我这里测试是退出的)
2、Result 和 @Result 区别我也不太明白,内嵌汇编里就用 @Result ?
3、后面两句汇编中的Self确实可以用[EAX],但不知道原因……原来两句中的Self是我试验出来的,EDX是看CPU窗口才改的,原来我写的类似这样:ADD FScore, EAX。因为当时我想,FScore就是个私有成员,不需要Self来引用;还有函数的第一个参数是EAX吧,EDX不是第二个参数吗?

请大虾解惑!

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧