自定义组件的时候,如何实现一个应用程序只能有一个对象?(100分)

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

autumn

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,我只能实现一个窗口(TForm)里只有一个TPrivile对象。
怎么样才能实现多个窗口下只要有一个窗口有TPrivile我就不能再创建多一个呢。

constructor TPrivile.Create(AOwner: TComponent);
var
i:integer;
begin
//一个应用程序只能创建一个TPrivile对象
for i:=0 to AOwner.ComponentCount-1 do
begin
if AOwner.Components is TPrivile then
raise exception.Create(cOnlyAPrivile);
end;

inherited;
end;
 
在单元的initialization里做标志,或者用全局原子表保存已创建的实例,然后
检测
 
这事要用Addatom和FindAtom和DeleteAtom,API解决比较好。
 
如果你不是单实例应用程序的话最好不要用全局原子,
 
TPrivile=class(TCOmponent)
我要安装到IDE中的
 
以下代码在当前工程中查找一个TPrivile,多窗体也能查到,你改一下就行
procedure TForm1.Button1Click(Sender: TObject);
var i, j : Integer;
CurrForm : TForm;
begin
for i := 0 to Application.ComponentCount - 1 do
if Application.Components is TForm then begin
CurrForm := Application.Components as TForm;
for j := 0 to CurrForm.ComponentCount - 1 do
if CurrForm.Components[j] is TPanel then begin
ShowMessage('OK');
end;
end;
end;

 
crystal:
在ide中是不行的
 
抱歉抱歉,没看清楚,用原子表吧
 
请教:啥为原子表?
 
如果不安装到IDE中的话,可以这样做:
TPrivile=Class(TComponent)
private...
end;

var
PriIns:TPrivile;

initialization
PriIns:=TPrivile.Create(nil);
priIns...:=...//设置属性
finalization
Priins.free;
end.
以后需要使用Uses一下这个单元,不要再创建实例就可以了。
 
原子表是:
In Microsoft Windows an atom table is a system-defined table that stores
strings and corresponding identifiers. An application places a string in
an atom table and receives a 16-bit integer, called an atom, that can be
used to access the string. A string that has been placed in an atom table
is called an atom name.

你看一下Win32 Developer's Reference吧,查楼上几位说的几个函数有解释的,或者
看MSDN也行
 
你可以用类方法去检测对象创建的个数,然后在程序中判断是否要立即释放刚创建的对象,
如果不想在程序中控制,也可由类自己控制,你也可以在创建对象时直接释放掉,这样,类
就可以自己控制创建的个数了,源码附上:

unit Unit3;

interface

type
tmm= class
private
public
class function Count():integer;
procedure AfterConstruction;override;
Constructor Create;
Destructor Destroy;override;
end;

implementation

var
FCount:integer;

{ tmm }

class function tmm.Count: integer;
begin
Result :=FCount;
end;

procedure tmm.AfterConstruction;
begin
inherited;
if FCount>1 then
Free
else
FCount:=1;
end;

constructor tmm.Create;
begin
inc(FCount);
// 初始化
end;

destructor tmm.Destroy;
begin
dec(FCount);
inherited;
end;

end.

这个方法我没有在ide中试验过,麻烦你试一下,把结果也贴出来。
 
我使用了类是wddelphi的方法:
implementation

var
FCount:integer;

constructor tmm.Create;
begin
inc(FCount);
if FCount>1 then
raise exception
// 初始化
end;

destructor tmm.Destroy;
begin
dec(FCount);
inherited;
end;

 
多人接受答案了。
 

Similar threads

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