Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.01.2015, 23:50
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию Оптимизация кода

Добрый день
Помогите с оптимизацией кода

Есть Форма авторизации при введении правильного логина и пароля
Получаем из таблицы базы данных
параметры главного меню основной формы в зависимости от роли пользователя
Структура базы такова
Таблица СпрПользователи связана с таблицей СпрГрупп которая связана с таблицей СпрИнтерфейсов

Задачу решил так
Код:
 ADOQueryFase.Active:=False;
      ADOQueryFase.SQL.Clear;
 ADOQueryFase.SQL.Add('SELECT *');
 ADOQueryFase.SQL.Add('FROM  SprFase');
 ADOQueryFase.SQL.Add('WHERE');
 ADOQueryFase.SQL.Add('FaseID  = '+InttoStr(IFaseID[H])+' '); 
  ADOQueryFase.Open;
   //Настройка интерфейса
   IFACE:= ADOQueryFase.FieldValues['MClose'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MClose.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MNewOrder'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MNewOrder.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MUsers'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MUsers.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MTMC'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MTMC.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MContractor'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MContractor.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MCatalog'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MCatalog.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MSettings'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MSettings.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MRegister'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MRegister.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MRegister'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MRegister.Visible:=IFACEBool;

  IFACE:= ADOQueryFase.FieldValues['MDoc'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MDoc.Visible:=IFACEBool;

   IFACE:= ADOQueryFase.FieldValues['MReports'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MReports.Visible:=IFACEBool;

   IFACE:= ADOQueryFase.FieldValues['MParameters'];
  if IFACE = 1 then
  IFACEBool:=True
  else IfaceBool:=False;
  MainForm.MainMenu.MParameters.Visible:=IFACEBool;
Админ: Пользуемся тегами для оформления кода!

Как можно более красиво решить данную задачу?

Последний раз редактировалось Admin, 12.01.2015 в 19:46.
Ответить с цитированием
  #2  
Старый 12.01.2015, 19:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Зачем столько лишнего кода?
Вместо всего этого:
Код:
IFACE:= ADOQueryFase.FieldByName('MClose').AsBoolean;
 if IFACE = 1 then
 IFACEBool:=True
 else IfaceBool:=False;
 MainForm.MainMenu.MClose.Visible:=IFACEBool;
сразу
Код:
 MainForm.MainMenu.MClose.Visible:= ADOQueryFase.FieldByName('MClose').AsBoolean;
По аналогии остальное так-же переделайте.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 12.01.2015, 19:57
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Дело в том что в MS SQL нет типа boolean
по этому в таблице Интерфейсов используется поля int 0 - отключено меню
1 - показывать меню
Ответить с цитированием
  #4  
Старый 12.01.2015, 19:59
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Дело в том что в MS SQL нет типа boolean
по этому в таблице СпрИнтерфейсов используется поля int 0 - отключено меню
1 - показывать меню
Ответить с цитированием
  #5  
Старый 12.01.2015, 23:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если вдруг предложенный Страдальцем вариант не компилируется (что очень странно), то можно записать то же самое как
Код:
MainForm.MainMenu.MClose.Visible:= ADOQueryFase.FieldByName('MClose') = 1;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #6  
Старый 12.01.2015, 23:12
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

При Вашем коде ошибка [dcc32 Error] LoginUnit.pas(96): E2015 Operator not applicable to this operand type
При Коде Страдальца ошибка не при компиляции, а выдается программой Cannot access field 'MClose' as type Boolean
Ответить с цитированием
  #7  
Старый 13.01.2015, 00:19
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну а так попробуйте?
Цитата:
MainForm.MainMenu.MClose.Visible:= ADOQueryFase.FieldValues['MClose'] = 1;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 13.01.2015, 01:05
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Спасибо работает
Если не трудно объясните выражение ADOQueryFase.FieldValues['MClose'] = 1;
Не могу понять логику ADOQueryFase.FieldValues['MClose'] принимает значение 0 или 1 т.е.
MainForm.MClose.Visible:= 0=1
или
MainForm.MClose.Visible:= 1=1
Ответить с цитированием
  #9  
Старый 13.01.2015, 02:11
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Не могу понять логику ADOQueryFase.FieldValues['MClose'] принимает значение 0 или 1 т.е.
MainForm.MClose.Visible:= 0=1
или
MainForm.MClose.Visible:= 1=1
А чего не понятно?
выражение 1=1 имеет тип Boolean и значение false, и его можно не только использовать в операторе if, но и присвоить чему-нибудь, тоже имеющему тип Boolean, например, свойству Visible.
Ответить с цитированием
  #10  
Старый 13.01.2015, 19:04
geniusbsd geniusbsd вне форума
Прохожий
 
Регистрация: 11.01.2015
Сообщения: 27
Версия Delphi: RAD STUDIO XE7
Репутация: 10
По умолчанию

Спасибо всем за помощь
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter