Права доступу до елементів управління Delphi, Різне, Програмування, статті

Автор: Проскуряков Олександр


У більшості складних додатків на основі баз даних існує поняття розмежування доступу до даних, таблиць, записів, полям, але в більшості випадків цього не достатньо.

У будь-якому додатку існує безліч інших завдань по мимо доступу до даних, таких як, наприклад звіти, до яких так само треба розмежовувати доступ на рівні користувачів, та й багато в чому іноді простіше розмежувати права не на рівні бази даних, а на рівні додатку, так як це може надати більш гнучку і просту систему настройки прав користувачів.


У даному прикладі я опишу простий у програмуванні та використанні спосіб адміністрування прав користувачів на доступ до елементів управління вашої програми.


Завдання:



  1. Забезпечити простий і зручний інтерфейс адміністрування прав;

  2. Забезпечити функціональну свободу, можливість змінювати, об’єднувати віднімати і додавати права;

  3. Простота використання і програмування;

Спосіб вирішення


Для зручності адміністрування та використання створений деревовидний список див. рис.1, який за допомогою правої кнопки миші легко редагується розробником і так же легко використовується адміністратором системи.



 
 

Для забезпечення функціональної свободи створений клас TrightData (Див. исходники) який дозволяє працювати з рядком прав, опис класу див. нижче.

Що б полегшити адміністрування та використання, кожен елемент дерева наділений додатковими даними, а саме класом TrightData, який містить в собі інформацію про те, що користувачеві дозволено або заборонено.


Самі дані представляють собою наступний вид


ІмяФорми (элементуправления.свойство) наприклад:


Form1(Button1.enabled)


або


Form1(button2.enabled,Menuitem.visible), form2(SpeedButton3.visible)


Для економії розміру ім’я властивість замінено кодом, який ви можете змінювати на свій розсуд, скажімо я зробив так:


Form1(button2.1,Menuitem.0), form2(SpeedButton3.0),all(SpeedButton1.5)


де 0 – visible 1 – Enabled і т.д.


Форма all використовується для тих елементів управління, які можуть міститися на будь-якій формі. Кожне правило може містити безліч класів, кожен з яких містить безліч властивостей.



 
Для зручності адміністрування, при компіляції з параметром {$define isadmin} доступно меню розробника, а так само можливо мишею перетягувати правила. Так само у модулі присутні функції завантаження і збереження правил з потоку Tstream, Так що саму інформацію про правила можна зберігати в будь-якому зручному для вас вигляді.

 
 

Для застосування властивостей використовується функція парсер, яка виділяє із загальної рядка прав тільки те, що ставитися до форми, описаної в параметрі parent, І так само те, що відноситься до всіх форм (all)


procedure ApllyRights(const parent:Twincontrol; rights:string);


var


s,s1:string;


x,z,y:integer;


len:byte;


begin


if rights=”” then exit;


 s:=lowercase(parent.Name)+”(“;   z:=pos(s,rights);


/ / Витягуємо із загальної рядка прав тільки те, що ставитися до поточної формі


 if z>0 then begin x:=length(s);      y:=PosEx(“)”,rights,z+x);


s:=””;


if y>0 then s:=copy(rights,z+x,y-x-z);end else s:=””;


 s1:=”all(“;z:=pos(s1,rights);


/ / І так же витягуємо то що ставитися до всіх форм.


 if z>0 then begin x:=length(s1);y:=PosEx(“)”,rights,z+x);


s1:=””;


if y>0 then s1:=copy(rights,z+x,y-x-z);end else s1:=””;


/ / Формуємо загальну рядок того, що застосовно до даної форми


rights: = s1 + “,” + s + “,”; / / кома в кінці обов’язкове.


 for x := parent.ComponentCount – 1 downto 0 do begin


   s:=lowercase(parent.Components[x].Name);


   len:=length(s)-3;


   z:=pos(s,rights);


   if z>0 then begin


    z:=PosEx(“.”,rights,z+len);


    y:=PosEx(“,”,rights,z+1);


    s1:=copy(rights,z+1,y-z-1);


if (parent.Components [x]. ClassName = “ваш клас”) and (s1 = “ваш код властивості”) then “ваше дію” else


if (parent.Components [x]. ClassName = “ваш клас”) and (s1 = “ваш код властивості”) then “ваше дію” else


    if s1=”0″ then SetOrdProp(parent.Components[x],”Visible”,0) else


    if s1=”1″ then SetOrdProp(parent.Components[x],”Enabled”,0) else


    if s1=”5″ then SetOrdProp(parent.Components[x],”ReadOnly”,1);


    end;


 end;


end;


Як видно з процедури, можна змінювати не тільки стандартні логічні властивості а й будь-які інші передбачені розробником.


Ця функція може викликатися при завантаженні або відображенні форми наступним способом:


Procedure TDisp1.FormShow(Sender: TObject);


begin


ApllyRights(self,CurrentRigths);


/ / Де self посилання на спричинюється форму, а CurrentRigths – загальна рядок правил для конкретного користувача.


end;


Опис класу TrightData


TrightData=class(Tobject)


private


RightsClass:array of Record TFormName:string[50]; SubClass:array of string[50];end;


/ / Масив містить елементи рядка прав


function AddForm(const formname:string):integer;


/ / Функція повертає номер форми по порядку, якщо форми немає вона створюється


Function AddSubClass(const formid:integer;Subclass:string):integer;


/ / Функція повертає номер класу по порядку у формі, якщо класу немає він створюється


procedure Clear;


/ / Очищає правило


public


Function FormExists(const FormName:string):integer;


/ / Перевіряє чи створена форма повертає номер форми або -1 якщо форма не знайдена


Function SubClassExist(FormId:integer;Subclass:string):integer;


/ / Перевіряє чи створений клас у формі повертає номер класу або -1 якщо клас не знайдено


constructor Create(CurrentRights:string);


/ / Створює масив правил RightsClass з рядка прав.


Destructor destroy;


Function GetString:string;


/ / Створює рядок правил з масиву правил


Procedure ConcatWith(const Plus:TrightData);overload;


/ / Складає правила поточне з правилом Plusж


Procedure ConcatWith(const s:string);overload;


/ / Складає правила поточне з троковим виразом правила


function Equal(a,b: TrightData) : Boolean;


/ / Перевіряє входження правила b в правило а


Function IsNull:boolean;


/ / Повертає true якщо правило пусте.


end;


Даний модуль буде працездатний у версії Delphi 6,7,2005,2007, 2009 і може бути легко використаний у вже готовій програмі без значних доробок.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*