рдбреЗрд▓реНрдлреА рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдорд╡реАрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдгред рднрд╛рдЧ 3. рд╡рд╕реНрддреБрдПрдБ


рд▓реЗрдЦ рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ ( 1 , 2 ) рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ - рдореЙрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдореЙрдбрд▓ рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рд░рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлреЙрд░реНрдо рдХреНрд▓рд╛рд╕ рдХреА рд╕рд░рд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдЯрд░ рдЬреАрдпреВрдЖрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдореЙрдбрд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рдЦреБрдж рдЖрд╡реЗрджрди рдореЗрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред


рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдпрд╛ рд▓реЗрдЦ рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХреА рдЧрдИ рдЕрд╢реБрджреНрдзрд┐ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдЪрдпрдирд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рджреВрд╕рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рджреЛрд╖ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП btAddRoleClick, btDelRoleClick рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдореЗрдВ FillUserRoles рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЙрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд┐рдзрд┐ рдЦрд░рд╛рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рдХрд░реНрдордЪрд╛рд░реА рднреВрдорд┐рдХрд╛рдПрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВ, рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдореИрдВ рдПрдХ рдмрд╛рд░ рдФрд░ рдЙрди рд╕рднреА рдЬрдЧрд╣реЛрдВ рдкрд░ рдЬреАрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ GUI рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рдЦреБрдж рджреЗ рдФрд░ рдЬрдм рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдмрджрд▓реВрдВ, рддрдм рд╣реА redrawред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЯреНрдпреВрд╕рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░реВрдВрдЧрд╛:
TUser = class private ... FOnChangeRoles: TNotifyEvent; protected ... procedure DoChangeRoles; public ... property OnChangeRoles: TNotifyEvent read FOnChangeRoles write FOnChangeRoles; end; procedure TUser.DoChangeRoles; begin if Assigned(FOnChangeRoles) then FOnChangeRoles(Self); end; 


рдореИрдВрдиреЗ TUser рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди рдИрд╡реЗрдВрдЯ рдЬреЛрдбрд╝рд╛, рдЬреЛ рд╣рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, TUser рд╡рд░реНрдЧ рдХрд╛ SetRoles рддрд░реАрдХрд╛ рдирд┐рдореНрди рд░реВрдк рд▓реЗрдЧрд╛:
 procedure TUser.SetRoles(Value: TIntList); begin if not SameIntLists(Roles, Value) then begin Roles := Value; DoChange; //   end; end; 


рдЬрдм рддрдХ TUser рд╡рд░реНрдЧ OnChangeRoles рдИрд╡реЗрдВрдЯ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (FOCChangeRoles рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╣реИ), DoChangeRoles рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рдШрдЯрдирд╛ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯреНрдпреВрд╕рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВрдбрд▓рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлреЙрд░реНрдо рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ:
 procedure TfmUserRights.ProcRolesChanged(Sender: TObject); begin FillUserRoles; end; 


рдЕрдм рд╣рдореЗрдВ TUser рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЗрд╕ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдЯрдХрд╛рдирд╛ рд╣реЛрдЧрд╛:
 procedure TfmUserRights.FillUsers; var i: Integer; begin FUsers.Free; //   ,    FUsers := GetUsers; for i := 0 to FUsers.Count-1 do FUsers[i].OnChangeRoles := ProcRolesChanged; ... end; 


рдмрд╕ рдЗрддрдиреА рд╕реА рдмрд╛рдд рд╣реИ :)ред рдЕрдм, рдЬрдм рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ OnChangeRoles рдИрд╡реЗрдВрдЯ рдЖрдЧ рд▓рдЧрд╛ рджреЗрдЧрд╛, рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ FillUserRoles рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдФрд░ GUI рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ (рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдлрд┐рд░ рд╕реЗ рднрд░реЗрдВ)ред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХрд╛ рдХреЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рдерд╛?

1) рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореБрдЭреЗ рдХреЗрд╡рд▓ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЛ рд▓рд╛рдпрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдЯреНрдпреВрд╕рд░ рд╡рд░реНрдЧ рдХреЗ рд░реЛрд▓реНрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкреНрд░рддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдХреНрд╕рд░, рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдИ (рдпрд╛ рд╢рд╛рдпрдж рд╕рднреА) рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рдерд╛, рди рдХрд┐ OnChangeRoles, рд▓реЗрдХрд┐рди рдмрд╕ OnChange, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЛ рди рдХреЗрд╡рд▓ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдЙрд╕ рд╕рдордп рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рддрджрдиреБрд╕рд╛рд░, DoChange рдХреЙрд▓ рдХреЗрд╡рд▓ SetRoles рдореЗрдВ рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ TUser рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЪреЗ рд╣реБрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрд╕рдиреЗ рд╡рд╛рд▓реЛрдВ рдореЗрдВ рднреА рд╕реНрдерд┐рдд рд╣реЛрдЧреА, рдЬрд┐рдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣рдо рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдФрд░ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЗрд╕ DoChange рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рднреВрд▓рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдВрдШрди рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
2) рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрджрд┐ рд╣рдо рдПрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, "рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВ), рддреЛ рд╣рдореЗрдВ рдЗрд╕ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди (" рдЕрдкрдВрдЬреАрдХреГрдд "рдкреНрд░реЛрд╕реЗрд╕рд░) рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд OnChangeRoles рдХреЛ рдЙрд╕рдХреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╢реВрдиреНрдп рдкрд░ рд▓реМрдЯрд╛рдПрдВред рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ TUser рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдФрд░ рдЖрдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рдЕрдиреБрдкрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдлреЙрд░реНрдо TUser рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рд░рд╣рддрд╛ рд╣реИ, рддреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкреБрдирдГ рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдлреЙрд░реНрдо рдирд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА TUser рдЬреАрд╡рд┐рдд рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ OnDestroy рдореЗрдВ рдлреЙрд░реНрдо рдореЗрдВ рдХреБрдЫ рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
  for i := 0 to FUsers.Count-1 do FUsers[i].OnChangeRoles := nil; 

рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрдм рдЖрдк рдлрд╝реЙрд░реНрдо рдирд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж TUser рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ TUser рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЪреБрдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ (рдлрд╝реЙрд░реНрдо) рдХреА рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд░реВрдк рдореЗрдВ рд╣рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдЗрдВрдЯреНрд░реИрдХреНрд╢рди рдорд┐рд▓реЗрдЧрд╛ред
3) рдЬрдм рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╕реМрдВрдкрдирд╛ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд╕реВрдЪреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рд╛рдореА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦреЗрдВ), рддреЛ рдЖрдк TUser рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ DoChange рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ Owner.DoChange рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдИрд╡реЗрдВрдЯ (рдЧреБрдг FOnChange) рд╕реЗрдЯ рдХрд░реЗрдВ (TObjectList рдореЗрдВ) ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрд░реНрде рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдорд╛рдирд╛ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд╕рд╛рде рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрднреА рддрдХ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдкреВрд░реНрдг рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕реВрдЪрдирд╛рдПрдВ рдЕрдЪреНрдЫреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдЧреНрд░рд╛рд╣рдХ рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд▓реЛ рджреВрд╕рд░реЗ рдХрд╛рдо рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред

рдорд▓реНрдЯреА-рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛рдПрдВ

рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдПрдордбреАрдЖрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрд╣реБ-рд╡рд┐рдВрдбреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ)ред рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрдИ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рдВрдбреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рднреА рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпреЗ рд╡рд┐рдВрдбреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рдВрдбреЛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдПрдХ рд╣реА рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╡реЗ рдХреЗрд╡рд▓ рдЙрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ - рдЗрд╕ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛ рдПрдХ рдХрд╛рд░реНрдб, рдЬрд╣рд╛рдВ рдЖрдк рдЙрд╕рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛рд░реНрдб рдореЗрдВ "рд╕рд╣реЗрдЬреЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдбреЗрдЯрд╛ рдХреЛ рдХрд░реНрдордЪрд╛рд░реА рдХрд╛рд░реНрдб рдФрд░ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рджреЛрдиреЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рдПрдХрд╛рдзрд┐рдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕рджрд╕реНрдпрддрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЙрдирдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрдирд╕реЗ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдмрдВрдзрдХ рд╡рд░реНрдЧ рд╣реИрдВ рдЬреЛ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ TUser рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╣реЗрдЬ рд░рд╣реЗ рд╣реИрдВ):
 TUsersMngr = class public procedure SaveUser(aUser: TUser); end; 


