起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1088|回复: 19

想在系统登录对话框直接引用修改密码对话框[请求]

[复制链接]
发表于 2010-6-1 11:41:24 | 显示全部楼层 |阅读模式
想在系统登录对话框直接引用修改密码对话框,可是可以弹出修改密码对话框但是点确定报错或修改没提示修改成功

方式一:TModifyPasswordForm.ChangePassword(TSystemCore.Operator);
报错:
Access violation at address 02518E80 in module 'CLRModel.bpl'.
Read of address 0000004C
类型:EAccessViolation。

方式二:
lDetailForm := TMODIFYPASSWORDFORM.Create(Context);
          try
            lDetailForm.ShowModal;
          finally
            lDetailForm.Free;
          end;
报错:
无报错,但是修改没生效。。。


业务模型\系统空间\简洁风格\界面库\窗体库\系统登录对话框
Biz:\SYSTEM\COMPACTSTYLE\FORMLIBRARY.LIBRARY\SYSTEMLOGINDIALOG.FORM


    if PswRz(edtPassword.Text)<>'OK' then
    begin
      JSDialogs.ShowWarning('您的密码'+PswRz(edtPassword.Text)+'请修改!', '登录');
        begin
           TModifyPasswordForm.ChangePassword(TSystemCore.Operator);
          {lDetailForm := TMODIFYPASSWORDFORM.Create(Context);
          try
            lDetailForm.ShowModal;
          finally
            lDetailForm.Free;
          end;}
        end ;
    end;
回复

使用道具 举报

发表于 2010-6-1 11:55:34 | 显示全部楼层
为什么要这么去实现呢?
因为你这里都还没有登陆,去改哪个登陆账号的密码呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-1 14:50:09 | 显示全部楼层
procedure TSYSTEMLOGINDIALOG.Logon(AutoSelect: Boolean);
事件中不是验证吗?验证成功后,我再进行,位数等验证

procedure TSYSTEMLOGINDIALOG.Logon(AutoSelect: Boolean);
const
  ErrMsg01 = '用户名或密码错误,或者该用户没有分配岗位或已被其他用户代理';
var
  lDetailForm : TMODIFYPASSWORDFORM;{记得在窗体前面加T}
begin
  if edtUserName.Text = '' then
  begin
    edtUserName.SetFocus;
    Dialogs.MessageDlg('请输入用户', TMsgDlgType.mtError, [TMsgDlgBtn.mbOK] , 0);
    Exit;
  end;
  if AutoSelect and (ActiveControl = edtUserName) then
  begin
    edtPassword.SetFocus;
    edtPassword.SelectAll;
    Exit;
  end;

  if not UpdatePositions then
  begin
    JSDialogs.ShowWarning(ErrMsg01, '登录');
    Exit;
  end;
  if not IsSystemManager(edtUserName.Text) then
    if DeputiedPosition then  //系统管理员System帐户没有岗位这里不能验证是否被代理了
      Exit;

  if not CanAutoPosition and (cbPosition.ItemIndex = -1) then
    raise Exception.Create('请选择岗位');

  ModalResult := Business.Forms.Controls.mrOK;

  SaveSettings;

    if PswRz(edtPassword.Text)<>'OK' then
    begin
      JSDialogs.ShowWarning('您的密码'+PswRz(edtPassword.Text)+'请修改!', '登录');
        begin
           TModifyPasswordForm.ChangePassword(TSystemCore.Operator);
          {lDetailForm := TMODIFYPASSWORDFORM.Create(Context);
          try
            lDetailForm.ShowModal;
          finally
            lDetailForm.Free;
          end;}
        end ;
    end;

  if cbPosition.ItemIndex = -1 then
  begin
    LocalPersonMember := nil;

  end
  else
    LocalPersonMember := cbPosition.Items.Objects[cbPosition.ItemIndex] as TPersonMember;

//  SendLogonMessage;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-1 14:51:59 | 显示全部楼层
ModalResult := Business.Forms.Controls.mrOK;

  SaveSettings;

之后 是通过了吧


如果不对,具体在哪写?也不会报错???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-1 14:57:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2010-6-1 14:58:44 | 显示全部楼层
方式一:TModifyPasswordForm.ChangePassword(TSystemCore.Operator);
报错:
Access violation at address 02518E80 in module 'CLRModel.bpl'.
Read of address 0000004C
类型:EAccessViolation。

TSystemCore.Operator 是否为空了。

方式二:
这种方式调用,并没有 修改密码的动作(你看那个确定按钮 仅仅是一个判断逻辑)
回复 支持 反对

使用道具 举报

发表于 2010-6-1 15:07:46 | 显示全部楼层
建议 这样的方式:自己做一个修改密码的窗口来实现(可以调用那个修改密码对话框,即方法二中,但是代码要参考下面的方式)
procedure TMainForm.btnChangePasswordClick(Sender: TObject);
var
  lPerson: Org.TPerson;
begin
     lPerson := Org.OrgSys.OrgSystem.GetPerson('ry1');
     If Assigned(lPerson) then
     begin
      lPerson.Password := '12345';
      Org.OrgSys.OrgSystem.SaveUnit(lPerson);
      Dialogs.ShowMessage('密码修改成功,新密码为12345');
     end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-1 15:10:29 | 显示全部楼层
方式一:TSystemCore.Operator 是为空了。

我要如何解决?就是想密码对后,查是不是合格的,不行就修改密码
回复 支持 反对

使用道具 举报

发表于 2010-6-1 15:33:13 | 显示全部楼层
楼主,看我给你的 一个思路:
1、业务模型\系统空间\简洁风格\界面库\窗体库\系统登录对话框
Logon 方法中在  ModalResult := Business.Forms.Controls.mrOK;  这句代码前加上
  if edtPassword.text = '' then //如果密码不符合要求(这里我只是为了简单,如果当前用户密码为空),就需要强制性的让操作者设置密码,否则不让登陆
  begin
    lDetailForm := TMODIFYPASSWORDFORM.Create(Context);
    //只需要在这个方法声明一个变量lDetailForm : TMODIFYPASSWORDFORM
    try
      lDetailForm.lOperator := edtUserName.Text;
      lDetailForm.ShowModal;
      if lDetailForm.ModalResult <> Business.Forms.Controls.mrOK then
        SysUtils.Abort;
    finally
      lDetailForm.Free;
    end;
  end;

2、业务模型\系统空间\简洁风格\界面库\窗体库\修改密码对话框
btnOKClick 方法中   ModalResult := Business.Forms.Controls.mrOK;前加上下面的代码
  if lOperator <> '' then  //传入的当前登陆账号,只需要在 这个对象的public下声明 lOperator : String;
  begin
    lPerson := Org.OrgSys.OrgSystem.GetPerson(lOperator);
    if Assigned(lPerson) then
    begin
      lPerson.Password := eNewPassword.Text;//这里还需要检查一下密码是否符合要求
      Org.OrgSys.OrgSystem.SaveUnit(lPerson);
      Dialogs.ShowMessage('密码修改成功,新密码为'+eNewPassword.Text);
    end;
  end;

然后你可以运行起来 ,看一下效果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-1 17:35:01 | 显示全部楼层
在建模中可以了,IE中修改会成功,但确定后出错

在操作文件:ORG:\PERSON\FZ_WHRY.PSN的时候出现异常,操作代码:15,异常信息:无效的命令:TFileAttributeAction[15]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-7 17:09 , Processed in 0.051711 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表