ITを駆使する猫エンジニア

 おはようございます、童爺です。

 

 今回はトリを務めます、会員管理画面とパスワード変更ダイアログボックスです。

 

 それではまず、会員管理画面から。

 

 管理者でログインすると以下の画面になります。

 

 管理者でもIDとユーザ名の変更及び退会は出来ない様になっています。

 

 次にナビゲータで一般ユーザに移ると以下の様にIDやユーザ名の変更及び退会が出来る様になります。

 

 また、パスワード変更ボタンをクリックすると以下のダイアログボックスが表示されます。

 

 では、まずは会員管理画面の設計画面です。

 

 次に、パスワード変更画面の設計画面です。

 

 以下に、会員管理画面のコードを記述します。

 

unit UserManagement;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
  FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async,
  FireDAC.Phys, FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef,
  FireDAC.Stan.ExprFuncs, FireDAC.FMXUI.Wait, FireDAC.Stan.Param, FireDAC.DatS,
  FireDAC.DApt.Intf, FireDAC.DApt, System.Rtti, FMX.Grid.Style, Fmx.Bind.Grid,
  System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.Controls,
  Data.Bind.EngExt, Fmx.Bind.DBEngExt, FMX.StdCtrls, Data.Bind.Components,
  Fmx.Bind.Navigator, Data.Bind.Grid, FMX.ScrollBox, FMX.Grid,
  Data.Bind.DBScope, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client,
  FMX.Controls.Presentation, FMX.Layouts, FMX.ListBox, FMX.DateTimeCtrls,
  FMX.Edit;

