Консультация № 169701
22.06.2009, 05:29
0.00 руб.
0 13 0
Здравствуйте. У меня во время работы на Delphi 7 при вызове отчета вы ходит сообщение "Access violation at adress 004A592F in module 'Project1.exe'. Read of Adress 000000" Из за чего может появлятся данная ошибка? И как исправить?

Вопрос 2й
Как можно реализовать разграничение прав доступа в программе. У меня при вызове программы стоит форма авторизации с группами Администраторы и гости. Как сделать чтобы гости могли только просматривать программу, а админы имели полный доступ

Обсуждение

Неизвестный
22.06.2009, 05:38
общий
И если не трудно подскажите хороший русскоязычный справочник по ошибкам Delphi7
давно
Мастер-Эксперт
425
4118
22.06.2009, 07:28
общий
DaImeR:
И если не трудно подскажите хороший русскоязычный справочник по ошибкам Delphi7

Самый лучший - русско-английский словарь. Русскоязычных хороших нет и никогда не было. Хороший программист, априори, должен хорошо знать английский язык, т.к. именно на его основе строятся все без исключения языки программирования. Можно в книжном магазине книжки пересмотреть все по Дельфи - в какой-нибудь обязательно встретятся и описания кодов ошибок. Только сразу предупреждаю - той ошибки, которую Вы привели в вопросе, нет нигде, точнее описания её. В переводе с английского она означает, что Вы пытались получить доступ к объекту, который ещё не создали, либо уже удалили. Так что смотрите Ваш код, без кода узнать где именно ошибка невозможно.
А вот по второму вопросу - Вам сначала нужно определиться с объектами доступа в Вашей программе, только тогда можно понять, как разграничивать права доступа к ним.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
22.06.2009, 07:58
общий
Самое интересное когда я вчера перед сном работал ошибки этой не было, сегодня открываю и вот она.
А по второму вопросу. У меня есть на главной форме MainMenu и Panel. В MainMenu раположены пункты: Файл (Экспорт, Смена пользователя, Выход), Поиск, Пациент (Добавить, Редактировать, Изменить), Отчеты, Справка. На Panel расположены 2 кнопки, которые отображают определенную таблицу DBGrid с помощью visible. Гость из этого всего должен видеть только MainMenu: Файл и Справка. В данный момент я сделал так:
в форме авторизации сделал проверку
Код:

procedure TForm12.BitBtn1Click(Sender: TObject);
begin
case form12.ComboBox1.ItemIndex of
0: begin if ((form12.Edit1.Text)='')
then
begin
form1.Tag:=0;
form1.user.Caption:=inttostr(form1.Tag);
form1.ShowModal;
form12.Hide;
end
else begin
form12.Label3.Visible:=True;
form12.Edit1.Clear;
end;

end;
1: begin
form1.Tag:=1;
form1.user.Caption:=inttostr(form1.Tag);
form1.ShowModal;
form12.Hide;
end;
end;
end;


потом в главной форме при подключении к БД через меню Файл/Подключится к БД

Код:

procedure TForm1.N15Click(Sender: TObject);
begin
datamodule2.dbsalut.Connected:=True;
datamodule2.zaezd.Active:=True;
datamodule2.pacient.Active:=True;
datamodule2.TownTable.Active:=True;
datamodule2.OpozdanieMoney.Active:=True;
datamodule2.OpozdanieDay.Active:=True;
datamodule2.Dosro4noDay.Active:=True;
datamodule2.Dosro4noMoney.Active:=True;
case form1.Tag of
0: begin
form1.add.Enabled:=True;
form1.edit.Enabled:=True;
form1.delete.Enabled:=True;
form1.Button2.Enabled:=True;
form1.Button4.Enabled:=True;
form1.Button5.Enabled:=True;
form1.Button6.Enabled:=True;
form1.Button7.Enabled:=True;
form1.N2.Visible:=True;
form1.N3.Visible:=True;
form1.N4.Visible:=True;
form1.Panel1.Visible:=True;
end;
1: begin
form1.add.Enabled:=False;
form1.edit.Enabled:=False;
form1.delete.Enabled:=False;
form1.Button2.Enabled:=False;
form1.Button4.Enabled:=False;
form1.Button5.Enabled:=False;
form1.Button6.Enabled:=False;
form1.Button7.Enabled:=False;
form1.N2.Visible:=True;
form1.N3.Enabled:=False;
form1.N4.Enabled:=False;
form1.Panel1.Visible:=False;

end;
end;
end;



А нужно чтобы можно было Добавлять пользователей, сохранять и изменять их пароли
Неизвестный
22.06.2009, 08:28
общий
DaImeR:
Access violation at adress 004A592F in module 'Project1.exe'. Read of Adress 000000

Вы пытаетесь обратиться к не существующей переменной или к переменной не инициализированной или к переменной, которая уже освобождена.
А что имеется ввиду?
Как сделать чтобы гости могли только просматривать программу, а админы имели полный доступ

Если Вы знаете кто открыл Ваше программу, ну дак и скрывайте или делайте не доступным пункты меню - Enabled := False; Visible := False; и т.д.
давно
Мастер-Эксперт
425
4118
22.06.2009, 09:24
общий
DaImeR:
Самое интересное когда я вчера перед сном работал ошибки этой не было, сегодня открываю и вот она.

1. Значит вчера у Вас что-то было, чего сейчас нет, например файл-шаблон отчёта. Ночью злодеи его удалили. Сама ошибка ни о чём не говорит, она только сообщает, что в программе отсутствует какой-то объект, который непременно должен быть. Надо сделать пошаговое выполнение программы, т.е. найти процедуру, откуда эта ошибка выскакивает и вперёд, по шагам, каждую строчку. На какой строчке эта ошибка выскочит, в той строчке и несуществующий объект. Потом надо выявить, куды он девается.
2.
А нужно чтобы можно было Добавлять пользователей, сохранять и изменять их пароли

Вынесите все эти действия на отдельную форму. Запоминаете выбранного пользователя в форме авторизации и потом, при вызове формы административных действий, проверяете - если форму вызывает Администратор, то форма открывается и все действия по администрированию становятся доступными, если же Гость, то вместо формы администрирования выскакивает предупреждение "Цыц!":
Код:
If CurrentUser = "Администратор" Then
FormAdministrator.ShowModal
Else
MessageBox(0, 'Вы не можете проводить административные действия. Свяжитесь с Вашим Администратором.', 'Руки прочь от Гондураса!', MB_OK+MB_ICONSTOP+MB_APPLMODAL)
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
22.06.2009, 10:31
общий
DaImeR:
потом в главной форме при подключении к БД через меню Файл/Подключится к БД

А не проще ли просто назначить в БД пользователей, и СУБД сама определит, можно ли господину Пупкину что-то править в базе или только смотреть.?
Неизвестный
22.06.2009, 15:21
общий
Если можно будет изменять пароли через интерфейс делфи, то думаю так будет проще
Неизвестный
22.06.2009, 22:29
общий
Ночью злодеи его удалили.

Шайтанама xD. Завтра попробую реализовать, если что отпишусь:)
Неизвестный
24.06.2009, 20:09
общий
Все сделал, спасибо. А ошибка ты выходила из за того что один компонент ADOQuery не был активирован. Есть еще вопросы

1) Что лучше использовать ADOTable или ADOQuery?
2) Как делать трассировку? В паскале все было просто жмешь Ctrl+f7 вводишь нужную переменную и жмешь F7. А с делфи не могу разобратся
3) У меня есть готовый проект, там все пасовские файлы названы Unit1.pas Unit2.pas и т.д. Если я их просто переименую с проектом потом можно будет работать?
Неизвестный
24.06.2009, 20:36
общий
DaImeR:
1) Что лучше использовать ADOTable или ADOQuery?

Это разные вещи, таблица получает весь набор данных и держит его открытым, а запрос только то что надо - значительная экономия и трафика и скорость работы выше.
Но с запросом несколько сложней работать при редактировании/добавлении/удалении данных
2) Как делать трассировку? В паскале все было просто жмешь Ctrl+f7 вводишь нужную переменную и жмешь F7. А с делфи не могу разобратся

F7 F8 F9... Можно настроить среду как удобно, например так

3) У меня есть готовый проект, там все пасовские файлы названы Unit1.pas Unit2.pas и т.д. Если я их просто переименую с проектом потом можно будет работать?

"Проект" - это просто главный файл модуля, где перечислены все формы..
Код:
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
Unit4 in 'Unit4.pas' {Form4};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.

Но не надо забывать, что формы "привязаны".. в общем, обычно просто из проекта сохраняют под другим именем..
Если же это не файлы форм, то можно запросто переименовать, только в программе не забыть это подкорректировать.
Неизвестный
24.06.2009, 20:48
общий
1) Мне для поиска данных и для отображения данных в отчетах. Думаю Query лучше будет
2) Как отобразить эту панель, которая Вы указали?
3) Все понятно:)
Неизвестный
24.06.2009, 20:55
общий
2) Как отобразить эту панель, которая Вы указали?

View -> Debug windows -> Watches, Local variables. Окна плавающие, паркуются к основному окну. А что бы не потерять это состояние - то после того как настроится вид окна, жмем кнопку вверху (у меня красная стрелка) save current desctop.. Кстати, так же можно настроить и вид для консоли - убрать все, оставить только код и дерево классов и так же сохранить дав название, например Console и так же для формы..
Потом, просто можно выбрать из списка сохраненные шаблоны и окно отобразиться так как надо - весьма удобно.
Неизвестный
24.06.2009, 21:19
общий
Большое спасибо, оч помогли
Форма ответа