0 / 0 / 0
Регистрация: 18.08.2018
Сообщений: 32
1

Ошибка 'access violation' при попытке свернуть форму

21.01.2020, 01:12. Показов 2062. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я нашел на этом форуме код который открывает форму авторизации перед тем как запустить всю программу полностью

вот код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TfrmLogin = class(TForm)
    Button1: TButton;
    Button2: TButton;
    edtLogin: TEdit;
    edtPass: TEdit;
    procedure Button1Click(Sender: TObject);
  end;
 
  // функция авторизации. ее можно вызывать потом и при работе программы (ну мало ли :))
  // проверять результат и принимать решение
  function Authorized: boolean;
 
implementation
 
{$R *.dfm}
 
// отображение окна авторизации
function Authorized: boolean;
begin
  with TfrmLogin.Create(Application) do
  begin
    Result:= ShowModal = mrOk;
    Free;
  end;
end;
 
// DUMP-функция. проверка карректности данных
function CheckLogin(const Login,Password: string): boolean;
begin
  Result:= true;
end;
 
procedure TfrmLogin.Button1Click(Sender: TObject);
begin
  // click on OK button
  if CheckLogin(edtLogin.Text,edtPass.Text) then ModalResult:= mrOk else
  begin
    ShowMessage('Incorrect!');
    edtLogin.Clear;
    edtPass.Clear;
    edtLogin.SetFocus;
  end;
end;
 
end.
и

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program Project1;
 
uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {frmMain},
  Unit2 in 'Unit2.pas' {frmLogin},
  Vcl.Themes,
  Vcl.Styles;
 
{$R *.res}
 
begin
  Application.Initialize;
  TStyleManager.TrySetStyle('Glow');
  if not Authorized then Exit;                // добавим всего одну строчку
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.
код приводил такой человек как DenNik, единственное отличие это то что в моем проекте используется тема оформления "Glow" (пробовал и на других темах ошибка везде)

думал что где-то в проекте допустил ошибку и поэтому выскакивает access violation но потом создал новый проект и использовал только код который привел выше но access violation все равно выскакивает при попытке свернуть форму авторизации

но если убрать тему оформления то access violation при свертывании не появляется

подскажите в чем проблема?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2020, 01:12
Ответы с готовыми решениями:

Ошибка Access Violation при попытке создать объект класса. В чем может быть проблема?
Код класса unit Unit2; interface uses SysUtils; type ABCMatrix = class private

