общедоступная процедура не отображается в Delphi XE8

У меня есть вторичная форма для входа в мое приложение, для которой у меня есть процедура AddLine:

type
  TFormLog = class(TForm)
    Memo1: TMemo;
  private
    procedure AddLine(aString: String);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormLog: TFormLog;

implementation

{$R *.dfm}

{ TFormLog }

procedure TFormLog.AddLine(aString: String);
begin
  Memo1.Lines.Add(aString);
end;

Когда я использую автозаполнение (Ctrl-Shift_C), Delphi добавляет процедуру AddLine в раздел private, поэтому очевидно, что процедура невидима для основной формы, когда я пытаюсь

FormLog.AddLine('some text');

Но перемещение объявления в общедоступный раздел не помогает:

type
  TFormLog = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
  public
    { Public declarations }
    procedure AddLine(aString: String);
  end;

Я все еще получаю ошибку компилятора, что процедура AddLine не разрешена. Я добавил единицу журнала в предложение uses, поэтому Formlog известно в основной форме.
Попытка прямого доступа к TMemo дает тот же эффект.

Как я могу исправить свой код, чтобы я мог добавлять текст в форму журнала из моей основной формы?


person Joris Groosman    schedule 11.01.2016    source источник
comment
Переместите AddLine в общедоступный раздел и сохраните форму. Добавьте устройство в свой проект. Если это не работает, компилятор должен подбирать другой модуль с таким же именем или использовать ранее скомпилированный модуль (каким-то образом не видя исходный код).   -  person LU RD    schedule 11.01.2016
comment
Что касается выбора другого модуля, я бы запустил procmon, начал компиляцию, остановил procmon и проверил, какие файлы .pas компилируются. Скорее всего, это не тот, который вы предполагаете.   -  person Lieven Keersmaekers    schedule 11.01.2016
comment
Сообщите о своей фактической ошибке и покажите фактический проблемный код, а не код, который работает. Правильный код не имеет значения. Используйте копирование и вставку, чтобы сообщить об ошибках компилятора, но это не работает, или я получаю ошибку компилятора.   -  person Warren P    schedule 11.01.2016


Ответы (2)


Публичные члены видны из кода в других модулях. Возможные объяснения вашей ошибки включают в себя:

  1. Метод не является общедоступным.
  2. Ваша переменная экземпляра не имеет того типа, о котором вы думаете.
  3. Вы компилируете не тот код, который, по вашему мнению, компилируете, или компоновщик находит код, который вы не намеревались находить.

Вы также говорите:

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

Опять же, поскольку это опубликовало видимость, оно видно снаружи устройства. Ясно, что происходит что-то похожее на пункты 2 или 3 выше.

Суть в том, что публичные (и опубликованные) члены видны из любого кода. Проблема в вашем коде (который только вы можете видеть), и вы должны попытаться решить ее, задавая вопросы по этому коду, а не беспокоясь о том, что компилятор неисправен.

На более широком уровне код, представленный в вопросе, объявляет метод как private. Ясно, что этот член не виден из-за пределов подразделения. Как правило, вы должны представить код, по которому запрашиваете помощь.

Кроме того, если вы спрашиваете об ошибке компилятора, сообщите об ошибке дословно. Описание вашего понимания ошибки является богатым источником путаницы. Довольно часто люди неправильно понимают ошибки компилятора. Если они затем описывают свое непонимание, общение прерывается. Сообщите об ошибке компилятора дословно, и тогда не будет никаких причин для недопонимания.

person David Heffernan    schedule 11.01.2016
comment
Спасибо, Дэвид. Где я говорил что-то о дефекте компилятора? Нигде, я бы сказал. Кроме того, код, который я показываю, — это то, что из него сделала Delphi (поместив объявление в приватный раздел). Я сказал, что переместил его в public. - person Joris Groosman; 11.01.2016
comment
Всегда лучше показать код, который вы хотите, чтобы мы прокомментировали. Насколько нам известно, вам не удалось переместить код в публичный раздел. Мне кажется, вы думаете, что у вас есть публичный член, которого не видно. Если вы думаете, что это так, то это дефект компилятора. - person David Heffernan; 11.01.2016

я считаю, что AddLine является частным в каком-то месте в VCL Delphi.

таким образом, попробуйте ИЗМЕНИТЬ пример имени процедуры/метода, одно имя полностью отличается от вашего имени, хе-хе-хе, и вы увидите, как возникает ошибка, проверьте доступ к переменным или объектам в вашем процессе/методе.

или создайте один новый проект для теста

примечание: если ADDLINE является одним из методов MEMO, компилятор не может разрешить то, что вызывается, будет выполнено (я полагаю, что это так)

person emailx45    schedule 14.01.2016