Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Property со сложным типом, Как контролировать это property 
:(
    Опции темы
Traum
Дата 2.9.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.1.2004

Репутация: нет
Всего: нет



В качестве примера возьмем тип TMemo:

Код

type TMemo = class(...);

  private

     FLines: TStrings;
     ...

  public
     ...
     property Lines:TStrings read FLines write SetLines;
     ...

end;


Если я что-либо присваиваю Lines, то TMemo через метод SetLines будет в курсе происходящего. А если я, получив ссылку на FLines посредством доступа read, использую методы и свойства TStrings и тем самым модифицирую FLines, то как TMemo знает, что творится с его Flines?
PM MAIL   Вверх
Snowy
Дата 2.9.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Это потому что Lines у Memo это не TStringList, а свой класс, который тоже следит за тем, что у него там творится.
PM MAIL   Вверх
MetalFan
Дата 2.9.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Traum @  2.9.2007,  19:49 Найти цитируемый пост)
А если я, получив ссылку на FLines посредством доступа read, использую методы и свойства TStrings и тем самым модифицирую FLines

смотри кишки vcl StdCtrls.TMemoStrings
наследники TStrings разные бывают)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Esperito
Дата 2.9.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Код

constructor TCustomMemo.Create(AOwner: TComponent);
begin
  ...
  TMemoStrings(FLines).Memo := Self;
  ...
end;

Таким образом, FLines всё знает про Memo, ибо TMemoStrings для такого и заточена.
PM MAIL   Вверх
lukas
Дата 2.9.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Код

type TMemo = class(...);
  private
     FLines: TStringList;
     ...
  public
     ...
     property Lines:TStrings read FLines write SetLines;
     ...
end;


Используй для этих целей TStringList, не абстрактный класс... а TStrings - это абстрактный класс... 


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Traum
Дата 2.9.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.1.2004

Репутация: нет
Всего: нет



Спасибо, с Memo ясно. 

Но вопрос остался для меня не ясным: TMemo я привел в качестве примера. Я хочу создать свой тип, при этом хочу быть в курсе происходящего и контролировать модификации поля FComplex :

Код

type TMyType = class
  
  private

     FComplex : TSomeComplexType;
     ...
  public
    ...
    property Complex : TSomeComplexType read FComplex ; 

end;


Есть ли возможность контролировать произвол модификации поля FComplex, который возможен благодаря методам и свойств TSomeComplexType?

Вариант - не давать этого property и дублировать в public методы и свойства TSomeComplexType - не очень привлекателен

Ответ Esperito наводит на мысль что стоит делать так: FComplex объявить как переменную типа TSomeComplexType, но для TSomeComplexType создать наследника, заточенного под себя, и создавать FComplex методом этого наследника. Возможно этим мой вопрос закрыт

 

Это сообщение отредактировал(а) Traum - 2.9.2007, 22:38
PM MAIL   Вверх
Snowy
Дата 2.9.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Если поле - класс, то он должен сам себя контролировать.
Если требуется уведоблять класс-владелец, то заведи события для этого.
PM MAIL   Вверх
Esperito
Дата 3.9.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Сделай так:
Код

type
  TMyType = class
  private
    FComplex : TSomeComplexType;
    function GetComplex: TSomeComplexType;
    procedure SetComplex(const Value: TSomeComplexType);
  public
    property Complex: TSomeComplexType read GetComplex write SetComplex;
  end;

PM MAIL   Вверх
Traum
Дата 3.9.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.1.2004

Репутация: нет
Всего: нет




Общие вопросы новичка в области программирования:

1. Если пользователю предоставляется набор инструментов, то он вправе думать, что он вправе их все использовать?. Тогда
Если в рамках примера с TMemo есть возможность запустить команду TMemo.Lines.Free, которая уничтожает объект, на который указывает поле FLines, то пользователь может полагать что это не зря так допущено?

2. Верно ли что ни в DelphiLanguageGuide, ни DevelopersGuide, ни в русских учебниках или статьях (даже здесь на форуме  smile ), где описывается что такое ООП и как его использовать, не дается ни каких указаний как надежно и контролируемо организовывать prperty со сложными, уже имеющимися типами (например TEdit, TStringList и т.п.).

Esperito, 
Разве может function GetComplex: TSomeComplexType ограничить возможности, предоставляемые TSomeComplexType, и контролировать их использование?


Snowy,
//Если требуется уведоблять класс-владелец, то заведи события для этого. //

Но эти события у TSomeComplexType будут в public и что получится, если пользователь через предоставленное ему property присвоит этим событиям свои процедуры, тогда TMyType остается только надеяться, что пользователь этого не сделает, а если сделает, так пусть винит сам себя, когда будет пытаться понять в чем же глюк?




PM MAIL   Вверх
Snowy
Дата 3.9.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата(Traum @  3.9.2007,  20:13 Найти цитируемый пост)
Но эти события у TSomeComplexType будут в public
Они будут там, где ты их объявишь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.