Нарушение прав доступа Когда Form2 пытается редактировать form1 В delphi - PullRequest
2 голосов
/ 07 февраля 2012

Например, когда я пытаюсь сделать что-то подобное

form2.Edit1.text=form1.edit1.text

Это дает мне ошибку нарушения доступа.

Способ form2 может использовать переменные form1 путем добавления

uses Unit1; var Form1:Tform1

до реализации

Программа прекрасно компилируется без ошибок, но при попытке реального доступа к edit1 из формы 1 происходит сбой с ошибкой.

edit:

Кажется, что это работает, когда я добавляю unit1 в список «использований» не в стадии реализации, а под интерфейсом

, что означает, что unit2 может редактировать unit1, но я не могу добавить unit2 к использованию интерфейсаединицы измерения круговой единицы 1

Вкратце это означало

  • unit2 может редактировать / просматривать unit1
  • unit1 не может редактировать / просматривать unit2

Так есть ли способ сделать это возможным без создания третьего кадра, на который ссылаются два других блока?

Ответы [ 5 ]

3 голосов
/ 07 февраля 2012

В вашем проекте есть две переменные с именем Form1.Код в файле .dpr создает TForm1 и сохраняет ссылку в one из двух Form1 переменных.Затем вы ссылаетесь на другого неназначенного Form1.

Это объясняет, почему вы получаете нарушение прав доступа.Как это исправить?Просто удалите переменную Form1 из Unit2.Используйте функцию «Найти в файлах», чтобы убедиться, что у вас есть только одно объявление Form1, Form2 и т. Д. Во всем вашем проекте.

Если вы сделаете это правильно, у вас не будет проблем с использованием каждого юнитадругой, из раздела реализации, без проблем с циклической ссылкой.

Чтобы лучше понять и понять это, я предлагаю вам прочитать файл .dpr, чтобы понять, как инициализируются глобальные переменные.Я также рекомендую прочитать раздел руководства по языку Delphi по разрешению области, чтобы понять, как компилятор разрешает ситуации, когда два идентичных имени видны в одном месте.

2 голосов
/ 07 февраля 2012

Нет необходимости объявлять form1 как переменную внутри form2 - будет глобальная переменная с именем 'form1'.

0 голосов
/ 07 февраля 2012

Правильным ответом для меня было добавление unit1 к интерфейсу unit2 и добавление unit2 к реализации unit1

То есть, поскольку unit1 является главной формой, а unit2 открывается unit1.поэтому добавление unit1 к реализации unit2 не будет работать.Это сработало бы, если бы оба блока были открыты вместе.

0 голосов
/ 07 февраля 2012

Тот факт, что ваш проект компилируется, означает, что переменная "Form2" объявлена ​​ и, таким образом, "известна" компилятору.Тот факт, что он дает нарушение доступа, означает, что для этой переменной нет действительного объекта.Есть несколько возможностей.Во-первых, Form2 должен быть создан с помощью IDE (автоматически создавать форму в настройках проекта) или с помощью вашего кода.Во-вторых, не должно быть второй переменной с именем «Form2», которая бы «скрывала» переменную с объектом Form2.

Вы можете и должны избегать циклических ссылок в ваших предложениях использования.Используйте их в разделе "интерфейс", если это возможно.Конечно, вы можете ссылаться более чем на две единицы ...

0 голосов
/ 07 февраля 2012

Поместить Unit1 в реализацию, использует в Unit2. Не объявляйте Form1 в Unit2. Если вы объявляете Form1 в Unit2 и не назначаете ей значение, это будет нулевой указатель, дающий нарушение прав доступа при доступе. Если вы освободили форму Form1 или не создали ее, это также приведет к нарушению прав доступа.

...