Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2012, 14:38   #1
Aleks26
 
Регистрация: 09.10.2010
Сообщений: 5
Вопрос Присваивание ссылки на класс интерфейсной ссылке

Объясните мне кто-нибудь такую непонятную для меня ситуацию:
у меня определен один интерфейс и один класс, его реализующий
Код:
unit UseInterface;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
 Imessages = interface(IInterface)
  procedure Message1;
 end;

 TClassWithMessages = class(TInterfacedObject, Imessages)
  procedure Message1;
 end;
На форме просто поле ввода Edit1 и кнопка Button1.

В описательной части модуля:
Код:

procedure TClassWithMessages.Message1;
begin
 ShowMessage('Выполнена процедура Message1');
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
 clm1: Imessages;
 classmes1: TClassWithMessages;
begin
 if (Key=#13) and (Edit1.Text <> '') then
  begin
   classmes1 := TClassWithMessages.Create;
   clm1 := classmes1;
   clm1.Message1;
   Button1.SetFocus;
  end;
end;
После оператора Create переменная classmes1 нормально идентифицируется. А после выделенного оператора присваивания, в Наблюдателе clm1 нормальная, а около classmes1 выдается сообщение: "Variable 'classmes1' inaccessible here due to optimization". Почему после простого присваивания ссылка на класс, которую я присвоил становится недоступной?
Aleks26 вне форума Ответить с цитированием
Старый 11.04.2012, 16:33   #2
RinatV
Пользователь
 
Регистрация: 06.07.2009
Сообщений: 27
По умолчанию

Аналогичная ситуация http://programmersforum.ru/showthread.php?t=195525
только отображается в watch, а не на всплывающей подсказке значения.
Если все таки охото посмотреть локальные переменные функций, то отключите оптимизацию при компиляции. В Delphi 7 это Project -> Options... -> Complier убрать галочку с Optimization в группе Code optimization.
RinatV вне форума Ответить с цитированием
Старый 11.04.2012, 16:35   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

не недоступной, а просто отладчик в силу своей тупости не может найти ее значение
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 11.04.2012, 16:39   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

причем тут отладчик?
это черта оптимизатора, а он видит что дальше переменная не нужна, потому и убирает её(переменную, но не объект).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.04.2012, 18:43   #5
Aleks26
 
Регистрация: 09.10.2010
Сообщений: 5
По умолчанию

Большое спасибо за ответы. Главное, я уяснил, что это не какая-то моя ошибка, а примочки компилятора.
Aleks26 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Присваивание BastAngel Компоненты Delphi 2 01.02.2012 14:35
Excel не сохраняет ссылки на .jpg, если в ссылке есть русские символы KOM-STAR Microsoft Office Excel 5 06.04.2010 20:45
Передача ссылки в функцию класса на данный класс Impuls1989 Общие вопросы C/C++ 17 09.01.2010 17:21