问题如下:
1、我自己做了一个小小软件,其中有一个功能是锁定系统。
按钮选中之后就会弹出一个模态对话框,方便用户登陆,如果登陆不成功当然不能进入系统。不过我发现有个问题,就是如果我不登陆直接alt+f4就可以关闭这个窗口。就可以直接用了。不知道这个问题怎么解决。各位指点一下。2、因为我对delphi不是很熟悉,用了treeview一时又找不到教程。
我想问问在treeview里面添加了节点之后,如何对每个节点进行onclick事件的添加。问题就是这些,应该不难,因为小弟的分不多,所以先发50分,如果解决另外再送50分。希望大家帮帮忙。我的QQ86777770

解决方案 »

  1.   

    将你的模态窗体的OnKeyDown中添加如下代码:
    if(Key=VK_F4) and ([ssAlt]=shift) then 
      Key:=#0;实现定义一个事件,单类型要和OnClick事件一样(即参数列表完全一致),然后在添加了节点后赋予值,假设添加后接点对象为TVItem,那么:
    TVItem.OnClick:=SomeProcYourPredined;
      

  2.   

    不好意思,刚查了帮助TTreeNodes和TTreeNode都是不提供事件的
    但TTreeView有个Selected(TTreeNode类型)属性可以指定当前选择的是哪个结点你在添加了结点后可以通过这个属性进行判断,返回当前点击的是哪个结点!
      

  3.   

    一楼老兄的方法是一个比较恶劣了点 但是比较简单 
    其实你可以申明一个全局的私有变量 
      private
        { Private declarations }
        bLogin : Boolean;窗体创建的时候将这个变量设置为False
      bLogin : =False
    在你的密码输入成功以后 你在将这个变量置为True
    然后你在窗体的OnCloseQuery事件中写入下列代码
    procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      CanClose := bLogin; 
    end;
    这样也可以屏蔽掉Alt+F4
      

  4.   

    To THaoQi  对,是可以使用OnCloseQuery,但偶一般不用,麻烦!To CDSun  假设你现在已经在你的TreeView里面创建了一系列的TreeNode  这个时候你在TreeView上点鼠标,点后TreeView.Selected里面存放的就是你创建的当前被点选择的TreeNode的引用指针,明白?
      

  5.   

    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;希望你能看懂