type
  TForm_UserMng = class(TForm)
    Layout_Header: TLayout;
    Label_Cation: TLabel;
    Layout_Footer: TLayout;
    FDConnection_Mng: TFDConnection;
    Button_Close: TButton;
    Layout_Navi: TLayout;
    Layout_button: TLayout;
    Button_Delete: TButton;
    Layout_ID: TLayout;
    Label_ID: TLabel;
    Edit_ID: TEdit;
    Layout_UserName: TLayout;
    Label_UserName: TLabel;
    Edit_UserName: TEdit;
    Layout_LastName: TLayout;
    Label_LastName: TLabel;
    Edit_LastName: TEdit;
    Layout_FirstName: TLayout;
    Label_FirstName: TLabel;
    Edit_FirstName: TEdit;
    Layout_Password: TLayout;
    Label_Password: TLabel;
    Layout_Birthday: TLayout;
    Label_Birthday: TLabel;
    DateEdit_Birthday: TDateEdit;
    BindNavigator_Mng: TBindNavigator;
    Layout_Ken: TLayout;
    Label_Ken: TLabel;
    ComboBox_Ken: TComboBox;
    BindingsList_Ken: TBindingsList;
    LinkFillControlToField1: TLinkFillControlToField;
    BindSourceken: TBindSourceDB;
    FDTableken: TFDTable;
    Button_Password: TButton;
    FDTable_member: TFDTable;
    BindSourceDB_member: TBindSourceDB;
    LinkControlToField1: TLinkControlToField;
    LinkControlToField2: TLinkControlToField;
    LinkControlToField3: TLinkControlToField;
    LinkControlToField4: TLinkControlToField;
    LinkPropertyToFieldText: TLinkPropertyToField;
    Button_Append: TButton;
    procedure Button_CloseClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button_AppendClick(Sender: TObject);
    procedure Button_PasswordClick(Sender: TObject);
    procedure FDTable_memberAfterScroll(DataSet: TDataSet);
    procedure ComboBox_KenChange(Sender: TObject);
    procedure Button_DeleteClick(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
    UserID: Integer;
    First_run_Flag: Boolean;
    constructor Create(AOwner: TComponent; const Id: Integer); reintroduce;
  end;

var
  Form_UserMng: TForm_UserMng;

implementation

{$R *.fmx}

uses
  MMS_CommonDialog,
  NewUserAppend,
  UserPasswordChange;

constructor TForm_UserMng.Create(AOwner: TComponent; const Id: Integer);
begin
  inherited Create(AOwner);
  UserID := id;
  First_run_flag := True;
end;

procedure TForm_UserMng.Button_CloseClick(Sender: TObject);
begin
  Close;
end;

procedure TForm_UserMng.Button_DeleteClick(Sender: TObject);
begin
  FDTable_member.Delete;
end;

procedure TForm_UserMng.Button_PasswordClick(Sender: TObject);
var
  User_PasswordChg: TForm_PasswordChg;
begin
  USer_PasswordChg := TForm_PasswordChg.Create(self, FDTable_member.FieldByName('id').AsInteger, FDTable_member.FieldByName('password').AsString);
  User_PasswordChg.ShowModal;
  FDTable_member.Refresh;
end;

procedure TForm_UserMng.Button_AppendClick(Sender: TObject);
begin
  Form_NewUserAppend := TForm_NewUserAppend.Create(self);
  Form_NewUserAppend.ShowModal;
  FDTable_member.Refresh;
end;

procedure TForm_UserMng.ComboBox_KenChange(Sender: TObject);
begin
  FDTable_member.Edit;
  FDTable_member.FieldByName('ken').AsInteger := ComboBox_Ken.ItemIndex + 1;
end;

procedure TForm_UserMng.FDTable_memberAfterScroll(DataSet: TDataSet);
var
  id: Integer;
  username: String;
begin
  if First_run_Flag then
  begin
    while FDTable_member.FieldByName('id').AsInteger <> UserID do
    begin
      FDTable_member.Next;
    end;
    First_run_Flag := False;
  end;

  id := DataSet.FieldByName('id').AsInteger;
  username := DataSet.FieldByName('username').AsString;

  if ((id = 1) and (username = 'administrator')) or
     ((id = 2) and (username = 'admin')) or
     ((id = 3) and (username = 'root')) then
  begin
    Edit_ID.Enabled := False;
    Edit_UserName.Enabled := False;
    Button_Delete.Enabled := False;
  end
  else
  begin
    Edit_ID.Enabled := True;
    Edit_UserName.Enabled := True;
    Button_Delete.Enabled := True;
  end;

  ComboBox_Ken.OnChange := nil;
  ComboBox_Ken.ItemIndex := DataSet.FieldByName('ken').AsInteger - 1;
  ComboBox_Ken.OnChange := ComboBox_KenChange;
end;

procedure TForm_UserMng.FormCreate(Sender: TObject);
begin
  FDConnection_Mng.Open();
  FDTableken.Open();
  FDTable_member.Open();
end;

procedure TForm_UserMng.FormDestroy(Sender: TObject);
begin
  FDTable_member.Close;
  FDTableken.Close;
  FDConnection_Mng.Close;
end;

end.

 

 次に、パスワード変更ダイアログボックスのコードです。

 

unit UserPasswordChange;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Edit,
  FMX.StdCtrls, FMX.Controls.Presentation, FMX.Layouts, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf,
  FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys,
  FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs,
  FireDAC.FMXUI.Wait, Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Param,
  FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet;

type
  TForm_PasswordChg = class(TForm)
    Layout_Header: TLayout;
    Label_Cation: TLabel;
    Layout_Footer: TLayout;
    Layout_BtnFooter: TLayout;
    Button_Update: TButton;
    Button_Cancel: TButton;
    Layout_NowPassword: TLayout;
    Label_NowPassword: TLabel;
    Edit_NowPassword: TEdit;
    Layout_NewPassword: TLayout;
    Label_NewPassword: TLabel;
    Edit_NewPassword: TEdit;
    Layout_ReNewPassword: TLayout;
    Label_ReNewPassword: TLabel;
    Edit_ReNewPassword: TEdit;
    FDConnection_PasswordChg: TFDConnection;
    FDQuery_Password: TFDQuery;
    procedure Button_UpdateClick(Sender: TObject);
    procedure Button_CancelClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private 宣言 }
    UserID: Integer;
    UserPassword: String;
  public
    { public 宣言 }
    constructor Create(AOwner: TComponent; const id: integer; const Password: String); reintroduce;
  end;

var
  Form_PasswordChg: TForm_PasswordChg;

implementation

{$R *.fmx}

uses
  System.Hash,
  MMS_CommonDialog;

constructor TForm_PasswordChg.Create(AOwner: TComponent; const id: integer; const Password: String);
begin
  inherited Create(AOwner);
  UserID := id;
  UserPassword := password;
end;


procedure TForm_PasswordChg.FormCreate(Sender: TObject);
begin
  FDConnection_PasswordChg.Open();
end;

procedure TForm_PasswordChg.FormDestroy(Sender: TObject);
begin
  FDConnection_PasswordChg.Close;
end;

procedure TForm_PasswordChg.Button_CancelClick(Sender: TObject);
begin
  Close;
end;

procedure TForm_PasswordChg.Button_UpdateClick(Sender: TObject);
var
  MsgDlg: TForm_MsgDlg;
  MD5: THashMD5;
  Password: String;
begin
  MD5 := THashMD5.Create;
  MD5.Update(Edit_NowPassword.Text);
  Password := MD5.HashAsString;
  if Password <> UserPassword then
  begin
    MsgDlg := TForm_MsgDlg.Create(self, '現在のパスワードが違います。');
    MsgDlg.ShowModal;
    exit;
  end;
  if Edit_NewPassword.Text = '' then
  begin
    MsgDlg := TForm_MsgDlg.Create(self, '新しいパスワードを入力してください。');
    MsgDlg.ShowModal;
    exit;
  end;
  if Edit_ReNewPassword.Text = '' then
  begin
    MsgDlg := TForm_MsgDlg.Create(self, '新しいパスワード再入力を入力してください。');
    MsgDlg.ShowModal;
    exit;
  end;
  if Edit_NewPassword.Text <> Edit_ReNewPassword.Text then
  begin
    MsgDlg := TForm_MsgDlg.Create(self, '新しいパスワードが一致しません。');
    MsgDlg.ShowModal;
    exit;
  end;
  MD5.Reset;
  MD5.Update(Edit_NewPassword.Text);
  FDQuery_Password.ParamByName('Input_password').AsString := MD5.HashAsString;

  FDQuery_Password.ParamByName('Input_id').AsInteger := UserID;

  try
    try
      MD5.Reset;
      MD5.Update(Edit_NewPassword.Text);
      FDQuery_Password.ParamByName('Input_password').AsString := MD5.HashAsString;

      FDQuery_Password.ParamByName('Input_id').AsInteger := UserID;

      FDQuery_Password.ExecSQL;
    except
      on e: Exception do
      begin
        FDQuery_Password.Close;
        MsgDlg := TForm_MsgDlg.Create(self, 'Error:' + e.Message);
        MsgDlg.ShowModal;
        raise;
      end;
    end;
  finally
    FDQuery_Password.Close;
  end;
  Close;
end;

end.

 

 結構変な処理をやっていると思いますが、それぞれちゃんと意味があるので・・・。

 

 説明は、希望があればします。(ヾ(゚Д゚ )ォィォィ

 

 ちなみにこれまで紹介してきた画面やダイアログボックスは全て幅が375に統一してあります。

 

 これは、スマートフォンで表示した際に画面が収まる様に配慮した結果です。

 

 あと、新規ボタンをクリックした場合は、前回のDelphiその14で説明した新規ユーザ作成画面を呼んでいます。

 

 恒例ですが、「ここが違う」とか「もっといいやり方がある」と言う方は、コメントなりTwitterに投稿して頂けると有り難いです。

 

 どんな些細な事でも構いません。(疑問点でもOK)

 

 出来る限り対応していきたいと思います。

 


 

 それではまた。

 

 でわでわ。