Access Violation при попытке выполнить php - скрипт на сервере
Код примерно следующий: var HTTP: TIdHTTP; Key: String; begin Key := InputBox('Password...

Delphi 2010: получаю Access Violation при попытке настроить Build Configuration
Кликаю ПКМ на конфигурации "Release", потом выбираю пункт "Edit..." и вылезает Access Violation....

Подвисает при попытке свернуть свое окно программным нажатием мышью по значку свернуть
Windows.SetCursorPos(x,y); if mh.move=false then begin if mh.LBtn then begin if...

7
Нарушитель
8593 / 4598 / 1060
Регистрация: 12.03.2015
Сообщений: 21,582
21.01.2020, 08:30 2
Цитата Сообщение от Ваня Поздно Посмотреть сообщение
подскажите в чем проблема?
Какого МПХ у твоей формы авторизации есть возможность свёртывания?
0
Житель Земли
2999 / 2998 / 391
Регистрация: 26.07.2011
Сообщений: 11,459
Записей в блоге: 1
21.01.2020, 13:04 3
Цитата Сообщение от Ваня Поздно Посмотреть сообщение
подскажите в чем проблема?
как бы...
Цитата Сообщение от Ваня Поздно Посмотреть сообщение
но если убрать тему оформления то access violation при свертывании не появляется
и действительно, форме авторизации незачем иметь возможность свертывания, а если все же нужно (ну мало ли), то поскольку она не является главной формой приложения, нужно обеспечить ей значок в панели задач

З.Ы. говорят, что с родными темами проблемы бывают, может это одна из них

Добавлено через 15 минут
Цитата Сообщение от DenNik Посмотреть сообщение
нужно обеспечить ей значок в панели задач
не помогло. у меня тоже ошибка

значит, либо не сворачивать форму, либо не использовать стили

Добавлено через 1 минуту
ну или включай стиль после формы авторизации
Delphi
1
2
3
4
5
6
7
8
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  if not Authorized then Exit;
  TStyleManager.TrySetStyle('Cyan Night');
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
0
0 / 0 / 0
Регистрация: 18.08.2018
Сообщений: 32
21.01.2020, 16:31  [ТС] 4
а почему ошибка появляется? накинул тему и все сломалось, что там так кардинально все меняется? в чем может быть причина? не как не узнать что ее вызывает?
0
Нарушитель
8593 / 4598 / 1060
Регистрация: 12.03.2015
Сообщений: 21,582
21.01.2020, 16:38 5
Цитата Сообщение от Ваня Поздно Посмотреть сообщение
а почему ошибка появляется?
Вероятно, не все объекты, связанные с темами, созданы ДО создания главной формы приложения.
Попробуй выводить окно авторизации после создания главной формы, но ДО её показа.
1
Житель Земли
2999 / 2998 / 391
Регистрация: 26.07.2011
Сообщений: 11,459
Записей в блоге: 1
21.01.2020, 16:58 6
Лучший ответ Сообщение было отмечено Ваня Поздно как решение

Решение

Цитата Сообщение от Verevkin Посмотреть сообщение
Попробуй выводить окно авторизации после создания главной формы, но ДО её показа.
таки помогло
Delphi
1
2
3
4
5
6
7
8
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  TStyleManager.TrySetStyle('Auric');
  Application.CreateForm(TForm1, Form1);
  if not Login then Exit;
  Application.Run;
end.
Добавлено через 4 минуты
я когда-то задавался вопросом отличия Application.CreateForm(TForm1, Form1); от Form1:= TForm1.Create(Application);, но не разобрался. Теперь, поковыряв исходник, понял, что первый вариант не только создает форму, но и назначает ее главной, ежели таковой до сих пор нет. И вот тут кроется решение упомянутого глюка.
нужно форму авторизации временно назначить главной, переделав функцию

Delphi
1
2
3
4
5
6
function Login: boolean;
begin
  Application.CreateForm(TForm2,Form2);
  Result:= (Form2.ShowModal = mrOk);
  FreeAndNil(Form2);
end;
таким образом, создается форма авторизации, становится главной формой приложения, а после уничтожения главной формой становится, собственно, Form1, как и полагается. И AV нет

Добавлено через 2 минуты
теперь последовательность такая (чтобы зря не создавать Form1)

Delphi
1
2
3
4
5
6
7
8
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  TStyleManager.TrySetStyle('Auric');
  if not Login then Exit;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
2
Житель Земли
2999 / 2998 / 391
Регистрация: 26.07.2011
Сообщений: 11,459
Записей в блоге: 1
21.01.2020, 17:01 7
А вот если вызвать Форму "Логин" из другой формы, то она не будет сворачиваться в панель задач без доработки, ибо уже не главная
Миниатюры
Ошибка 'access violation' при попытке свернуть форму  
1
0 / 0 / 0
Регистрация: 18.08.2018
Сообщений: 32
21.01.2020, 17:46  [ТС] 8
DenNik, спасибо вроде помогло все работает теперь хорошо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2020, 17:46
Помогаю со студенческими работами здесь

При попытке присвоить полям новой структуры значений типа AnsiString появляется ошибка Access Violation
При попытке присвоить полям новой структуры значений типа AnsiString появляется ошибка. Как я...

Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом
Собстно ошибко "Project '...' raised exception class EAccessViolation with message 'Access...

При попытке свернуть дочернюю форму, сворачиваются все
При попытки свернуть дочернюю форму, сворачиваются все. Подскажите пожалуйста, какое свойство формы...

Access Violation при попытке добавить запись в DBMemo
Всем доброго времени суток. Подключён к БД через компоненты,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru