Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/47: Рейтинг темы: голосов - 47, средняя оценка - 4.53
0 / 0 / 1
Регистрация: 27.11.2016
Сообщений: 99
1

Ошибка 'Error privileged instruction' при попытке вызвать процедуру

09.02.2017, 02:27. Показов 9631. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При попытке вызвать процедуру другой формы из другого юнита передаваемую как параметр, получаю
error privileged instruction
Delphi
1
2
3
4
5
6
7
8
9
10
unit Unit1;
.......................
procedure THeaderFooterForm.Button1Click(Sender: TObject);
begin
  ShowMessageModal(Self, changeqwesttext, @procedure
        begin
    changeqwest;
  TabControl1.TabIndex := 1;
        end);
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
unit MessageModal;
......................
  Defproc = procedure;
......................
procedure ShowMessageModal(Self: TForm; const AMessage: string;
  ADefProc: Defproc);
var
  locMessageForm: TMessageForm;
begin
  locMessageForm := TMessageForm.Create(Self);
...............................
  locMessageForm.showModal(    procedure(Result: TModalResult)
    begin
      if Result = mrOk then
      begin
      ADefProc;  //ВЫЛЕТАЕТ
      locMessageForm.CloseModal;
      end;
      end);
end;
. Вызовов ShowMessageModal достаточно много и мне бы не хотелось описывать каждую передаваемую процедуру отдельно. Подскажите, пожалуйста, в чём моя ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2017, 02:27
Ответы с готовыми решениями:

[Error SIGSEGV] Возникает ошибка при попытке присваивания
Есть 3 юнита: Первый - основной интерфейс программы Второй - интерфейс загрузки (тут ProgressBar)...

Ошибка при попытке открыть проект: Error Reading Form
Доброе время суток. Можете подсказать с одной проблемой? На днях меня попросили подкорректировать...

Ошибка ORA-00900 при попытке вызвать процедуру из C#
Здрасьте! Ошибка появляется когда я пытаюсь вызвать процедуру через C# (связь OleDB). Процедура:...

Сообщение "Privileged instruction" при запуске дочерней формы из DLL
При попытке запустить дочернюю форму из DLL вылетает ошибка "Privileged instruction". Самое...

11
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
09.02.2017, 08:57 2
предположу что
defproc = reference to procedure

и собачка выглядит лишней
0
0 / 0 / 1
Регистрация: 27.11.2016
Сообщений: 99
09.02.2017, 17:01  [ТС] 3
Цитата Сообщение от krapotkin Посмотреть сообщение
предположу что
defproc = reference to procedure
и собачка выглядит лишней
Тогда компилятор выдаёт
[dcc32 Error] Unit1.pas(1103): E2010 Incompatible types: 'Defproc' and 'Procedure'
0
Заблокирован
09.02.2017, 17:56 4
Цитата Сообщение от Ллирик Посмотреть сообщение
Код
unit Unit1;
.......................
procedure THeaderFooterForm.Button1Click(Sender: TObject);
begin
  ShowMessageModal(Self, changeqwesttext, @procedure
        begin
    changeqwest;
  TabControl1.TabIndex := 1;
        end);
end;
Вы передаёте указатель на анонимную функцию - оттого и вылетает. Жаль, что подобное **рьмо вообще компилируется. Эмбаркадеровцам жирный МИНУС.
0
0 / 0 / 1
Регистрация: 27.11.2016
Сообщений: 99
09.02.2017, 19:54  [ТС] 5
Цитата Сообщение от Stertor Посмотреть сообщение
Вы передаёте указатель на анонимную функцию - оттого и вылетает. Жаль, что подобное **рьмо вообще компилируется. Эмбаркадеровцам жирный МИНУС.
И что Вы предлагаете сделать?
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
09.02.2017, 19:56 6
а в чем проблема?
ява вон вся на анонимках стоит, живут же. каша в кода - это да, но иногда...
Ллирик,
посмотрите, как объявлен метод ShowModal и сделайте так же
вам же это нужно?
0
Заблокирован
09.02.2017, 21:33 7
Цитата Сообщение от Ллирик Посмотреть сообщение
И что Вы предлагаете сделать?
Устроить деанон.

Добавлено через 1 час 16 минут
procedure ShowMessageModal(Self: TForm; const AMessage: string;
ADefProc: Defproc);
var
locMessageForm: TMessageForm;
begin
locMessageForm := TMessageForm.Create(Self);


