![](https://habrastorage.org/storage2/da0/ba7/056/da0ba7056c28fac12a51b1652c6f95cb.png)
åã®èšäºã¯ã1ã€ã®ãã§ãã¯ããŒã¯ã®ã¿ã«åœãŠãããŠããŸããã ããå°ãæ·±å»ãªãã®ã«ç§»ãæã§ãã ä»æ¥ã®ãããã¯ã¯ããªã¹ãã®è¡šç€ºãšãGUIãªã¹ããšå éšããŒã¿ãšã®é¢ä¿ã§ãã ãã®èšäºã¯ãDelphiéçºè ã察象ãšããŠããŸãã
ã©ãããå§ããã
æ°Žã泚ããªãããã«ãäžã®å³ã«ç€ºãããŠããå®äŸã«çŽè¡ããŸãã ãŠãŒã¶ãŒæš©éãèšå®ããããã®ããªããã£ããã©ãŒã ãäœæããå¿ èŠããããšããŸãã
ãŠã£ã³ããŠã®å·ŠåŽã«ã¯ãã·ã¹ãã ã®ãã¹ãŠã®ãŠãŒã¶ãŒã®ãªã¹ãã衚瀺ãããå³åŽã«ã¯çŸåšéžæãããŠãããŠãŒã¶ãŒã®æš©å©ãšåœ¹å²ã®ãªã¹ãã衚瀺ãããŸãã ãŠã£ã³ããŠã®ããžãã¯ã¯ããŠã£ã³ããŠã®å·ŠåŽã§ãŠãŒã¶ãŒãéžæããããšãå³åŽã®æš©å©ãšåœ¹å²ã®ãªã¹ããæŽæ°ãããããšã§ãã ãŸããå³åŽã«ã¯ãè¿œå ã/ãåé€ããã¿ã³ãããããŠãŒã¶ãŒã«æ°ãã圹å²ãè¿œå ããããéžæããæ¢åã®åœ¹å²ãåé€ã§ããŸãã æ°ããããŒã«ãè¿œå ãããšãããŒã«ãã£ã¬ã¯ããªã®ãããã¢ãããŠã£ã³ããŠã衚瀺ãããããã§è¿œå ããããŒã«ãéžæã§ããŸãã å®éãããããã¹ãŠã§ãã
ã¢ãã«
ããŒã¿ã®å éšè¡šçŸããåŸæ¥å¡ã説æããTUserã¯ã©ã¹ãšãæ°å€IDã§ããŒã«ã®ååãè¿ãããšãã§ããããŒã«ãã£ã¬ã¯ããªã§æ§æãããŠãããšããŸãã ããŒã«ã®ã¯ã©ã¹ãäœæããã®ã¯éå®çšçã§ã ããã¯ããŸãã«ãåçŽãªãšã³ãã£ãã£ã§ãã
uses Generics.Collections; // TObjectList type TIntList = array of Integer; // TUser = class strict private FID: Integer; FFullFio: String; FRoles: TIntList; public property ID: Integer read FID; property FullFio: String read FFullFio; property Roles: TIntList read FRoles write SetRoles; end; TUsersList = class(TObjectList<TUser>) public function UserByID(const aID: Integer): TUser; end;
ãŠãŒã¶ãŒã®åœ¹å²ã¯éåžžã«åçŽãªæ¹æ³ãã€ãŸãIDã®ãªã¹ãã§è¡šãããŠããããšãããããŸãã
é©åãªãã£ãŒã«ãããã©ãŒã ã¯ã©ã¹ã«è¿œå ããŸãã
TfmUserRights = class(TForm) ... lbUsers: TListBox; lbRoles: TListBox; private FUsers: TUsersList; public property Users: TUsersList read FUsers; end;
åä»ãTObjectListã䜿çšããããšã«æ³šæããŠãã ããã Delphi 2009ããåã¯ãããã¯äžå¯èœã§ãããTObjectListã¯åžžã«TObjectãä¿æããŠããŸããã ãªã¹ãã¢ã€ãã ã«ã¢ã¯ã»ã¹ãããã³ã«ãæ£ããã¯ã©ã¹FUsers [i]ãTUserãšããŠïŒãŸãã¯ãkamikazeã®ãªãã·ã§ã³ïŒTUserïŒFUsers [i]ïŒïŒã«ããå¿ èŠããããŸããã äžäŸ¿ã§ãããééã£ãã¯ã©ã¹ãžã®å€æãå®è¡ããããšã§ééããç¯ãããããªããŸããã ãžã§ããªãã¯åïŒãžã§ããªãã¯ïŒã®åºçŸã«ããã匷ãåä»ããããTObjectListã䜿çšã§ããããã«ãªããŸããã ä¿¡ããããªãã»ã©äŸ¿å©ã§ãïŒ FUsers [i]ãä»ããŠãã®ãããªãªã¹ãã®èŠçŽ ã«ç®ãåãããšãããã«TUserã¯ã©ã¹ã®ãªããžã§ã¯ããååŸãããŸãã
åŸæ¥å¡ã®ãªã¹ããååŸããã³ãŒããæäŸããŸããã åã·ã¹ãã ã§ã¯ããã®ã¢ãŒããã¯ãã£ã«å¿ããŠç°ãªããŸãã ããã¯ãããŒã¿ããŒã¹ãžã®SQLã¯ãšãªãã¯ã©ã€ã¢ã³ããã£ãã·ã¥ãžã®ã¢ã¯ã»ã¹ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒïŒå€å±€ã¢ãŒããã¯ãã£ïŒãžã®ã¢ã¯ã»ã¹ã§ãã åçŽã«ãã©ãããããã®ãªã¹ããååŸããæ©äŒããããšããŸãã
ãªã¹ãé ç®ã衚瀺ãã
ãã®ãããåŸæ¥å¡ã®ãªã¹ããååŸããŠç»é¢ã«è¡šç€ºããŸãã
procedure TfmUserRights.FormCreate(Sender: TObject); begin FillUsers; end;
Fillã¡ãœããã¯ããŠãŒã¶ãŒã®ãªã¹ããåçŽã«[å]å ¥åããããã«èšèšãããŠããŸãã
procedure TfmUserRights.FillUsers; var i: Integer; begin FUsers.Free; // , FUsers := GetUsers; lbUsers.Items.BeginUpdate; try lbUsers.Items.Clear; for i := 0 to Users.Count-1 do lbUsers.AddItem(FUsers[i].FullFio, FUsers[i]); // FUsers[i], // ID' ( , ) finally lbUsers.Items.EndUpdate; end; end;
ã¹ã¿ãããªã¹ãã«èšå ¥ããã ãã§ã¯äžååã§ãã ãŸããçŸåšéžæãããŠããåŸæ¥å¡ã®åœ¹å²ã衚瀺ããå¿ èŠããããŸãã ãã®ããã«ã¯ãçŸåšã©ã®åŸæ¥å¡ãéžæãããŠããããå€æããæ¹æ³ãåŠã¶å¿ èŠããããŸããïŒ çµéšã®æµ ãããã°ã©ããŒã¯ãããŸããŸãªå ŽæããlbUsers.Items.Objects [lbUsers.ItemIndex]ã«ç©æ¥µçã«é£çµ¡ãå§ããŸãã ãã ãã ãã®èšäºã®åã®éšåãèªãã å Žåãããªãã¯ãã§ã«ç§ãã¡ãå察ã®æ¹åã«é²ãããšããã§ã«èªèããŠããŸãã çŸåšéžæãããŠããåŸæ¥å¡ãè¿ããèšå®ããããããã£ããã©ãŒã ã¯ã©ã¹ã«èšå®ããŸãã TUserãªããžã§ã¯ãèªäœãŸãã¯æ°å€ã®ãŠãŒã¶ãŒIDãè¿ãããšãã§ããŸãã è°è«ããããšã¯ã§ããŸãããIDãè¿ãæ¹ããã䟿å©ã«æããŸããã
TfmUserRights = class(TForm) private FSelUserID: Integer; public property SelUserID: Integer read FSelUserID write SetSelUserID; end; procedure TfmUserRights.SetSelUserID(const Value: Integer); begin if FSelUserID <> Value then begin FSelUserID := Value; UpdateSelUser; // !!! end; end;
ããã§éèŠãªã®ã¯ãæå®ããããŠãŒã¶ãŒãéžæãããŠããç¶æ ã«ã€ã³ã¿ãŒãã§ã€ã¹ãããããUpdateSelUserã¡ãœããã§ãã
procedure TfmUserRights.UpdateSelUser; var vSelInd: Integer; i: Integer; begin vSelInd := -1; with lbUsers do for i := 0 to Items.Count-1 do if (Items.Objects[i] as TUser).ID = SelUserID then begin vSelInd := i; Break; end; lbUsers.ItemIndex := vSelInd; if SelUserID <= 0 then gbRoles.Caption := ' :' else gbRoles.Caption := ' : ' + Users.UserByID(SelUserID).FullFio FillUserRoles; // !!! end;
çŸåšã®ãŠãŒã¶ãŒã®ã€ã³ã¹ããŒã«æ¹æ³ã«ãããããŒã«ã®ãªã¹ãïŒFillUserRolesïŒãåžžã«ãªãŒããŒãããŒããããšãããããŸãã
åã®èšäºã®ããã«ãåææ¹åModel-> Presentationãå®è£ ãããããéåæãå¿ èŠã§ãã ãããã£ãŠãlbUsersãªã¹ãã®OnClickã€ãã³ãã«ã次ã®ã³ãŒããè¿œå ããŸãã
procedure TfmUserRights.lbUsersClick(Sender: TObject); begin SelUserID := (lbUsers.Items.Objects[lbUsers.ItemIndex] as TUser).ID; end;
SelUserIDãæå®ãããšãã«ãå¥ã®ãŠãŒã¶ãŒã以åã«éžæãããŠããå Žåãsetã¡ãœããã¯UpdateSelUserãåŒã³åºããŸããããã«ããããã¥ãŒãã¢ãã«ãšå®å šã«åæãããŸããã€ãŸããããŒã«ã®ãªã¹ããæŽæ°ãããŸãã ã€ãŸã lbUsersClickãã³ãã©ãŒå ããããŒã«ã®ãªã¹ããæŽæ°ããã¡ãœãããåŒã³åºãå¿ èŠããªããªãããã¹ãŠãèªåçã«è¡ãããŸãã
ããŒã«ã®ãªã¹ãã«èšå ¥ããæ¹æ³ã瀺ããŸãïŒç°¡åã§ãïŒïŒ
procedure TfmUserRights.FillUserRoles; var i: Integer; vSelUser: TUser; begin lbRoles.BeginUpdate; try lbRoles.Clear; if SelUserID <= 0 then Exit; vSelUser := Users.UserByID(SelUserID); for i := 0 to High(vSelUser.Roles) do lbRoles.AddItem(DictRoles.NameByID(vSelUser.Roles[i]), TObject(vSelUser.Roles[i])); // , ID', TObject' ( ) finally SomeList.EndUpdate; end; end;
ãªã¹ãã®æåã®ãŠãŒã¶ãŒãåæåããããšã§ããã©ãŒã åæåã³ãŒããè£è¶³ããŸãã
procedure TfmUserRights.FormCreate(Sender: TObject); begin FillUsers; FSelUserID := -2; // , Set- SelUserID := -1; // end;
äœãåŸãã®ïŒ ããã§ãSelUserIDãä»ããŠçŸåšéžæãããŠãããŠãŒã¶ãŒã«ã¢ã¯ã»ã¹ã§ããŸãã ããã«ãSelUserIDããããã£ã®å€ãããã°ã©ã ã§èšå®ããå ŽåãšãGUIãªã¹ããããŠãŒã¶ãŒãéžæããå Žåã®äž¡æ¹ã§ãããŒã«ã®ãªã¹ããèªåçã«æŽæ°ãããŸãã
ããŒã«ãæäœïŒè¿œå ãåé€ïŒããããã«ãã¯ã©ã¹ã®SelRolesããããã£ãäœæã§ããŸãã å®å šã«ä»®æ³åããæ¹ãç°¡åã§ãïŒåå¥ã®ãã£ãŒã«ããæããªãã§ãã ããïŒïŒ
property SelRoles: TIntList read GetSelRoles write SetSelRoles; function TfmUserRights.GetSelRoles: TIntList; var i: Integer; begin Result := nil; for i := 0 to lbRoles.Items.Count-1 do if lbRoles.Selected[i] then AddIntToList(Integer(lbRoles.Items.Objects[i]), Result); // ? Objects' // , ID' , Integer end; procedure TfmReportMain.SetSelRoles(const aSelRoles: TIntList); var i: Integer; begin lbRoles.Items.BeginUpdate; try for i := 0 to lbRoles.Items.Count-1 do lbRoles.Selected[i] := IntInList(Integer(lbRoles.Items.Objects[i]), aSelRoles); finally lbRoles.Items.EndUpdate; end; UpdateSelRoles; // . , , " N " - end;
IntInListã¡ãœãããšAddIntToListã¡ãœããã¯ãããããèŠçŽ ã®é åãžã®ãšã³ããªããã§ãã¯ããæ°ããèŠçŽ ãé åã«è¿œå ããŸãã
ããŒã«ã®è¿œå ãšåé€
圹å²ã®è¿œå ïŒ
procedure TfmUserRights.btAddRoleClick(Sender: TObject); var vSelUser: TUser; vRoles: TIntList; vAddRoles: TIntList; i: Integer; begin vAddRoles := nil; vAddRoles := TfmDictionary.GelDictIDs(DictRoles); // ID' vSelUser := Users.UserByID(SelUserID); vRoles := vSelUser.Roles; for i := 0 to High(vAddRoles) do AddIntToList(vAddRoles[i], vRoles); vSelUser.Roles := vRoles; // ( ) SelRoles := vAddRoles; end;
圹å²ã®åé€ïŒ
procedure TfmUserRights.btDelRoleClick(Sender: TObject); var vSelUser: TUser; vDelRoles: TIntList; vRoles: TIntList; vNewRoles: TIntList; i, vInd: Integer; begin if lbAllowRightsRoles.SelCount = 0 then raise Exception.Create(' .'); vDelRoles := SelRoles; vSelUser := Users.UserByID(SelUserID); vRoles := vSelUser.Roles; SetLength(vNewRoles, Length(vRoles)); // // vNewRoles , vInd := 0; for i := 0 to High(vRoles) do begin if IntInList(vRoles[i], vDelRoles) then Continue; vNewRoles[vInd] := vRoles[i]; inc(vInd); end; SetLength(vNewRoles, vInd); // vSelUser.Roles := vNewRoles; end;
ããŒã¿ããŒã¹ã®TUserãªããžã§ã¯ããžã®å€æŽãä¿åããå Žæã¯ããŠãŒã¶ãŒæ¬¡ç¬¬ã§ãã TUserã¯ã©ã¹ã®SetRoleså ã§ããã«ãããå®è¡ããã人ããããããããŸããïŒãã¹ãŠã®å€æŽãå³åº§ã«ããŒã¿ããŒã¹ã«åæ ãããããã«ïŒã ãŠã£ã³ããŠã®[OK]ãã¿ã³ãã¯ãªãã¯ããŠãå€æŽãããTUserãªããžã§ã¯ãã®ä¿åãå®è£ ããŠãã人ãããŸãã 3çªç®ã®ãªãã·ã§ã³ã¯ã[OK]ãã¿ã³ã§ä¿åããããšã§ãããŸããçŸåšã®ãŠãŒã¶ãŒã®åœ¹å²ãå€æŽãããå ŽåããŠãŒã¶ãŒãåãæ¿ããããšãããšãã«ãå€æŽããŸãïŒäžèšã®ãŠã£ã³ããŠã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãã©ã®åŸæ¥å¡ã圹å²ãå€æŽããã©ã®åŸæ¥å¡ãå€æŽããªãããèŠèŠçã«è¿œè·¡ã§ããªãããåŸæ¥å¡éã§ãšã©ãŒãçºçããå¯èœæ§ããããŸãïŒã
ãŸãšã
ãã®çµæããŠãŒã¶ãŒæš©å©ç®¡çãŠã£ã³ããŠãäœæãããŸããã ãŠã£ã³ããŠã¯æ¬¡ã®ããžãã¯ãå®è£ ããŸãã
1ïŒåŸæ¥å¡ã®ãªã¹ããèŠæ±ããŸãã
2ïŒåŸæ¥å¡ã®ãªã¹ãã衚瀺ããŸãã
3ïŒSelUserIDã䜿çšããŠãçŸåšéžæãããŠããåŸæ¥å¡ã®IDãååŸããŸãã
4ïŒID'uã«ããéžæãããåŸæ¥å¡ã®ã€ã³ã¹ããŒã«ãšã圌ã®åœ¹å²ã®ãªã¹ãã®èªåæŽæ°ã
5ïŒSelRolesããéžæããåŸæ¥å¡ã®åœ¹å²ã®ãªã¹ããååŸããŸãã
6ïŒããŒã«ã®è¿œå ãšåé€ã
è¿œå ã éžæããã¢ã€ãã ãä¿åããŠãªã¹ããæŽæ°ãã
ããã«ãšã©ãŸãããšã¯å¯èœã§ãããããã§ããçŸåšéžæãããŠããåŸæ¥å¡ã倱ãããšãªããåŸæ¥å¡èªèº«ã®ãªã¹ããæŽæ°ããæ¹æ³ã瀺ããããšæããŸãã åŸæ¥å¡ã®ãªã¹ããæåã§æŽæ°ããæ©èœã¯ãåŸæ¥å¡ã®è¿œå ãå¥ã®ãŠã£ã³ããŠã§è¡ãããæ°ããåŸæ¥å¡ãè¿œå ããæš©éãå€æŽããããã®ãŠã£ã³ããŠã«èªåçã«éç¥ããã¡ã«ããºã ãå®è£ ãããŠããªãå Žåã«åœ¹ç«ã¡ãŸãã ã·ã¹ãã ã®å¥ã®ãŠãŒã¶ãŒã¯å¥ã®ãã·ã³ã«æ°ããåŸæ¥å¡ãè¿œå ã§ããŸãããè¿œå ããããŠãŒã¶ãŒããªã¹ãã«è¡šç€ºãããããã«æš©éèšå®ãŠã£ã³ããŠã«ç§»åããããšã¯æãŸãããããŸããã
ãããã£ãŠãæš©å©èšå®ãŠã£ã³ããŠã«ãåŸæ¥å¡ãªã¹ããæŽæ°ããã¿ã³ãè¿œå ãããšããŸãããã æããã«ãFillUsersã¡ãœãããžã®åçŽãªåŒã³åºãã«ã€ãªããã¯ãã§ãã ããããçŸåšéžæãããŠããåŸæ¥å¡ã¯å€±ãããŸãïŒGUIãªã¹ããã¯ãªã¢ãããŠåã³å ¥åãããããïŒãããã¯ãŠãŒã¶ãŒã«ãšã£ãŠéåžžã«äžäŸ¿ã§å¥åŠã§ãã
procedure TfmUserRights.FillUsers; var i: Integer; vSavedSelUserID: Integer; begin // if SelUserID > 0 then vSavedSelUserID := SelUserID else vSavedSelUserID := -1; ... // FUsers ... // if vSavedSelUserID > 0 then begin FSelUserID := -1; SelUserID := vSavedSelUserID; end else SelUserID := -1; end;
å°æ¥ãããã«å€ãã®ããšãå¿ èŠã«ãªãå¯èœæ§ããããŸããæš©å©èšå®ãŠã£ã³ããŠã§ç¹°ãè¿ãå ¥åããéããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã»ãã·ã§ã³éã§éžæããæåŸã®åŸæ¥å¡ãèšæ¶ããããšã§ãã ãã®å Žåããã©ã¡ãŒã¿ãFillUsersã«è¿œå ããŠããªã¹ããåæ§ç¯ããåŸã«é 眮ãããŠãŒã¶ãŒã決å®ã§ããŸãã ãã®å ŽåãçŸåšã®ãŠãŒã¶ãŒãèšæ¶ããããžãã¯ã¯å°ãè€éã«ãªããŸãã
procedure TfmUserRights.FillUsers(const aSelUserID: Integer = -1); var i: Integer; vNeedSelUserID: Integer; begin if aSelUserID > 0 then // , vNeedSelUserID := aSelUserID else if SelUserID > 0 then // - vNeedSelUserID := SelUserID else vNeedSelUserID := -1; ... // FUsers ... if vNeedSelUserID > 0 then begin FSelUserID := -1; SelUserID := vNeedSelUserID; end else SelUserID := -1; end;
ãã®å ŽåãFormCreateã¯æ¬¡ã®ããã«å€æŽãããŸãã
procedure TfmUserRights.FormCreate(Sender: TObject); begin FillUsers(Config.RightsFormSavedUserID); end;
ããã³FormDestroy on
procedure TfmUserRights.FormCreate(Sender: TObject); begin Config.RightsFormSavedUserID := SelUserID; end;
äžèšã®ã³ãŒãã®ã»ãšãã©ã¯ãé ããçºæããããã®ã§ãã¿ã€ããã¹ãäžæ£ç¢ºãã®ããã«å³ããå€æããªãã§ãã ããã å®éã®ãããžã§ã¯ããšéåžžã«ãã䌌ãŠããŸãããå®éã®ãããžã§ã¯ãã§ã¯ã詳现ã«ã€ããŠã¯è©³ãã説æããŸããã
åŸã ã«ãå éšããŒã¿ã®ã¯ã©ã¹ãGUIã³ã³ãããŒã«ã«æ¥ç¶ããããšã«è¿ã¥ããŠããŸãã ãŸã ãã£ãŠããŸããã èšäºã®æ¬¡ã®éšåã§ã¯ãéç¥ãµãã¹ã¯ãªãã·ã§ã³ãã³ãã¬ãŒããèŠãŠãGUIããªããžã§ã¯ãèªäœã®å€æŽã«ã©ã®ããã«å¿çãããã瀺ããŸãã
é 匵ã£ãŠ
PS
èšäºã®æåã®éšå
èšäºã®ç¬¬3éš