Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничение прав доступа в программе, нужен принцип 
:(
    Опции темы
Gorets
Дата 23.3.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



Пишу бухгалтерскую программу. Пользователей будет много и каждому нужно дать доступ только к определенным частям програмы. Я думаю сделать это с помощью Enabled/Disabled определенных элементов интерфейса (кнопок, панелей, радиобатанов).
Каким образом лучше всего сохранить в базе данные по настройкам для каждого пользователя и потом при входе в прогу применить эти настройки?
как вариант я думаю сохранять в базу приблизительно такие данные:
Цитата

UserId    |    ElementName    |      Status
------------------------------------------------
1            |  fMain.btAdmin    |      0
1            |  fDogovor.btOk    |      1
2            |  fMain.btAdmin    |      1
........

и т.д.
а при входе надо как-то применить эти настройки.... вот только не знаю как это правильно прописать..
PM MAIL WWW ICQ   Вверх
Guedda
Дата 23.3.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Лучше всего, если пользователи не сильные в компах, написать все в Ini-файлах. Поищи по форуму, я уже постил про такое...
А если пользователи продвинутые, тогда лучше в реестр запихать.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 23.3.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Лучше, не disabled, а visible.
Менять в OnShow формы.
PM MAIL   Вверх
Gorets
Дата 23.3.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



можно и visible... вот только как правильно это написать...
в базе хранится ведь стринговое значение fDogovor.btOk
как обратиться к подобному объекту???
т.е сделать fDogovor.btOk.visible:=True

Это сообщение отредактировал(а) Gorets - 23.3.2006, 14:45
PM MAIL WWW ICQ   Вверх
_hunter
Дата 23.3.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



не с той стороны заходиш. нужно не к fDogovor.btOk.visible обращаться, а компонентом проверять значение...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Демо
Дата 23.3.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Gorets,

Я думаю, что ты совершенно правильно думаешь.
Только надо еще добавить поле "тип объекта", а поле статус должно иметь больше двух значений(например - только читать, читать и писать, только писать)

Применяется такая схема просто.

При первоначальной настройке выбираются все записи по данному пользователю с типом объекта "Интерфейс".
Объекты интерфейса обрабатываются в соответствии с полученными записями.

Для применения системы ограничений/разрешений во время работы программы нужно определиться, какие объекты будут задействованы в системе.

Это могут быть операции изменения, конкретные таблицы, файлы и т.д.

В БД добавляется хранимая процедура для проверки прав на конкретный объект.
И перед любой операцией проверять права доступа на необходимые объекты.
Конечно, только на словах выглядит все просто. На практике, конечно, всё значительно сложнее.


--------------------
    
PM MAIL ICQ Skype   Вверх
Gorets
Дата 23.3.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



вот например получил я из базы данные:

fDogovor.btOk и 1

как мне теперь обратиться к объекту fDogovor.btOk и сделать его видимым?
может так? меня интересует синтаксис!
object(fDogovor.btOk).visible:=True;

PM MAIL WWW ICQ   Вверх
Демо
Дата 23.3.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Gorets @ 23.3.2006, 16:03 Найти цитируемый пост)
как мне теперь обратиться к объекту fDogovor.btOk и сделать его видимым?


Тебе не нужно так делать.
Ведь интерфейсная часть - наиболее постоянная часть программы.
У тебя в программе ограниченный набор объектов интерфейса.
Зафиксируй для каждого такого объекта имя, под которым он будет находиться в БД. По сущестыу - таблица соответствия, которую тоже в БД можно вынести.




--------------------
    
PM MAIL ICQ Skype   Вверх
Gorets
Дата 23.3.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



Цитата

Зафиксируй для каждого такого объекта имя

так я это и делаю..... только как потом по этому имени обратиться к объекту?

я делаю так:

Код

for i:=0 to qTemp.recordcount-1 do
begin
  elname:=qTemp.fieldbyname('ElName').asstring;
  status:=qTemp.fieldbyname('ElStatus').asboolean;
  //я получаю elname равен btOk, status равен 1
  //как теперь объекту btOk (кнопка) сделать visible:=1 ???

  qTemp.next;