банальное переполнение стека.
0
0 / 0 / 1
Регистрация: 27.11.2016
Сообщений: 99
09.02.2017, 21:51  [ТС] 8
Цитата Сообщение от Stertor Посмотреть сообщение
Добавлено через 1 час 16 минут
procedure ShowMessageModal(Self: TForm; const AMessage: string;
ADefProc: Defproc);
var
locMessageForm: TMessageForm;
begin
locMessageForm := TMessageForm.Create(Self);
банальное переполнение стека.
Вы это вообще о чём?))
0
Заблокирован
09.02.2017, 22:02 9
О том, что синтаксический сахар Self используется как аргумент.

Код
locMessageForm := TMessageForm.Create(Self);
В этом месте- неоднозначность, т.к. нельзя точно понять, подразумевается ли аргумент Self, или пространство имен Self.

Это мой последний пост в этой темке, думаю, что сообщил достаточно. Я сваливаю.
0
0 / 0 / 1
Регистрация: 27.11.2016
Сообщений: 99
09.02.2017, 22:20  [ТС] 10
Цитата Сообщение от krapotkin Посмотреть сообщение
посмотрите, как объявлен метод ShowModal и сделайте так же
вам же это нужно?
Delphi
1
2
3
4
5
procedure TCommonCustomForm.ShowModal(const ResultProc: TProc<TModalResult>);
begin
  FResultProc := ResultProc;
  Show;
end;
FResultProc объявлена как внутренняя процедура TCommonCustomForm, а мне бы хотелось чтоб ShowMessageModal была внешней как ShowMessage, чтоб её можно было использовать и в последующий программах без лишней возни

Добавлено через 14 минут
Цитата Сообщение от Stertor Посмотреть сообщение
О том, что синтаксический сахар Self используется как аргумент.
Код
locMessageForm := TMessageForm.Create(Self);
В этом месте- неоднозначность, т.к. нельзя точно понять, подразумевается ли аргумент Self, или пространство имен Self.
Естественно подразумевается аргумент Self, ведь процедура внешняя и у неё нет пространства имен
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
09.02.2017, 23:04 11
не надо использовать Self

все просто. я же говорю, смотрите на ShowModal
Кликните здесь для просмотра всего текста
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
unit Unit2;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls;
 
type
  TForm2 = class(TForm)
    b1: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
procedure ShowMess(OkProc:TProc);
 
implementation
 
{$R *.fmx}
procedure ShowMess(OkProc:TProc);
begin
  form2:=TForm2.Create(nil);
    Form2.ShowModal(
      procedure (R:TModalResult)
      begin
        if r=mrOk then
          OkProc();
      end);
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  action:=TCloseAction.caFree;
end;
 
end.

и вызов
Delphi
1
2
3
4
5
6
procedure TForm1.b1Click(Sender: TObject);
begin
  ShowMess(procedure begin
    ShowMessage('All works');
  end );
end;
Добавлено через 38 секунд
на Form2 у кнопки установлен modalResult = mrOk
0
0 / 0 / 1
Регистрация: 27.11.2016
Сообщений: 99
10.02.2017, 04:31  [ТС] 12
Цитата Сообщение от krapotkin Посмотреть сообщение
не надо использовать Self
Self я там использую для других целей)

Добавлено через 20 минут
krapotkin, спасибо Вам большое! Разобрался
0
10.02.2017, 04:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2017, 04:31
Помогаю со студенческими работами здесь

Ошибка при попытке вызвать редактор локальной групповой политики gpedit.msc
При попытке вызвать редактор локальной групповой политики командой gpedit.msc выскакивает это окно...

Ошибка при попытке подключения: DBX Error
rad studio xe mysql 5.5.13 win 7 x64 ultimate пытаюсь подключиться к mysql с помощью dbexpress....

Ошибка при попытке запустить программу (It is an error to use a section registered as allowDefinition)
Пытаюсь разобраться в чужом коде - сайт на ASP.NET. При запуске получаю ошибку It is an error to...

При попытке обновить запись в базе данных вываливается ошибка Syntax Error из-за пробелов в тексте.
В Textarea загружается из базы данных(MSSQL server) текст с пробелами, где этот текст может...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru