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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2012, 19:18   #1
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
Стрелка Аксессор, использующий поле из объекта

Всем Доброго.

Есть потребность : объектов может быть много, но они все некоего базового типа (Tobjtype), которым инициализируются в конструкторе.

Код:
TObjType = class(TObject);
name: string;
end;

Tobj = class(TObject)
  private
    ObjType: TObjType;
    function GetName: String;
  public
    property Name: String read ObjType.Name; // ашыпка, насяльника
  end;
Дельфи7 ругает меня: Record, object or class type required
и вынуждает меня использовать
Код:
property Name: String read GetName;
//...impl
function TObj.GetName: String;
begin
  Result := ObjType.Name;
end;
Как несложно догадаться, полей там много, код некисло распух этими геттерами.
В то же время если сделать обжтайп рекордом – без вопросов всё работает (ну компилит, в рантайме бы ещё надо проверить), но мне-то ессно надо класс. (объектом, устаревшим типом, не пробовал, но и не хочется)
Менять область видимости - нет результата.

Внимание, вопрос, если дельфи в принципе ожидает, что я могу задействовать там объект класса (см. текст ошибки, в хелпнике по данному тексту другое дело описано), то почему не даёт сделать... ?

Гуглил, там всё нубо-ошибки, которые как раз кейсы описанные в хелпе..

Уверьте хоть меня, что я раб дельфей, и раз она велит не писать таких аксессоров, то и не рыпаться.

Но хочется таки элегантности

Ну, иль может кто вообще пнёт меня за построенное, и поделится мыслью по высокой архитектуре. (разве что про наследование не хотел бы слышать, ибо не нравится мне дублирование, да и пробовал, в данном проекте не пошло)

Последний раз редактировалось phomm; 19.06.2012 в 19:28.
phomm вне форума Ответить с цитированием
Старый 19.06.2012, 19:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну а просто раба дельфей не устраивает
Код:
    FObjType: TObjType;
    ...
    property ObjType: TObjType read FObjType;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.06.2012, 20:08   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

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

Про раба имелось ввиду в контектсе текущей проблемы )) так то вроде я сильнее её )
phomm вне форума Ответить с цитированием
Старый 19.06.2012, 20:16   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

когда много отднотипных пропертей, иногда я делаю типа такого:

Код:
  TObj = class
  private
    ObjType: TObjType;
    //
    function GetStrProp(index: integer): String;
  public
    property Name: String index 0 read GetStrProp; // 
  end;


    function TObj.GetStrProp(index: integer): String;
    begin
      case (index) of

        0: result := ObjType.Name;

        else
          result := '';

      end;
    end;
один метод на все строковые свойства, меняется только индекс. Для целых и других типов нужен ещё метод.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.06.2012, 21:56   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Да, метод с индексами я знаю, но мне в данной задаче видится он малость костыльным.. нужен учет индексов..
Я думаю может вообще свойства все обернуть в списки, адресуемые енумами.. и уж написать геттер на енумах, но пока надеялся на сабж, просто может я чего не догоняю..
Прикол как раз в том, что дельфи сама говорит можно и сама же нельзя..
phomm вне форума Ответить с цитированием
Старый 19.06.2012, 22:02   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
type
  TObjType = object
    name: string;
  end;

  Tobj = class(TObject)
  private
    ObjType: TObjType;
  public
    property Name: String read ObjType.Name;
  end;
ну вот такое компилируется. А слово class из сообщения об ошибке в XE2 уже убрали )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.06.2012, 22:49   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Да, я подозревал, что объекты будут работать, рекорды же работают...
но объекты я конечно использовать не собираюсь...
То что они убрали, это они молодцы, оперативно работают )

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

Мне кажется, что невозможность сего действа обусловлена именно размещением экземпляров классов в куче, в неизвестном на этапе компиляции адресном пространстве, посему компайлер, не знает как прописать обращение таким аксессором, а вот рекорды и объекты, они же получается физически вместе с self лежат, посему компайлер просто в смещение это преобразует...
phomm вне форума Ответить с цитированием
Старый 19.06.2012, 23:00   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
компайлер, не знает как прописать обращение таким аксессором
да всё он знает, типа "в реализации геттера знаю, а тут не знаю". просто не очень красиво это выглядит и сильно перегружает синтаксис. А то и до такого можно дойти:

Код:
  property name: string read someObj.Items[3].LastName.Upper();
это всё-таки паскаль, язык для начинающих )

по-сути, проще опубликовать внутренний объект и не заморачиваться.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.06.2012, 23:37   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Ну да по идее, в реализации геттера он знает, хотя кто его знает )) может он строит вызовы через указатель на указатель, тем более там вмт, которая сама по себе сложная, а аксессор всё же простой переходничок обычно.
Ну а насчет перегружает синтаксис - с рекордами же "не перегружает", я ведь и в рекорде могу навертеть вложенную иерахию (кстати, надо бы проверить как получится ))))

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

А вот насчет исправили ошибку я малость не понял, хе2 не стоит, вживую не смогу лицезреть, но вот амбар-сайт говорит http://docwiki.embarcadero.com/RADSt...quired_(Delphi) может скрин найдётся, для удовлетворения любопытства моего, ибо качать и ставить как-то не резон )

Последний раз редактировалось phomm; 19.06.2012 в 23:40.
phomm вне форума Ответить с цитированием
Старый 19.06.2012, 23:40   #10
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Хочется пропертю отдельную, почти для каждого поля из обжтипа, на этом основная цель обжтипа и зиждется.
Видимо поиграться вам захотелось...время потратить...
Код:
TObjType = class(TObject);
name: string;
end;

Tobj = class(TObject)
  private
    FObjType: TObjType;
  public
    property ObjType: TObjType read FObjType; // либо же через GetObjType()
  end;
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бъет ли ферзь, установленный в поле (k, l) поле (m, n). Antua Помощь студентам 5 24.03.2012 12:03
Как из простого мемо записать в поле БД Access в поле тоже типа мемо с сохранением всех абзацев пробелов Speeker БД в Delphi 2 28.11.2011 16:22
Уникальное поле и поле счетчик в IBexpert Ist Помощь студентам 4 28.05.2011 09:14
Откомпилировать исходник использующий vcl50.bpl Человек_Борща Общие вопросы Delphi 5 14.11.2010 21:55
После ввода в поле по Enter нужно перейти на другое поле! •ScReam•™ Помощь студентам 2 16.06.2009 08:47