end;

PM MAIL WWW ICQ   Вверх
bems
Дата 23.3.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



а что зы движок базы данных? может пожно на этом уровне все сделать?
ну или шифровать часть базы паролем юзера


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Gorets
Дата 23.3.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



кажется решил..

Код

for i:=0 to qTemp.recordcount-1 do    
begin    
  elname:=qTemp.fieldbyname('ElName').asstring;    
  status:=qTemp.fieldbyname('ElStatus').asboolean;    
  FindChildControl(elname).Visible:=status;
  qTemp.next;    
end;

PM MAIL WWW ICQ   Вверх
Gorets
Дата 23.3.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



Код

 FindChildControl('RadioButton1').Visible:=False;


все замечательно работает если объектом является Button,Panel,RadioButton и т.д.
а вот с элементами главного меню и контекстного меню такой вариант не проходит....
как быть?
PM MAIL WWW ICQ   Вверх
_hunter
Дата 23.3.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



ага. поэтому делаем не через cout, а по-человечески...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Gorets
Дата 23.3.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



жду примера в таком случае!!!
PM MAIL WWW ICQ   Вверх
Guedda
Дата 23.3.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(_hunter @ 23.3.2006, 18:40)
ага. поэтому делаем не через cout, а по-человечески...

smile
По-моему, ты напутал форум с C++ smile


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Демо
Дата 23.3.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Gorets @ 23.3.2006, 17:33 Найти цитируемый пост)
все замечательно работает если объектом является Button,Panel,RadioButton и т.д.
а вот с элементами главного меню и контекстного меню такой вариант не проходит....
как быть?


Ну зачем тебе обращаться по имени, записааном в БД?

Код

if qTemp.fieldbyname('ElName').asstring='ButtonAccountEdit' then  
begin
  ButtonAccountEdit.Visible := Boolean(qTemp.fieldValues['ElStatus']);
end;


Ведь таких элементов у тебя не тысячи.


--------------------
    
PM MAIL ICQ Skype   Вверх
Guedda
Дата 23.3.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



А если все-таки тысячи? Допустим, элементов в меню больше 300, и в PopUp больше ста, да еще и кнопок уйма... Кажется, что человек делает платформу. У меня есть статья по написанию программ с правами доступа. Как найду, напишу здесь...


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Демо
Дата 23.3.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



В конце-концов можно и спец. класс создать для работы с твоими элементами управления. Простой пример(схема, как можно обратиться по имени, наприм, к функции):

Код

type
  TProc=procedure of object;
  TProcClass=class
  published
    class procedure ShowOk;
    class procedure ShowCancel;
  end;


Код

var
  proc: TProc;


Код

{ TProcClass }
class procedure TProcClass.ShowCancel;
begin
  ShowMessage('Cancel');
end;

class procedure TProcClass.ShowOk;
begin
  ShowMessage('Ok');
end;


Код

procedure TForm1.Button2Click(Sender: TObject);
begin
  @Proc := TProcClass.MethodAddress('ShowOk');
  Proc;
  @Proc := TProcClass.MethodAddress('Showcancel');
  Proc;
end;

Добавлено @ 17:52
Цитата(Guedda @ 23.3.2006, 17:49 Найти цитируемый пост)
А если все-таки тысячи? Допустим, элементов в меню больше 300, и в PopUp больше ста, да еще и кнопок уйма...


Тогда прямая дорога к использованию в каждом элементе управления поля Tag.
Записываем в базу, заием поиск в RunTime по тегам.


--------------------
    
PM MAIL ICQ Skype   Вверх
Guedda
Дата 23.3.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Цитата(Демо @ 23.3.2006, 18:51)
Тогда прямая дорога к использованию в каждом элементе управления поля Tag.
Записываем в базу, заием поиск в RunTime по тегам.

Вот!!! Скорее всего, лучше этим воспользоваться. Писать в базу не названия компонентов, а их Tag


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Gorets
Дата 23.3.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.5.2005

Репутация: нет
Всего: нет



да все замечательно работает и так как я сделал!
+ так очень удобно хранить настройки не зависимо от к-ва элементов!

нашел вариант и для менюшек:
Код

  (FindComponent('Help1') as TMenuItem).Visible:=False;

Добавлено @ 17:59
я например изначально все кнопки в меню делаю невидимыми, а потом в зависимости от залогинившигося пользователя делаю видимыми только нужные ему кнопки!
Добавлено @ 18:00
и база данных для хранения настроек очень простая и понятная!
PM MAIL WWW ICQ   Вверх
Anakin
Дата 7.3.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



Пробовал я вариант который предложил 2 Демо

Код

if qTemp.fieldbyname('ElName').asstring='ButtonAccountEdit' then  
begin
  ButtonAccountEdit.Visible := Boolean(qTemp.fieldValues['ElStatus']);
end;


Разместил на форму 3 кнопки и сделал их инвизибл. Но почему то у меня работает тока первая кнопка так как она первая в таблице. (( КТо может подсказать в чем трабла ?

И не как не мог разобратса с вариантом 2 Gorets
Никак не могу его понять (( Как он работает. Можетли кто то показать пример по больше ?

Код

for i:=0 to qTemp.recordcount-1 do    
begin    
  elname:=qTemp.fieldbyname('ElName').asstring;    
  status:=qTemp.fieldbyname('ElStatus').asboolean;    
  FindChildControl(elname).Visible:=status;
  qTemp.next;    
end;


Зарание Благодарен.


Это сообщение отредактировал(а) Anakin - 7.3.2007, 09:47
PM MAIL   Вверх
samec
Дата 7.3.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



Цитата(Anakin @ 7.3.2007,  09:43)
Разместил на форму 3 кнопки и сделал их инвизибл. Но почему то у меня работает тока первая кнопка так как она первая в таблице. (( КТо может подсказать в чем трабла ?

надо для каждой кнопки (эдита, мемо и т.п.) писать свой код, например:
Код

if qTemp.fieldbyname('ElName').asstring='Button1' then  
  Button1.Visible := Boolean(qTemp.fieldValues['ElStatus']);

if qTemp.fieldbyname('ElName').asstring='Button2' then  
  Button2.Visible := Boolean(qTemp.fieldValues['ElStatus']);

if qTemp.fieldbyname('ElName').asstring='Edit1' then  
  Edit1.Visible := Boolean(qTemp.fieldValues['ElStatus']);

if qTemp.fieldbyname('ElName').asstring='Memo1' then  
  Memo1.Visible := Boolean(qTemp.fieldValues['ElStatus']);


и.т.п...

если компонент много, то лучше использовать вариант предложенный Gorets  smile 
PM MAIL   Вверх
Anakin
Дата 7.3.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



2 samec
Да это я понял что нуна на каждую кнопку. 
ВОт допустим я поставил данный код в OnShow Формы где размещены данные элементы. 
И при запуске срабатывает тока первая кнопка которая хранитса в Базе.
PM MAIL   Вверх
ama_kid
Дата 7.3.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Чо-та я не понял.. Рекурсии никого не учили что ли? Дали ведь хороший совет - использовать теги (зачем имена компонентов хранить в БД? Имхо - бред)...
Вот тестовый пример: я накидал на форму десять компонентов (главное меню с двумя пунктами, каждое содержит по два подпункта, кнопку, листбокс, едит). И еще одну кнопку, по которой будет все выполняцца... Всем элементам присвоил уникальные теги от 1 до 9. За настройки у меня отвечает константный массив (индекс в массиве = тэгу элемента), у топиккреатора - это может быть считываемый массив или еще что-нибудь, не важно... Привожу код модуля:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    ListBox1: TListBox;
    MainMenu1: TMainMenu;
    Menu11: TMenuItem;
    Menu21: TMenuItem;
    SubMenu11: TMenuItem;
    SubMenu21: TMenuItem;
    SubMenu31: TMenuItem;
    SubMenu41: TMenuItem;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  A:array[1..10] of integer = (1,0,0,1,0,1,0,0,0,0);

implementation

{$R *.dfm}

procedure MyDisable(Control:TComponent);
var
 i:integer;
begin
 if Control.ComponentCount = 0 then
  begin
   if Control.Tag>0 then
    begin
     if (Control is TControl)then (Control as TControl).Enabled := A[Control.Tag]>0
     else if (Control is TMenuItem)then (Control as TMenuItem).Enabled := A[Control.Tag]>0
    // else... Если есть еще какой-нибудь наследник от TComponent
    end;
  end
 else
    for i:=1 to Control.ComponentCount do
     try
      MyDisable(Control.Components[i -1]);
     except
     end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 MyDisable(Form1);
end;

end.

Как видно - у меня есть одна маленькая функция, которая вызывается рекурсивно для всех элементов формы (или любого компонента, заданного в качестве параметра). Размер функции практически не зависит от количества элементов (+/- пара строк если есть другие наследники TComponent, ну и оптимизация не помешала бы). Пример, конечно, тестовый, но он показывает как можно общаться с настройками компонентов. Настройки можно хранить просто массивом.  Можно спокойно использовать как Visible, так и Enable... В общем адаптировать под конкретную задачу, думаю труда не составит... 
Какие неудобства у данного метода? Ненаглядность настроек в БД? Имхо - чушь, ибо пользователи не должны лезть в БД, а если лезут - им надо затруднить по маскимуму кастомизацию настроек. Необходимость использования массива? Ну, если жалко памяти - храните просто количество компонентов и используйте динамические массивы. Ненаглядность кода? Простите, но на таком малом объеме кода эта ненаглядность абсолютно нивилируется...
Короче, это просто информация к размышлению, конкретную реализацию в итоге выбирать вам... smile

Добавлено:
Кстати, если все-таки хочешь хранить имена компонентов - можешь использовать следующую конструкцию цикла:
Код

 ...Получаем имя компонента из БД и условие его видимости/доступности...
 if (Form1.FindComponent(...строковое имя из БД, полученное в цикле...) is TControl) then
    (Form1.FindComponent(...строковое имя из БД, полученное в цикле...) as TControl).Enabled:=...Условие...
 else
 if (Form1.FindComponent(...строковое имя из БД, полученное в цикле...) is TMenuItem) then
    (Form1.FindComponent(...строковое имя из БД, полученное в цикле...) as TMenuItem).Enabled:=...Условие...
// else  еще какой-нибудь наследник TComponent



Это сообщение отредактировал(а) ama_kid - 7.3.2007, 13:41


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Anakin
Дата 7.3.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



2 ama_kid
Вроде как немного понял. Если просьба я понимаю может звучать нагло но не мог бы ты маленький пример всего этого дать. Типа накидать там пару Элементов и показать как всё это обращаетса к БД. ПРсота я новенький и не всё сразу схватываю ( А когда есть пример рабодчий мона его поковырять и увидеть как всё там работает. (
Ещё раз прошу прощение за наглось (
ЗА рание Благодарен.
PM MAIL   Вверх
MAX2002
Дата 7.3.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.3.2006

Репутация: нет
Всего: нет



Ндаа прям камасутра у тебя какая то smile
, даю бесплатный совет, в Buildere и Delphi есть ActionManager, переводишь всю работу своей программы
и все обработчики на екшены, и при onShow энейблишь их или дисейблишь.....
PM MAIL   Вверх
Elfebet
Дата 7.3.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



Цитата

Дали ведь хороший совет - использовать теги (зачем имена компонентов хранить в БД? Имхо - бред)...

ИМХО тада и тэги хранить тоже бред, лучше всего сохранять индекс компонента, тогда и не надо содавать массив, так как индекс компонента всегда уникальный.
Код

var i, index:Integer;
begin
  index := btn2.ComponentIndex;
  for i:=0 to ComponentCount-1 do
  begin
    if(Components[index] is TButton) then
    begin
      (Components[index] as TButton).Visible:=False;
    end;
  end;


Добавлено @ 14:47 
А вообще правильно бы запихать кнопки и т.п в панель и эту панель для конретного пользователя прятать, а не каждую кнопку и т.п. делать визибл.


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Anakin
Дата 7.3.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



2 Elfebet Да но Учти что есть допустим некоторые кнопки тоторые нуна спрятать. А некоторые оставить. Если ятебе понял правельно то ты хочешь проста запихать всё в Одно и при какихто усливиях прятать или показывать всю понель. Так не годитса.
Мне интересен способ автора данного топика но до меян никак не доезжает как всё это сделать. (
Тоесть впринципе я то знаю как их спрятот и как показать элементы. Но вот как сделать так что бы при вводе логина и пароля всё это обращалось к базе и считывалсоь от туда (
По этому и прошу пример ибо я новенький (

2 ama_kid  Попробовал твой вареант. Скажу что короший и удобный ) Но вот как к этой процедуре прикрутить базу с Логином паролем и уровнем доступа. Вот сиджу и чешу репу и никак не допираю.  smile 

Я знаю что тут есть грамотные спецы помогите плизз начинающему. Если мона по внятней разжвать  smile   smile 
Прсоат очень кочетса сделать такую штуку ибо интерес есть а мозгов никак не хватает. (
PM MAIL   Вверх
Elfebet
Дата 7.3.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



Anakin,  записываеш в базу индекс копмонента которого нужно спрятать/отобразить и все.
т.е. примерно где-то так:
Код

for i:=0 to qTemp.recordcount-1 do    
begin    
  index:=qTemp.fieldbyname('IndexComponent').AsInteger;    
  bVisible:=qTemp.fieldbyname('Visible').AsBoolean;
  if (Components[index] is TControl) then
    (Components[index] as TControl).Visible:=bVisible;
  qTemp.next;    
end;


Это сообщение отредактировал(а) Elfebet - 7.3.2007, 15:49


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Anakin
Дата 7.3.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



2 Elfebet ДАвай по порядку.
1) Куда этот код нуна поместить в обрабодчик событий какого элемента ?
2) Что значит index
3) ЧТо это за поле и что в нем должно хранитса ? IndexComponent
Обьясни плизз.. Если не сложно. 

Дальше вот я так наскоряк накидал пару компонентов и базу.
КТо может гляньте плиз на изходник и скажите что там не правельно.

У меня там никак не получаетса его соеденить с базой что бы при вводе логина и паса он вырубал Элементы.

Если мона подправте плизз.
Зарание благодарен.




Это сообщение отредактировал(а) Anakin - 7.3.2007, 16:29

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Project1.rar 22,76 Kb
PM MAIL   Вверх
Anakin
Дата 7.3.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



И прилагаю второй пример.
И с нимже опять проблема.

Не могу сделать ввод пароля и логина и что бы она читала логин и пасс с БД и на соответствующий уровень доступа она прятало элементы (

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Project2.rar 23,70 Kb
PM MAIL   Вверх
Elfebet
Дата 7.3.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



вот посмотри этот пример (это твой переделанный)



Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Project.rar 23,70 Kb


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
ama_kid
Дата 8.3.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата
ИМХО тада и тэги хранить тоже бред, лучше всего сохранять индекс компонента, тогда и не надо содавать массив, так как индекс компонента всегда уникальный.

Нет, на самом деле, это не совсем бред - индекс компонента - он, конечно, уникальный, но все-таки при определенных условиях может меняться (ну убрали кнопку с формы или еще что-нибудь сделали с формой - индекс поменяется у остальных элементов - что, всю БД перелопачивать вручную и переставлять индексы?). А тэг - это скорее не уникальный идентификатор компонента, а если так можно выразиться идентификатор уровня доступа. Т.е. ты можешь назначить нескольким элементам одинаковый тэг и тогда они будут видны при одинаковых условиях. И получается, в БД можно хранить не индексы компонентов, а уровни доступа/имя пользователя/пароль... И вообще, я не упирал на то, что надо использовать массивы - я этот пример за две минуты налабал просто чтоб показать как работать с компонентами - массивы - просто первое, что пришло в голову, ясно, что оптимизация имеет место и должна быть... smile

Anakin
Цитата
Но вот как к этой процедуре прикрутить базу с Логином паролем и уровнем доступа. Вот сиджу и чешу репу и никак не допираю.

В качестве примера привожу набросанную щас на коленке программу... Там есть все - и работа с уровнями доступа, и с БД без всяких тяжеловесных компонентов...

Это сообщение отредактировал(а) ama_kid - 8.3.2007, 09:25

Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  MyTestDB.rar 14,94 Kb


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Anakin
  Дата 12.3.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



2 ama_kid Респект тебе. Замечательный пример. И я согласен с тем что с TEG Куда всё проще.
Вот сижу сейчас и ковыряю твой пример. Нет ну прямо любоуюсь как тут всё до тупости проста. Тока оптимизировать нуна и всё.
ОГРОМНОЕ Спасибо тебе.

2 Админам и Модерам
Если мона прикрутите эту тему Ибо она многим нужна.
PM MAIL   Вверх
Anakin
Дата 12.3.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



2 ama_kid Прошу прощения за настоичивость и назойливость. Но у меня возник вопрос.
По твоему коду.

Код

procedure TForm1.SetCurrentAccessLevel;
var
 i:integer;
 AccLvl:integer;
begin
 if not flSelected then exit;
 aq.Close;
 aq.SQL.Text:='SELECT [User],[Password],[AccessLevel] FROM One WHERE [User]='''+CurName+'''';
 try
  aq.Open;
 except
 end;
 if aq.RecordCount = 0 then
  ShowMessage('Íåò òàêîãî þçåðà.')
 else
  try
   AccLvl:=aq.Recordset.Collect[2];
   if string(aq.Recordset.Collect[1])=CurPass then
     for i:=0 to Form1.ComponentCount-1 do
      begin
       if Form1.Components[i].Tag= 0 then continue else
       if (Form1.Components[i] is TControl)then (Form1.Components[i] as TControl).Enabled :=AccLvl>=Form1.Components[i].Tag
       else if (Form1.Components[i] is TMenuItem)then (Form1.Components[i] as TMenuItem).Enabled :=AccLvl>=Form1.Components[i].Tag;
      end
    else ShowMessage('Íåïðàâèëüíûé ïàðîëü.');
  except
   ShowMessage('Íåóäà÷íî.');
  end;
  flSelected:=false;
end;


Как тут производитса расчет уровня доступа.
Тоесть откуда программа знает что даёт 1 ЛвЛ доступа и 6 ЛвЛ доступа.

Зарание Благодарен.


Это сообщение отредактировал(а) Anakin - 12.3.2007, 14:26
PM MAIL   Вверх
ama_kid
Дата 12.3.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Anakin
Давай по шагам:
1) Получение параметров текущего юзера (по имени):
Код
 aq.SQL.Text:='SELECT [User],[Password],[AccessLevel] FROM One WHERE [User]='''+CurName+'''';
 try
  aq.Open;
 except
 end;

2) Определение уровня доступа для юзера, который ему выделил "виртуальный админ", и который забит в базу данных:
Код
AccLvl:=aq.Recordset.Collect[2]; // Потому, что [AccessLevel] идет третьим в SQL-запросе (нумерация от 0)

3) В цикле по всем компонентам: у каждого компонента есть свойство Tag, которое в данном приложении обозначает буквально следуюущее: "Минимальный уровень доступа, который нужно иметь юзеру, чтобы иметь возможность работать с данным компонентом". А операнд
Код
 (Form1.Components[i] as TControl).Enabled :=AccLvl>=Form1.Components[i].Tag 
 делает ни что иное, как производит сравнение текущего уровня доступа и включение/отключение конкретного контрола по результату сравнения


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0904 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.