关于锁定系统口,和treeview的onclick事件的问题!

cdsun 2003-09-25 05:22:45
问题如下:
1、我自己做了一个小小软件,其中有一个功能是锁定系统。
按钮选中之后就会弹出一个模态对话框,方便用户登陆,如果登陆不成功当然不能进入系统。不过我发现有个问题,就是如果我不登陆直接alt+f4就可以关闭这个窗口。就可以直接用了。不知道这个问题怎么解决。各位指点一下。

2、因为我对delphi不是很熟悉,用了treeview一时又找不到教程。
我想问问在treeview里面添加了节点之后,如何对每个节点进行onclick事件的添加。

问题就是这些,应该不难,因为小弟的分不多,所以先发50分,如果解决另外再送50分。

希望大家帮帮忙。我的QQ86777770
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
thaoqi 2003-09-26
  • 打赏
  • 举报
回复
TTreeView有个重要的属性 可以帮助你
1. Selected 会返回给你一个TTreeNode的结构给你 这个结构就是你触发OnClick事件所选择的节点
下面是TTreeNode的属性
1. HasChildren 会返回一个boole型的变量 显示你所指定的节点下面是否有子节点
2. HasAsParent(Value: TTreeNode) 会返回一个boole型的变量 显示你指定的节点是否属于某个根节点

给你一段我写的代码好了
procedure TfrmMain.tvNetWorkGroupClick(Sender: TObject);
var
tnFatherNode : TTreeNode;
tnSelectNode : TTreeNode;
slServerList : TStringList;
liTmpItem : TListItem;
i, j : integer;
begin
slServerList := TStringList.Create;

Panel5.Caption := '网络逻辑分组以及工作站情况列表';

lvClientInfo.Items.Clear;

tnFatherNode := tvNetWorkGroup.Items[0];
tnSelectNode := tvNetWorkGroup.Selected;

if tnFatherNode = tnSelectNode then
begin
//如果不能列举出任何的工作组(列举失败)退出
if not GetServerList(slServerList) then
Exit;

//检查列表中分组信息是否为空或者现有网络逻辑分组是否更新过
if (tvNetWorkGroup.Items.Count=1) or
(slServerList.Count <> tnFatherNode.Count) then
begin
//列表框的刷新过程
tnFatherNode.DeleteChildren;
for i := 0 to slServerList.Count-1 do
tvNetWorkGroup.Items.AddChild(tnFatherNode,slServerList.Strings[i]);
end;

//为TListView添加逻辑分组信息
for i:= 0 to slServerList.Count-1 do
begin
liTmpItem := lvClientInfo.Items.Add;
liTmpItem.Caption := slServerList.Strings[i];
liTmpItem.ImageIndex:=1;

for j := 0 to 7 do
begin
if j = 1 then
liTmpItem.SubItems.Append('网络逻辑工作组');
liTmpItem.SubItems.Append('');
end;
end;
end
else
begin
MessageBox(self.Handle, PChar('系统正在查找工作组中的计算机,请稍候...'),
PChar('系统提示'), MB_OK or MB_ICONINFORMATION);

lvClientInfo.Cursor := crHourGlass;
tvNetWorkGroup.Cursor := crHourGlass;

//如果没有列举出任何计算机信息(列举失败)退出
if not GetUsers(tnSelectNode.Text, slServerList) then
Exit;

lvClientInfo.Cursor := crDefault;
tvNetWorkGroup.Cursor := crHandPoint;

//为TListView添加计算机信息
for i:= 0 to slServerList.Count-1 do
begin
liTmpItem := lvClientInfo.Items.Add;
liTmpItem.Caption := slServerList.Strings[i];
liTmpItem.ImageIndex:=2;

for j := 0 to 7 do
liTmpItem.SubItems.Append('情况未知');
end;
end;

slServerList.Destroy;
end;

希望你能看懂
FrameSniper 2003-09-26
  • 打赏
  • 举报
回复
To THaoQi

对,是可以使用OnCloseQuery,但偶一般不用,麻烦!

To CDSun

假设你现在已经在你的TreeView里面创建了一系列的TreeNode

这个时候你在TreeView上点鼠标,点后TreeView.Selected里面存放的就是你创建的当前被点选择的TreeNode的引用指针,明白?
cdsun 2003-09-26
  • 打赏
  • 举报
回复
第二个能不能给个例子?
thaoqi 2003-09-26
  • 打赏
  • 举报
回复
一楼老兄的方法是一个比较恶劣了点 但是比较简单
其实你可以申明一个全局的私有变量
private
{ Private declarations }
bLogin : Boolean;

窗体创建的时候将这个变量设置为False
bLogin : =False
在你的密码输入成功以后 你在将这个变量置为True
然后你在窗体的OnCloseQuery事件中写入下列代码
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := bLogin;
end;
这样也可以屏蔽掉Alt+F4

FrameSniper 2003-09-26
  • 打赏
  • 举报
回复
不好意思,刚查了帮助TTreeNodes和TTreeNode都是不提供事件的
但TTreeView有个Selected(TTreeNode类型)属性可以指定当前选择的是哪个结点

你在添加了结点后可以通过这个属性进行判断,返回当前点击的是哪个结点!
cdsun 2003-09-26
  • 打赏
  • 举报
回复
楼上的老兄

你的一个问题我明白了

第二个能不能给个例子?
FrameSniper 2003-09-25
  • 打赏
  • 举报
回复
将你的模态窗体的OnKeyDown中添加如下代码:
if(Key=VK_F4) and ([ssAlt]=shift) then
Key:=#0;

实现定义一个事件,单类型要和OnClick事件一样(即参数列表完全一致),然后在添加了节点后赋予值,假设添加后接点对象为TVItem,那么:
TVItem.OnClick:=SomeProcYourPredined;

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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