Консультация № 174181
13.11.2009, 16:00
0.00 руб.
13.11.2009, 16:47
0 53 0
Здравствуйте! Имеется исходник «БД: Расписание учебных занятий»: http://fileshare.in.ua/2948087
Нужно сделать:
1) возможность вывода на печать таблицы в том в виде, в котором она представлена в данный момент на экране
2) парольную защиту, а именно чтобы была возможность входа в программу под администратором и пользователем. При входе в программу под администратором нужно будет вводить пароль, а под пользователем пароль вводить не нужно. При входе в программу под пользователем обеспечить невозможность редактирования данных и добавления новых данных
3) в полях: наименование дисциплины, преподаватель, день недели - невозможность ввода цифр и символов, а только букв. При вводе символов и цифр обеспечить вызов ошибки с сообщением " Поле "Наименование поля" не может состоять из символов или чисел".
Заранее огромное спасибо!

Обсуждение

давно
Профессионал
153662
1070
14.11.2009, 19:06
общий
Судейкин Андрей Владимирович:
Я это написал для модераторов, к Вам это не относится.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
14.11.2009, 19:08
общий
ааааа ясно
Неизвестный
15.11.2009, 19:18
общий
всё никак не получается самому поменять пароль... можете объяснить поподробней? Вот точку останова в строке end; как вы говорили я сделал, а где нужно записать новый пароль пароль?
давно
Профессионал
153662
1070
15.11.2009, 19:32
общий
Нужно в строке if Pass(MaskEdit1.Text, '''''''''''') then // Вызов функции шифровки пароля заменить '''''''''' на из строки result := s = pas; в переменной s (в этой переменной и будет новый пароль, который и нужно вставить). В крайнем случаи напишите Ваш новый пароль, я напишу что нужно вставить.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
15.11.2009, 19:39
общий
а куда именно нужно записать ещё не зашифрованный пароль чтобы он появился в строке result := s = pas; в переменной s ???
давно
Профессионал
153662
1070
15.11.2009, 19:46
общий
В поле ввода пароля после запуска программы вводите нужный пароль.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
15.11.2009, 19:50
общий
разобрался, спасибо!
Неизвестный
15.11.2009, 20:01
общий
странно почему то когда вставляю в строку if Pass(MaskEdit1.Text, '''''''''''') вместо '''''''''''''''''' новый зашифрованный пароль и затем пытаюсь запустить или откомпилировать программу компилятор начинает ругатся [Error] PasDlg.pas(72): Illegal character in input file: '%' ($25)
давно
Профессионал
153662
1070
15.11.2009, 20:07
общий
Пароль нужно вставить в 'кавычках'.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
15.11.2009, 20:14
общий
ввел в кавычках, теперь выводится другая ошибка [Error] PasDlg.pas(72): Illegal character in input file: '&' ($26) вообщем пароль 230105, зашифрованный '%$'&''''
давно
Профессионал
153662
1070
15.11.2009, 20:47
общий
Ошибка из-за апострофов, вернее их количества, Ваша строка должна выглядеть так '%$''&''''''', но почему то при сравнении этих строк они не равны, хотя в листе с точками остановок они абсолютно одинаковые, переделайте функцию так
Код:
function Pass(ss, pas: String): boolean;  //  Функция шифровки пароля
var
i: integer;
s: String[255];
c: array[0..255] of Byte absolute s;
begin
s:= ss;
for i := 1 to Ord(s[0]) do
c[i] := 21 xor c[i]; // Изменил 23 на 21
result := s = pas;
end;
и пароль получится в виде '''&%$% ' и тогда он заработает.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
15.11.2009, 21:01
общий
заменил. Пароль получился ''&%$% ' ( вначале на один апостраф меньше чем у вас) и всё равно компилятор ругается. Добавляю как у вас написано ещё один вначале апостраф - компилятор не ругается, программа запускается, ввожу пароль 230105 пишет пароль не верный...
давно
Профессионал
153662
1070
15.11.2009, 21:08
общий
Меняете так if Pass(MaskEdit1.Text, '''&%$% ') then? Компилятор ругается на количество апострофов. так как '' это пустая строка и следующие символы уже вызывают ошибку, а так ''' это строка ', '''' - '' и так далее.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
15.11.2009, 21:18
общий
разобрался, спасибо!
Неизвестный
16.11.2009, 18:13
общий
Можете посмотреть: почему то при корректировке данных, допустим в поле "День недели" я случайно написал вместо "Понедельник" слово "Понедельтт", стираю две буквы начинаю писать правильные буквы - выводится сообщение "поле "День недели" не может превышать 11 символов", хотя я их ещё не превысил. Или вместо надписи "Пятница" хочу записать "Четверг" - стираю "Пятница" начинаю писать "Четверг" и после того как я написал "Четв" выводится сообщение "поле "День недели" не может превышать 11 символов". Аналогичная ситуация и во всех других полях, ну кроме поля Время....
давно
Профессионал
153662
1070
16.11.2009, 18:53
общий
Поменяйте procedure TForm1.DBGrid1KeyPress
Код:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);  //   Нажатие клавиш в сетке
var
s: string;
begin
If DBGrid1.ReadOnly then
begin
a:= 0;
ShowMessage('Вы не можете редактировать данные и вносить новые т.к. ваш уровень доступа "Пользователь"');
exit;
end;
//
a:= 1;
if DBGrid1.SelectedField.FieldName <> 'DisTime' then // Если текущее поле не равно DisTime
case key of // Разрешаем вводить буквы, точку, enter, backspace, пробел
'a'..'z' : inc(strdln);
'A'..'Z' : inc(strdln);
'а'..'я' : inc(strdln);
'А'..'Я' : inc(strdln);
'.' : inc(strdln);
#13 : ;
#8 : If strdln > 0 then
Dec(strdln);
#32 : inc(strdln);
else
begin
key:= #0; // Все отстальные символы не отображаем и выводим предупреждение
If DBGrid1.SelectedField.FieldName = 'NameDis' then
s:= 'Наименование дисциплины'
else
If DBGrid1.SelectedField.FieldName = 'Prepod' then
s:= 'Преподаватель'
else
If DBGrid1.SelectedField.FieldName = 'WeekDay' then
s:= 'День недели';
ShowMessage('Поле ''' + s + ''' не может состоять из символов или чисел');
end;
end;
If (DBGrid1.SelectedField.FieldName = 'NameDis') and (strdln >= 71) then
ShowMessage('Поле "Наименование дисциплины" может содержать не более 70 символов');
If (DBGrid1.SelectedField.FieldName = 'Prepod') and (strdln >= 41) then
ShowMessage('Поле "Преподаватель" может содержать не более 40 символов');
If (DBGrid1.SelectedField.FieldName = 'WeekDay') and (strdln >= 12) then
ShowMessage('Поле "День недели" может содержать не более 11 символов');
end;
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.11.2009, 19:37
общий
всё равно выводятся сообщения....
давно
Профессионал
153662
1070
16.11.2009, 20:22
общий
Тогда так
Код:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);  //   Нажатие клавиш в сетке
var
s: string;
begin
If DBGrid1.ReadOnly then
begin
a:= 0;
ShowMessage('Вы не можете редактировать данные и вносить новые т.к. ваш уровень доступа "Пользователь"');
exit;
end;
//
a:= 1;
if DBGrid1.SelectedField.FieldName <> 'DisTime' then // Если текущее поле не равно DisTime
case key of // Разрешаем вводить буквы, точку, enter, backspace, пробел
'a'..'z' : inc(strdln);
'A'..'Z' : inc(strdln);
'а'..'я' : inc(strdln);
'А'..'Я' : inc(strdln);
'.' : inc(strdln);
#13 : ;
#8 : If strdln > 0 then
Dec(strdln);
#32 : inc(strdln);
else
begin
key:= #0; // Все отстальные символы не отображаем и выводим предупреждение
If DBGrid1.SelectedField.FieldName = 'NameDis' then
s:= 'Наименование дисциплины'
else
If DBGrid1.SelectedField.FieldName = 'Prepod' then
s:= 'Преподаватель'
else
If DBGrid1.SelectedField.FieldName = 'WeekDay' then
s:= 'День недели';
ShowMessage('Поле ''' + s + ''' не может состоять из символов или чисел');
end;
end;
If (DBGrid1.SelectedField.FieldName = 'NameDis') and (strdln >= 71) then
begin
If strdln > 70 then
strdln:= 70;
ShowMessage('Поле "Наименование дисциплины" может содержать не более 70 символов');
end;
If (DBGrid1.SelectedField.FieldName = 'Prepod') and (strdln >= 41) then
begin
If strdln > 40 then
strdln:= 40;
ShowMessage('Поле "Преподаватель" может содержать не более 40 символов');
end;
If (DBGrid1.SelectedField.FieldName = 'WeekDay') and (strdln >= 12) then
begin
If strdln > 11 then
strdln:= 11;
ShowMessage('Поле "День недели" может содержать не более 11 символов');
end;
end;
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.11.2009, 20:45
общий
не помогло....
давно
Профессионал
153662
1070
16.11.2009, 21:06
общий
Ясно, косяк вылазит если выделить ячейку и нажать клавишу bakspase.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.11.2009, 21:16
общий
и что никак не убрать косяк?
давно
Профессионал
153662
1070
16.11.2009, 22:27
общий
Попробуйте вот это
Код:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);  //   Нажатие клавиш в сетке
var
s: string;
begin
If DBGrid1.ReadOnly then
begin
a:= 0;
ShowMessage('Вы не можете редактировать данные и вносить новые т.к. ваш уровень доступа "Пользователь"');
exit;
end;
//
a:= 1;
if DBGrid1.SelectedField.FieldName <> 'DisTime' then // Если текущее поле не равно DisTime
case key of // Разрешаем вводить буквы, точку, enter, backspace, пробел
'a'..'z' : inc(strdln);
'A'..'Z' : inc(strdln);
'а'..'я' : inc(strdln);
'А'..'Я' : inc(strdln);
'.' : inc(strdln);
#13 : ;
#8 : If strdln > 0 then
Dec(strdln);
#32 : inc(strdln);
else
begin
key:= #0; // Все отстальные символы не отображаем и выводим предупреждение
If DBGrid1.SelectedField.FieldName = 'NameDis' then
s:= 'Наименование дисциплины'
else
If DBGrid1.SelectedField.FieldName = 'Prepod' then
s:= 'Преподаватель'
else
If DBGrid1.SelectedField.FieldName = 'WeekDay' then
s:= 'День недели';
ShowMessage('Поле ''' + s + ''' не может состоять из символов или чисел');
end;
end;
If (DBGrid1.SelectedField.FieldName = 'NameDis') and (strdln = 71) then
ShowMessage('Поле "Наименование дисциплины" может содержать не более 70 символов');
If (DBGrid1.SelectedField.FieldName = 'Prepod') and (strdln = 41) then
ShowMessage('Поле "Преподаватель" может содержать не более 40 символов');
If (DBGrid1.SelectedField.FieldName = 'WeekDay') and (strdln = 12) then
ShowMessage('Поле "День недели" может содержать не более 11 символов');
end;

procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word; // Определение длины вводимой строки
Shift: TShiftState);
var
B: byte;
begin
for B := 0 to DBGrid1.ControlCount - 1 do
if DBGrid1.Controls[B] is TInPlaceEdit then
with DBGrid1.Controls[B] as TInPlaceEdit do
strdln := Length(Text);
end;
Определение длины вводимой строки нашёл на просторах интернета.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.11.2009, 22:48
общий
не помогло....
давно
Профессионал
153662
1070
17.11.2009, 09:20
общий
Ну я не знаю, вот моя программа.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
17.11.2009, 13:30
общий
и вправду работает, можете скинуть свой исходник?
давно
Профессионал
153662
1070
17.11.2009, 14:50
общий
Вы добавили procedure TForm1.DBGrid1KeyUp в инспекторе объектов тоже?
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
17.11.2009, 15:30
общий
нет. Теперь добавил, всё работает, спасибо!
Неизвестный
17.11.2009, 15:44
общий
почему то когда перемещаешь файл запуска программы (Project_SQL.exe) а потом пытаешься его запустить выводится сообщение "Похоже база не найдена" и затем выводится окно поиска базы, но как не пытаешься открыть файл базы выводится сообщение "Похоже база не найдена", даже невозможно закрыть окно поиска базы постоянно выводится это сообщение...
давно
Профессионал
153662
1070
17.11.2009, 16:15
общий
Если немного подумать, то можно сделать хотя бы так:
Код:
procedure TForm1.OpenDialog1CanClose(Sender: TObject;
var CanClose: Boolean);
begin
a:= 2;
// Подключение базы
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='
+OpenDialog1.FileName+';Persist Security Info=True;Jet OLEDB:Database Password=lekchii;'; // Добавление параметров базы
Try
ADOConnection1.Connected:=true; // Подключение баз
Except
MessageDlg('Похоже база не найдена',mtWarning,[mbOK],0);
OpenDialog1.Execute; // Вывод диалога выбора базы
end;
end;

procedure TForm1.OpenDialog1Close(Sender: TObject);
begin
If a <> 2 then
begin
ShowMessage('База данных не выбрана программа будет закрыта.');
Application.Terminate;
end;
end;
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
17.11.2009, 16:36
общий
спасибо!
Форма ответа