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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.02.2014, 20:30
Aks67rus Aks67rus вне форума
Прохожий
 
Регистрация: 28.02.2014
Сообщения: 10
Версия Delphi: Delphi 10 lite
Репутация: 10
По умолчанию

Помогите найти ошибку.
Суть:
-Программа с 4 пользователями, 1 админ, и 3 остальных.
-Админ назначает доступ пользователям кто какие функции может выполнять.
Проблема:
Если каждому назначать по отдельности(войти-назначить-выйти), всё работает, ежели определить доступ сразу всем 3, то работает только тот, кому назначили доступ последнему, остальным запрещает всё.

Файл приложил, там чуть все разбросано, разбирался...Но пока не понял...
Помогите разобраться...

Пароли:
Администратор - admin
Вова - vova
Дима - dima
Стас - stas
Вложения
Тип файла: rar ИБ-9-10.rar (223.9 Кбайт, 3 просмотров)

Последний раз редактировалось M.A.D.M.A.N., 28.02.2014 в 22:45.
Ответить с цитированием
  #2  
Старый 28.02.2014, 23:30
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Качать лень поэтому лишь предположу что ты неправильно сохраняешь изменения. Правильно ли у тебя указано условие цикла? Выложи лучше код.
Ответить с цитированием
  #3  
Старый 01.03.2014, 00:29
Aks67rus Aks67rus вне форума
Прохожий
 
Регистрация: 28.02.2014
Сообщения: 10
Версия Delphi: Delphi 10 lite
Репутация: 10
По умолчанию

Всё,я исправил. А можете помочь с этим... При не правильном вводе пароля, показывает ShowMessage по всем пользователям а не по одному...как надо...
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
p,p1,p2,p3,p4:integer;
st,par:string;
begin
st:=ComboBox1.Text;
par:=Edit1.Text;
if (st='Артём') and (par='artem') then
begin
  ShowMessage('Зравствуйте, Артём! У вас высший уровень доступа!');
  RadioButton1.Visible:=true;
  RadioButton2.Visible:=true;
  RadioButton3.Visible:=true;
  RadioButton4.Visible:=true;
end
else
begin
  p:=p+1;
  if p=1 then ShowMessage('Пароль введен не верно, осталось 2 попытки!');
  if p=2 then ShowMessage('Пароль введен не верно, осталось 1 попытка!');
  if p=3 then form1.Close;
end;

if (st='Максим') and (par='maxim') then
begin
  ShowMessage('Зравствуйте, Максим! Вам доступны секретные данные!');
  RadioButton1.Visible:=true;
  RadioButton2.Visible:=true;
  RadioButton3.Visible:=true;
  RadioButton4.Visible:=false;
end
else
begin
  p1:=p1+1;
  if p1=1 then ShowMessage('Пароль введен не верно, осталось 2 попытки!');
  if p1=2 then ShowMessage('Пароль введен не верно, осталось 1 попытка!');
  if p1=3 then form1.Close;
end;

if (st='Александр') and (par='sasha') then
begin
  ShowMessage('Зравствуйте, Александр! Вам доступны открытые данные!');
  RadioButton1.Visible:=true;
  RadioButton2.Visible:=false;
  RadioButton3.Visible:=false;
  RadioButton4.Visible:=false;
end
else
begin
  p2:=p2+1;
  if p2=1 then ShowMessage('Пароль введен не верно, осталось 2 попытки!');
  if p2=2 then ShowMessage('Пароль введен не верно, осталось 1 попытка!');
  if p2=3 then form1.Close;
end;

if (st='Владислав') and (par='vlad') then
begin
  ShowMessage('Зравствуйте, Владислав! Вам доступны открытые данные!');
  RadioButton1.Visible:=true;
  RadioButton2.Visible:=false;
  RadioButton3.Visible:=false;
  RadioButton4.Visible:=false;
end
else
begin
  p3:=p3+1;
  if p3=1 then ShowMessage('Пароль введен не верно, осталось 2 попытки!');
  if p3=2 then ShowMessage('Пароль введен не верно, осталось 1 попытка!');
  if p3=3 then form1.Close;
end;

if (st='Анатолий') and (par='tolik') then
begin
  ShowMessage('Зравствуйте, Анатолий! Вам доступны секретные данные!');
  RadioButton1.Visible:=true;
  RadioButton2.Visible:=true;
  RadioButton3.Visible:=true;
  RadioButton4.Visible:=false;
end
else
begin
  p4:=p4+1;
  if p4=1 then ShowMessage('Пароль введен не верно, осталось 2 попытки!');
  if p4=2 then ShowMessage('Пароль введен не верно, осталось 1 попытка!');
  if p4=3 then form1.Close;
end;
end;
Ответить с цитированием
  #4  
