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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничение прав доступа в программе, нужен принцип 
:(
    Опции темы
Демо
Дата 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   Вверх
Страницы: (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.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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