直接修改 TForm 的源代码的问题,200分!! (200分)

  • 主题发起人 主题发起人 lccc
  • 开始时间 开始时间
L

lccc

Unregistered / Unconfirmed
GUEST, unregistred user!
我希望窗体的最大、最小按钮、关闭按钮一直存在,而不是成为对话框形式,
所以我直接在TForm的定义中增加五个属性,代码如下:

TForm = class(TCustomForm)
private
....
//以下是自动生成的
procedure SetCanClose(const Value: Boolean);
procedure SetCanMax(const Value: Boolean);
procedure SetCanMin(const Value: Boolean);
procedure SetCanMove(const Value: Boolean);
procedure SetCanReSize(const Value: Boolean);
protected
...
//以下是拦截菜单命令的消息处理方法:
procedure WMSysCommand(var Message: TWMSysCommand);message wm_SysCommand;
public
constructor Create(AOwner:Tcomponent);override;
...
published
....
//以下是自己定义的属性:
//CanClose:允许关闭;Canmax:允许最大化;
//CanMin允许最小化;CanMove:允许移动;
//CanReSize:允许改变大小;
property CanClose:Boolean read FCanClose write SetCanClose Default True;
property CanMax:Boolean read FCanMax write SetCanMax Default True;
property CanMin:Boolean read FCanMin write SetCanMin Default True;
property CanMove:Boolean read FCanMove write SetCanMove Default True;
property CanReSize:Boolean read FCanReSize write SetCanReSize Default True;
...
end;

实现部分:
constructor TForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanClose:=True;//设置五个属性的默认值。
FCanMax:=True;
FCanMin:=True;
FCanMove:=True;
FCanReSize:=True;
end;

procedure TForm.WMSysCommand(var Message: TWMSysCommand);
begin
case Message.CmdType of
SC_CLOSE://处理关闭系统事件
if CanClose then
inherited
else
Abort;
SC_MAXIMIZE://处理最大化系统事件
if CanMax then
inherited
else
Abort;
SC_MINIMIZE://处理最小化系统事件
if CanMin then
inherited
else
Abort;
SC_MOVE://处理移动系统事件
if CanMove then
inherited
else
Abort;
SC_SIZE://处理尺寸改变系统事件
if CanReSize then
inherited
else
Abort;
else
inherited;
end;
end;
结果:设置CanClose、CanMax、CanMin为 False 能禁止关闭、最大化、最小化,
但设置CanResize和CanMove=False 却不能禁止改变大小和移动!
另外,为什么这些属性不出现在属性监视器上?

请高手指教!
 
把那句
case Message.CmdType of
改成
case Message.CmdType and $FFF0 of
试试看。
 
SC_MOVE和SC_SIZE是相应系统右键菜单(在标题栏点右键)中的"移动"和"大小"这两个
菜单项的,所以你直接移动窗体和改变窗体大小并不能触发WM_SYSCOMMAND消息.
如果要禁止移动和改变大小的话,可以用WM_MOVING和WM_SIZING消息来控制
 
谢谢!
那么,如何让这些属性出现在监视器上面呢?
 
>>如何让这些属性出现在监视器上面呢?
你应该另建一个pas文件,然后在这个文件里这样写—
TMyForm = class(TCustomForm)
//下面加入你的代码
...
然后把你的.pas文件作为一个component文件安装到一个包里,这样myform控件的新增属性
就会出现在Object Inspector里。
实际上你也可以通过重新编译Delphi的某个默认包来实现同样的目的,但是borland
好像并不同意这么做——大部分的默认包是不能够重新编译的。
 
谢谢各位!这几天上网比较难,未能及时答复,请原谅!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
527
import
I
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
625
import
I
I
回复
0
查看
632
import
I
后退
顶部