рд╕рднреА рд╡рд┐рдВрдбреЛ рдЬрд┐рд╕рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, SaveUser рдХреЙрд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, TUserMngr рд╡рд░реНрдЧ рдХреЛ рдЙрди рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдХрд░реНрдордЪрд╛рд░реА рд╕реЗрд╡ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:
 TUsersMngr = class private FNotifiers: array of TNotifyEvent; public procedure RegChangeNotifier(const aProc: TNotifyEvent); procedure UnregChangeNotifier(const aProc: TNotifyEvent); function NotifierRegistered(const aProc: TNotifyEvent): Boolean; end; 


рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб:
 procedure TUsersMngr.RegChangeNotifier(const aProc: TNotifyEvent); var i: Integer; begin if NotifierRegistered(aProc) then Exit; i := Length(FNotifiers); SetLength(FNotifiers, i+1); FNotifiers[i] := aProc; end; procedure TUsersMngr.UnregChangeNotifier(const aProc: TNotifyEvent); var i: Integer; vDel: Boolean; begin //  ,       (    RegChangeNotifier),     vDel := False; for i := 0 to High(FNotifiers) do if vDel then FNotifiers[i-1] := FNotifiers[i] else if (TMethod(aProc).Code = TMethod(FNotifiers[i]).Code) and (TMethod(aProc).Data = TMethod(FNotifiers[i]).Data) then vDel := True; if vDel then SetLength(FNotifiers, Length(FNotifiers) - 1); end; function TUsersMngr.NotifierRegistered( const aProc: TNotifyEvent): Boolean; var i: Integer; begin //       TMethod   for i := 0 to High(FNotifiers) do if (TMethod(aProc).Code = TMethod(FNotifiers[i]).Code) and (TMethod(aProc).Data = TMethod(FNotifiers[i]).Data) then begin Result := True; Exit; end; Result := False; end; 



рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдВрдбреЛ рд╕реЗ рдЕрдкрдиреА рд░реБрдЪрд┐ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:
 procedure TUsersListForm.FormCreate(Sender: TObject); begin ... UsersMngr.RegChangeNotifier(ProcUsersChanges); end; procedure TUsersListForm.FormDestroy(Sender: TObject); begin UsersMngr.UnregChangeNotifier(ProcUsersChanges); ... end; procedure TUsersListForm.ProcUsersChanged(Sender: TObject); begin RefillUsersList; end; 


рдЕрдм рдЬрдм рд╣рдо рд╕рдордЭ рдЧрдП рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдо рд╕реАрдзреЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рдХреНрд╖рдг рдореЗрдВ рд▓реМрдЯ рдЖрдПрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд рддрдм рддрдХ рдШрдЯрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ:
 procedure TUsersMngr.SaveUser(aUser: TUser); begin if aUser.Changed then begin ... //   aUser   ... DoUserChangeNotify; //   end; end; procedure TUsersMngr.DoUserChangeNotify; var i: Integer; begin for i := 0 to High(FNotifiers) do FNotifiers[i](Self); end; 


рдЕрдм, рдЬрдм TUser рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдкреНрд░рдкрддреНрд░реЛрдВ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВред

рд╣реИрдВрдбрд▓рд░ рд▓реЙрдХрдЖрдЙрдЯ

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рди рджреЗрдВред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ: рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдорд┐рд▓рд╛ рдерд╛ рдЬреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдерд╛ред рд╣рдо рд╕реВрдЪреА рдореЗрдВ 10 рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, "рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЬреЛрдбрд╝реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, UserMngr.Save рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдЗрди 10 рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд░реНрдордЪрд╛рд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рдмрд╛рдж, DoUserChangeNotify рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╕рднреА рдЦреБрд▓реА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА рд╕реВрдЪреА рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рд╕реЗ рдХрд░реНрдордЪрд╛рд░реА рд╕реВрдЪреА рдХрд╛ рдПрдХ рд░рд┐рдмреВрдЯ рднреА рд╣реЛрдЧрд╛)ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, 10 рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ soooooooo рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╣реЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдореЗрдВ рдЦреБрд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд▓рдХреЗрдВ рдорд┐рд▓реЗрдВрдЧреА (рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ 10 рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдЕрдм рдореИрдВ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдмрддрд╛рдКрдВрдЧрд╛:
 TUsersMngr = class private FLock: Integer; FChanged: Boolean; public procedure BeginUpdate; procedure EndUpdate; end; procedure TUsersMngr.Create; begin ... FLock := 0; FChanged := False; end; procedure TUsersMngr.BeginUpdate; begin Inc(FLock); end; procedure TUsersMngr.EndUpdate; begin Assert(FLock > 0); Dec(FLock); if (FLock = 0) and Changed then DoUserChangeNotify(Self); end; 


рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╡рд┐рдзрд┐ рднреА рдмрджрд▓ рдЬрд╛рдПрдЧреА:
 procedure TUsersMngr.DoUserChangeNotify; var i: Integer; begin if FLock > 0 then //      begin FChanged := True; // ,     Exit; end; FChanged := False; for i := 0 to High(FNotifiers) do FNotifiers[i](Self); end; 


рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕реНрддрд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдлрд╝реЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ (рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдЯреВ рдмрд┐рдЧ рдпреВрдкреАрдб..рдЗрдВрдбрдпреВрдбреЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ)ред FChanged рдПрдХ рдзреНрд╡рдЬ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдШрдЯрдирд╛ рдЕрд╡рд░реБрджреНрдз рд╕рддреНрд░ рдХреЗ рднреАрддрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рд╣реБрдИ рдереАред рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рдЕрд╡рд░реБрджреНрдз рд╕рддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ (рдпрд╛рдиреА рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдХреЗ рдПрдВрдбрдкреЗрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ), рдШрдЯрдирд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд▓рд╛рдПрдЧреАред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 UsersMngr.BeginUpdate; try for i := 0 to FSomeUsers[i] do UsersMngr.Save(FSomeUsers[i]); finally UsersMngr.EndUpdate; end; 


рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд░рд╛рдЬреНрдп рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╕реНрддреБ рдХреЗ рдХреБрдЫ рдордзреНрдпрд╡рд░реНрддреА рд░рд╛рдЬреНрдпреЛрдВ (рдХреНрд╖реЗрддреНрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди) рдХреЛ рдЬреАрдпреВрдЖрдИ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрд╡реИрдз рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЖрдкрдХреЛ GUI рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдРрд╕реЗ рд░рд╛рдЬреНрдпреЛрдВ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд╕реНрддреБ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЙрд╕рдХреЗ рдЕрджреНрдпрддрди рдХреЗ рд╕рддреНрд░ рдХреЗ рдЕрдВрджрд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЗрд╕ рд╡рд╕реНрддреБ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЯреНрд░рд┐рдЧрд░ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо

рдПрдХ рдЬреАрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╡реЗрдВрдЯ рдПрдХ рдЕрдЪреНрдЫреА рдЪрд╛рд▓ рд╣реИред рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ GUI рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХрдИ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдФрд░ рдХрдИ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдПрдорд╡реАрд╕реА-рд╢реИрд▓реА рдореЗрдВ рдЬреАрдпреВрдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрднреА рднреА рдбреЗрд▓реНрдлреА рдореЗрдВ рдЬреАрдпреВрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░, рд╢рд╛рдпрдж, рд▓реЗрдЦреЛрдВ рдХреА рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬрд╛рд░реА рд░рд╣реЗрдЧреАред рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рднреА рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ (рдФрд░ рд╢рд╛рдпрдж рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдЦреЛрдВ рдореЗрдВ!) рдбреЗрд▓реНрдлреА рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдлрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЪрд╛рд▓ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░ рдХрд┐рд╕реА рднреА рд╣реЛрд╕реНрдЯреЗрд╕ рдХреЛ рджрдлрдирд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдбреЗрд▓реНрдлреА рдЕрднреА рднреА рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛;)

рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!

PS рд▓реЗрдЦ рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдВрдХ:
рднрд╛рдЧ 1. рдЪреЗрдХрдорд╛рд░реНрдХред
рднрд╛рдЧ 2. рд╕реВрдЪрд┐рдпрд╛рдБред

Source: https://habr.com/ru/post/In147466/


All Articles