函数中如何访问类的实例 ( 积分: 100 )

  • 主题发起人 主题发起人 hesc
  • 开始时间 开始时间
H

hesc

Unregistered / Unconfirmed
GUEST, unregistred user!
type
Ta=Class(Txx)
public
procedure b;
...

function a(x:integer):String
begin
这里如何访问b方法,未创建Ta类的实例前
end;
 
function a(x:integer):String
begin
// 这里如何访问b方法,未创建Ta类的实例前
with Ta.Create do
b;
end;
 
如果实例已经创建了,并不在函数里创建的呢?
 
实例名称是由程序动态生成的呢?
 
程序动态生成的名字.b
 
同意楼上..
 
实例创建以后,可以直接在函数内使用啊,比如:
procedure CompileStatus(const AStatus: PChar);
begin
if form1.GroupBox3.Visible then
begin
form1.GroupBox3.Caption:= AStatus;
form1.GroupBox3.Update;
end;

end;

只要实例名称是你可以访问到的,就可以直接使用。因为,实例创建后就是一块内存而已。
实例名称是指向这块内存的指针。
 
可以先创建实例,访问其方法之后,立即释放.
 
多谢各位的回答,但是问题还没有解决,
type
Ta=Class(Txx)
public
procedure b;
...
--全局函数
function a(x:integer):String
begin
这里如何访问b方法,未创建Ta类的实例前,不知道实例名称,
end;
 
楼主需要的不会是在没创建实例时就能访问的类方法吧?

unit Unit1;

interface

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

type
Ta = class
public
class procedure b;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ Ta }

class procedure Ta.b;
begin
ShowMessage(ClassName)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Ta.b
end;

end.
 
这个东西很简单~只要修改一下那个函数就行了~~增加一个参数
function a(x:integer;obj:ta):String
这样不就行了~调用的时候把实例对象传过去。
 
lz应该是那个什么群里问的那个问题吧。
ls这样说没用,早在群里回答过了,看来他不懂是什么意思。
这个设计看起来本身也是错误的,就算实现了也没意义。
 
方法只是类的一部分,如果这个方法是一个通用函数,没有对类的专有域进行读写,那么没创建这个类之前也能调用其方法的。
如果类的方法涉及到对类专有区域的读写操作,那么在调用此方法前必须创建类实例。否则你会收到非法内存访问的消息,当然,类的create方法例外[:D]。
 
TO:ufo
没有对类的专有域进行读写,如何调用此方法?
 
不知各位对LUA有没有研究,我这个问题是为了解决LUA里面的一个函数变量来设计的,类已经写好了,function a将来会传给LUA里面的函数变量luaregister(L,'a',a);此函数变量定义为 lua_CFunction = function (L: Plua_State): Integer
cdecl;
我要在function a里面调用类里的方法,达到脚本功能.
 
在家看看以下代码就明白了.
TNpc = class
l: p_lua_state

FileName : string;
public
constructor Create(sName:string);
destructor Destroy;
procedure Initialize();
procedure run();
function a(x:integer):String
end;

function TNpc.a(x:integer):String
begin
showmessage('avc')
end;

function lua_Num(l: p_lua_state): integer
cdecl;
begin
--要在此调用TNPC类的函数a ,如何调用??
lua_pushnumber(l,30)
//返回值30压栈
result := 1
//定义返回参数的数量并不是具体值,此时为1 个
end;

constructor TNpc.Create(sName:string)

begin
FileName := sName;
l := lua_open()

lua_baselibopen(l);// LUA 内嵌 BASE 库
end;
destructor TNpc.Destroy;
begin
lua_close(l);
end;
procedure TNpc.Initialize();
begin
lua_register(l, 'Num', lua_Num)
//将主程序中的lua_Num函数注册到引擎中,让脚本用Num来调用
luaL_loadfile(l, Pchar(FileName))
//加载脚本
end;

procedure TNpc.run();
begin
lua_resume(L,0)
//脚本使用luaL_loadfile加载时要用lua_resume来返回运行.
lua_getglobal(L, 'add')
//掉用脚本中函数的名称
lua_pushnumber(L, 100)
//将脚本中add函数使用的参数压栈
lua_pcall(L, 1, 1,0)
//调用函数,有一个参数,一个返回值
Form1.Memo1.Lines.Add(lua_tostring(L,1));//返回的参数
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if npc1 <> nil then npc1.Destroy
//防止内存占用
npc1 := TNpc.Create('npc1.lua')
//创建时传入脚本文件名
npc1.Initialize
//初始化
npc1.run
//运行
end;




function a(x:integer):String
begin
这里如何访问b方法,未创建Ta类的实例前
end;
 
引用含有ta的单元后直接调用:Ta.b
正常情况下是 ta实例名.b这样引用。
不过,楼主这样设计,那何必把b函数做到类里面?搞个公共函数单元也行啊。
 
TNpc = class
l: p_lua_state

FileName : string;
public
constructor Create(sName:string);
destructor Destroy;
procedure Initialize();
procedure run();
class function a(x:integer):String
end;

class function TNpc.a(x:integer):String
begin
showmessage('avc')
end;

function lua_Num(l: p_lua_state): integer
cdecl;
begin
TNPC.a(0);--要在此调用TNPC类的函数a ,如何调用??
lua_pushnumber(l,30)
//返回值30压栈
result := 1
//定义返回参数的数量并不是具体值,此时为1 个
end;

constructor TNpc.Create(sName:string)

begin
FileName := sName;
l := lua_open()

lua_baselibopen(l);// LUA 内嵌 BASE 库
end;
destructor TNpc.Destroy;
begin
lua_close(l);
end;
procedure TNpc.Initialize();
begin
lua_register(l, 'Num', lua_Num)
//将主程序中的lua_Num函数注册到引擎中,让脚本用Num来调用
luaL_loadfile(l, Pchar(FileName))
//加载脚本
end;

procedure TNpc.run();
begin
lua_resume(L,0)
//脚本使用luaL_loadfile加载时要用lua_resume来返回运行.
lua_getglobal(L, 'add')
//掉用脚本中函数的名称
lua_pushnumber(L, 100)
//将脚本中add函数使用的参数压栈
lua_pcall(L, 1, 1,0)
//调用函数,有一个参数,一个返回值
Form1.Memo1.Lines.Add(lua_tostring(L,1));//返回的参数
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if npc1 <> nil then npc1.Destroy
//防止内存占用
npc1 := TNpc.Create('npc1.lua')
//创建时传入脚本文件名
npc1.Initialize
//初始化
npc1.run
//运行
end;
 
to LeeChange
TNPC.a(0);
这样也能调用???

to ufo
类不是我设计的,不想修改类,如果改类的话会影响很多地方。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部