Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.131.238] |
|
Сообщ.
#1
,
|
|
|
Собственно сабж. Наследую от TDBGrid требуеться скрыть некоторые его свойства, чтобы он их в инспекторе объектов не отображал. Например свойство DataSource. Как это сделать??? Ещё вопрос: как для невизуальных компонентов обработать двойной клик для кинутого на форму компонента???
|
Сообщ.
#2
,
|
|
|
Цитата Demon_ @ Собственно сабж. Понизить видимость свойств и методов нельзя. Можно только переопределить их. Например, установить фиксированное значение и R/O. Цитата Demon_ @ Ещё вопрос: как для невизуальных компонентов обработать двойной клик для кинутого на форму компонента??? Невизуальные компоненты потому и называются невизуальными, что не имеют подобных свойств. |
Сообщ.
#3
,
|
|
|
Демо
1) А как их переопределить??? Что то я пытался - ругаеться, пробывал и override и overload. Цитата Невизуальные компоненты потому и называются невизуальными, что не имеют подобных свойств. Не согласен, простой пример, создай приложение и кинь на него компонент TTable (вкладка BDE) и потом сделай двойной щелчёк по компоненту... Вот и мне надо что то подобное. |
Сообщ.
#4
,
|
|
|
Перенести в private
|
Сообщ.
#5
,
|
|
|
Цитата Demon_ @ Не согласен, простой пример, создай приложение и кинь на него компонент TTable (вкладка BDE) и потом сделай двойной щелчёк по компоненту... Вот и мне надо что то подобное. Это никак не относится к видимости объекта в Runtime. Про DesignTime не было разговора. А про редактор свойств... Ну начни с класса TPropertyEditor - почитай. А лучше купи книгу по созданию компонент. |
Сообщ.
#6
,
|
|
|
Чтобы свойство не редактировать в дизайнере (убрать из инспектора), нобходимо зарегистрировать для этого свойства редактор NIL
RegisterPropertyEditor(TypeInfo(TTypeProperty), TTypeComponent,'NameProperty',nil); Для компонента (не только визуального) двойнок клик вызывает редактор компонента (первый пункт меню). Если такого нет, то генерится первое событие. TMyComponentEditor = class(TComponentEditor) function GetVerb(Index: integer): string; override; function GetVerbCount: integer; override; procedure ExecuteVerb(Index: integer); override; end; function TMyComponentEditor.GetVerb(Index: integer): string; begin // текст для пункта меню case Index of 0: Result := 'MyEditor'; else Result := inherited GetVerb(Index); end;{case} end; function TMyComponentEditor.GetVerbCount: integer; begin // количество пунктов меню Result := inherited GetVerbCount + 1; end; procedure TMyComponentEditor.ExecuteVerb(Index: integer); begin // действия, при выборе пункта case Index of 0: ;// MyActions else inherited ExecuteVerb(Index); end;{case} end; |
Сообщ.
#7
,
|
|
|
Цитата DimaBr @ function TMyComponentEditor.GetVerb(Index: integer): string; begin // текст для пункта меню case Index of 0: Result := 'MyEditor'; else Result := inherited GetVerb(Index - 1); end;{case} end; function TMyComponentEditor.GetVerbCount: integer; begin // количество пунктов меню Result := inherited GetVerbCount + 1; end; procedure TMyComponentEditor.ExecuteVerb(Index: integer); begin // действия, при выборе пункта case Index of 0: ;// MyActions else inherited ExecuteVerb(Index - 1); end;{case} end; |
Сообщ.
#8
,
|
|
|
Читаю статью FAQ по переходу на Delphi
http://faqs.org.ru/progr/pascal/del_migr.htm : Цитата Почему употребляется строка присваивания MyObject.MyValue:=10;? Автор подразумевает, что свойство MyValue не находится в разделе privat и его можно изменять таким прямым способом? Это половина того, что нам необходимо знать для осознания того, что такое Event. Вторая требуемая половина -- это понятие Property(свойство). Как гласит старинный принцип ООП, все действия с полями объекта должны осуществляться только через методы этого объекта.Property -- практическое воплощение этого принципа. Стандартное описание свойства (Property): property MyValue:Integer read GetValue write PutValue; определяет, что чтение целочисленной (Integer) величины MyValue будет осуществляться через функцию function GetValue:Integer; а запись -- будет производится процедурой procedure PutValue(Value:Integer); Разумеется функция GetValue и процедура PutValue должны быть описаны как методы того же класса. После подобного описания свойства MyValue, команда MyObject.MyValue:=10; вызовет процедуру PutValue с параметром 10. Разумеется, переданное процедуре значение желательно сохранять,поэтому стандартный вид процедуры PutValue: procedure TMyObject.PutValue(Value:Integer); begin FValue:=Value; {Любые дополнительные действия} end; где FValue -- поле класса TMyObject, определенное, как правило в private секции (чтобы быть недоступной "пользователю"). Аналогичные действия происходят и при обращении ResultValue:=MyObject.MyValue. Соответственно, функция GetValue описывается как function TMyObject.GetValue:Integer; Откуда нарисовалась буква F у слова Value? |
Сообщ.
#9
,
|
|
|
обычно геттер и сеттер(GetValue/PutValue) описываются в private-секции(изредка в protected) класса, а само свойство в public/published секции...
в результате, программисту и спользующему класс доступно только свойство FValue это внутреннее поле класса которое модифицируется/читается с помощью методов GetValue/PutValue возможно также следующее описание свойства: property MyValue:Integer read GetValue write FValue; и property MyValue:Integer read FValue write PutValue; |