Старый 01.03.2014, 00:36
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Потому что при вводе неправильного пароля сработают все else, ведь условие ни одного if не выполняется.
Только предупреждаю сразу. Никогда, даже под дулом пистолета, нельзя писать такой код. Строго заданные имена пользователей и пароли, которые находятся открытием программы любым текстовым редактором, и без права изменить эту информацию. А также многократное дублирование одного и того же кода.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Aks67rus (01.03.2014)
  #5  
Старый 01.03.2014, 00:44
Aks67rus Aks67rus вне форума
Прохожий
 
Регистрация: 28.02.2014
Сообщения: 10
Версия Delphi: Delphi 10 lite
Репутация: 10
По умолчанию

Это практическое задание, поэтому не сильно страшно. А как лучше реализовывать это, если делать серьёзный программный продукт?
Ответить с цитированием
  #6  
Старый 01.03.2014, 01:10
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Aks67rus
Всё,я исправил. А можете помочь с этим... При не правильном вводе пароля, показывает ShowMessage по всем пользователям а не по одному...как надо...
Чтобы такого не было условия нужно строить примерно так:
Код:
  if st='Артём' then
  begin
    if par='artem' then
    begin
      ShowMessage('Зравствуйте, Артём! У вас высший уровень доступа!');
      RadioButton1.Visible:=...
    end else
    begin
      ShowMessage('Пароль введен не верно, осталось ...
    end;
  end else
  if st='Максим' then
  begin
    if par='maxim' then
    begin
      ShowMessage('Зравствуйте, Максим! Вам доступны секретные данные!');
      RadioButton1.Visible:=...
    end else
    begin
      ShowMessage('Пароль введен не верно, осталось ...
    end;
  end else
  if st='Александр' then
  begin
    if par='sasha' then
    begin
      ShowMessage('Зравствуйте, Александр! Вам доступны открытые данные!');
      RadioButton1.Visible:=...
    end else
    begin
      ShowMessage('Пароль введен не верно, осталось ...
  end else
  if st=...

А вообще массив здесь так и напрашивается. Или же отдельная таблица базы данных.
Ответить с цитированием
  #7  
Старый 01.03.2014, 03:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от poli-smen
...А вообще массив здесь так и напрашивается...
Точно
Код:
var
errcnt: integer = 3;

ms: array[0..2] of array[0..4] of string =
 (('Артём','Максим','Александр','Владислав','Анатолий'),
  ('artem','maxim','sasha','vlad','tolik'),
 ('Здравствуйте, Артём! У вас высший уровень доступа!',
  'Здравствуйте, Максим! Вам доступны секретные данные!',
  'Здравствуйте, Александр! Вам доступны открытые данные!',
  'Здравствуйте, Владислав! Вам доступны открытые данные!',
  'Здравствуйте, Анатолий! Вам доступны секретные данные!'));

 procedure TForm1.Button1Click(Sender: TObject);
var
user, pwd, i :integer;
begin
 user:= 0;
 pwd:= -1;

 for i:= 0 to 4 do 
  begin
   if ComboBox1.Text  =  ms[0,i] then user:= i;
   if Edit1.Text =  ms[1,i] then pwd := i;
  end;

 if pwd >= 0 then
  begin
  if user = pwd then
  begin

  { case user of
   0: что-то делаем для каждого пользователя
   1:
   2:
   3:
   4:
   end;
   }

  errcnt:= 3;

  ShowMessage(ms[2, user]);
  end;

  end else
  begin
  Dec(errcnt);
  if errcnt = 2 then ShowMessage('Пароль введен не верно, осталось 2 попытки!');
  if errcnt = 1 then ShowMessage('Пароль введен не верно, осталась 1 попытка!');
  if errcnt = 0 then form1.Close;
  end;

end;
проще стало по-новой набрать чем в коде копаться, добавьте пжлст не достающее сами

З.Ы. Посмотрел архив - у меня форматёр завис намертво кстати, у компонента Edit есть свойство PasswordChar, замените #0 на * и будут звёздочки вместо пароля

Последний раз редактировалось Alegun, 01.03.2014 в 03:19.
Ответить с цитированием
  #8  
Старый 01.03.2014, 18:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
А как лучше реализовывать это, если делать серьёзный программный продукт?
Сообщения по-хорошему должны генерироваться из шаблона ("Здравствуйте, <имя>! <сообщение>").
Имена и их конфигурации должны быть во внешнем (шифрованном) файле или базе и загружаться при старте программы. Пароли - в виде хешей, тоже где-то снаружи.
Далее нужно найти пользователя (пройти по загруженному массиву и сравнить), потом проверить соответствующий пароль. Подгрузить соответствующую конфигурацию (в данном случае конфиг - требуемые RadioButton'ы). Все это делается легко и просто.

А вот если продукт действительно серьезный - то нужно защитить информацию в файле от несанкционированной модификации и привязать выполнение любой операции к правильности пароля и конфига. Чтобы нельзя было тупо найти окна радиобаттонов и сделать их видимыми снаружи программы.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter