Форум: "Компоненты";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
ВнизCaption у компонента Найти похожие ветки
← →
Sedik (2006-08-03 10:14) [0]Добрый день!
Создаю компонент
TMyComponent = class(TWinControl)
private
FLabel: TLabel;
function GetCaption: string;
procedure SetCaption(const Value: string);
public
constructor Create(AOwner: TComponent); override;
published
property Caption: string read GetCaption write SetCaption;
end;
...
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
FLabel := TLabel.Create(self);
FLabel.Parent := self;
end;
function TMyComponent.GetCaption: string;
begin
Result := FLabel.Caption;
end;
procedure TMyComponent.SetCaption(const Value: string);
begin
FLabel.Caption := Value;
end;
Теперь свойство Caption у компонента изменится только после того, как мы в инспекторе объектов в Caption введем строку и нажмем Enter. А как сделать, чтобы Caption менялся после изменения каждого символа (без нажатия Enter) в инспекторе объектов, как например у компонента TLabel?
← →
DimaBr (2006-08-03 12:00) [1]зарегистрировать для свойства соответствующий редактор
TMyCaptionProperty = class(TStringProperty)
function GetAttributes: TPropertyAttributes;override;
end;
function TMyCaptionProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paAutoUpdate];
end;
RegisterPropertyEditor(TypeInfo(string), TMyComponent, "Caption", TMyCaptionProperty);
← →
Юрий Зотов © (2006-08-03 14:27) [2]Или просто заменить у свойства тип string на TCaption.
:о)
← →
DimaBr (2006-08-03 14:38) [3]
> Юрий Зотов ©
Некоторые библиотеки переопределяют стандартные редакторы для стандартных свойств. Поэтому, нет гарантии что поможет.
← →
Юрий Зотов © (2006-08-03 14:51) [4]> DimaBr (03.08.06 14:38) [3]
Если не поможет, то очень хорошо. Это выявит тот печальный факт, что в IDE инсталлирована библиотека, самое подходящее место для которой - Recycled Bin. Куда ее и надлежит немедленно отправить.
:о)
← →
DimaBr (2006-08-03 15:03) [5]Согласен. Хотя и не факт. Может редактрор покруче придумали.
← →
Юрий Зотов © (2006-08-03 15:39) [6]> DimaBr (03.08.06 15:03) [5]
Может, и придумали. Но любой редактор, пусть и самый крутой, раз уж его авторы берут на себя такую ответственность и, даже не спрашивая юзера, регистрируют его для всех компонентов разом - такой редактор обязан, как минимум, обеспечивать стандартное, всем привычное поведение свойств. Сверх того - что угодно, но стандарт обязан поддерживаться. А если он не поддерживается - уж извините, но тогда будьте добры регистрировать свой редактор только для своей же библиотеки, не трогая генофонда и не сбивая с толку беднягу юзера.
А если авторы редактора не соблюдают ни того, ни другого - значит, это не серьезные разработчики, а юные пионэры, только что научившиеся писать редакторы свойств и горящие неуемным желанием показать всему миру свою необычайную крутизну. Ламеры, то есть. Соответственно, доверия к их библиотеке - никакого, а потому место ей - в Recycled Bin, а не в IDE.
← →
DimaBr (2006-08-03 15:58) [7]Установил себе Raize 4.
Для TImageList - новый редактор. Лично мне абсолютно не нравится.
Для TCaption - редактор как для TStrings.
Плюс в Popup меню многих компонентов и формы в том числе добавлены новые пункты. Это вы считаете правильно. Или тоже не серьёзная фирма ?
← →
Юрий Зотов © (2006-08-03 16:30) [8]> DimaBr (03.08.06 15:58) [7]
> Установил себе Raize 4. ... Или тоже не серьёзная фирма?
Raize - это Конопка. Это вполне серьезно. Но разберем по пунктам - а что же, собственно, изменилось?
> Для TImageList - новый редактор. Лично мне абсолютно не нравится.
Нравится или нет - дело вкуса. Главное, что старая функциональность сохранена (а она, безусловно, сохранена).
> Для TCaption - редактор как для TStrings.
В стандарте D7 он тоже многострочный, тут ничего нового.
> Плюс в Popup меню многих компонентов и формы в том числе добавлены
> новые пункты. Это вы считаете правильно.
Если старые пункты сохранены и только добавлены новые - то правильно. Не сомневаюсь, что так оно и есть. Когда-то я тоже добавлял к popup-меню всех форм свой пункт, он был реально нужен. Не трогая, естественно, другие пункты.
============================
Что имеем в итоге? То, что старое поведение сохранено. Вполне нормальное решение.
Еще есть подозрение, что если покопаться в настройках библиотеки, то там вполне может обнаружиться птичка (или $DEFINE) типа "Use extended editors". Отключив которую, возвращаемся к стандартным редакторам.
Впрочем, даже если такой птички и нет, то правильная идеология все равно соблюдена: стандарт поддерживается, а сверх него - что угодно. В случае же, когда для TCaption всех компонентов регистрируется редактор, не поддерживающий стандартного поведения, дело обстоит совсем иначе - и тогда я буду настаивать на "юной пионеристости" и Recycled Bin.
← →
StriderMan © (2006-08-04 16:48) [9]
> Юрий Зотов © (03.08.06 16:30) [8]
> > Для TCaption - редактор как для TStrings.
> В стандарте D7 он тоже многострочный, тут ничего нового
Разве?
А Я всю жизнь многострочные лэйблы в DFM лезу править...
← →
Юрий Зотов © (2006-08-04 18:22) [10]> StriderMan © (04.08.06 16:48) [9]
Прислать скриншот?
:о)
← →
StriderMan © (2006-08-04 18:31) [11]> Юрий Зотов © (04.08.06 18:22) [10]
да, если не сложно :)
Че-то не догоняю. У меня Caption редактируется в Object Inspector"е в одной строчке, как там несколько строк сделать?
← →
DimaBr (2006-08-04 18:46) [12]
> как там несколько строк сделать?
Зарегистрировать соответствующий редактор.
← →
StriderMan © (2006-08-04 18:51) [13]
> DimaBr (04.08.06 18:46) [12]
я вот о чем:
> Юрий Зотов © (03.08.06 16:30) [8]
> > Для TCaption - редактор как для TStrings.
> В стандарте D7 он тоже многострочный, тут ничего нового
← →
Юрий Зотов © (2006-08-04 18:57) [14]Вот так раз! - а ведь Вы правы. У меня действительно редактор Caption многострочный, но только что на всякий проверил - и вдруг совершенно неожиданно выяснилось, что его и в самом деле регистрирует одна из установленных библиотек. Если ее деинсталлировать, редактор становится однострочным.
А я-то даже не подозревал об этом и честно считал, что это стандартный редактор. Что ж, приношу извинения за ошибку, а в качестве компенсации могу наваять и выслать многострочный редактор для стринговых свойств.
:о)
← →
Юрий Зотов © (2006-08-05 15:23) [15]Вот обещанный редактор. Получилось проще никуда его не выкладывать, а опубликовать прямо здесь, в исходниках. Добавьте этот модуль к любому design-time пакету (или создайте новый пакет) и перекомпилируйте его.
В путях поиска пакета должен быть указан каталог
$(DELPHI)\Source\Property Editors
а в его секции requires должна быть ссылка на DesignIDE.dcp
Приводимый вариант регистрирует редактор для всех свойств Caption и Hint. Если нужно что-то добавить/изменить - правьте процедуру Register.
Тестировалось в Delphi 7, но должно работать во всех версиях Delphi (возможно, придется подправить имена модулей в uses и изменить указанный выше путь поиска)
unit YzStrPropEdit;
interface
uses
DesignIntf, DesignEditors;
type
TYzStringProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;
procedure Register;
implementation
uses
Controls, Forms, StringsEdit;
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TCaption), nil, "Caption", TYzStringProperty);
RegisterPropertyEditor(TypeInfo(string), nil, "Hint", TYzStringProperty)
end;
{ TYzStringProperty }
procedure TYzStringProperty.Edit;
var
S: string;
begin
with TStringsEditDlg.Create(Application) do
try
Memo.Lines.Text := GetStrValue;
if ShowModal = mrOK then
begin
S := Memo.Lines.Text;
while (Length(S) > 0) and (S[Length(S)] in [ #10, #13]) do
SetLength(S, Length(S) - 1);
SetStrValue(S)
end
finally
Free
end
end;
function TYzStringProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paAutoUpdate, paDialog]
end;
end.
← →
DimaBr (2006-08-07 10:31) [16]
> и вдруг совершенно неожиданно выяснилось, что его и в самом
> деле регистрирует одна из установленных библиотек
Если не секрет, поделитесь методом выяснения...
← →
Юрий Зотов © (2006-08-07 11:02) [17]> DimaBr (07.08.06 10:31) [16]
Имя оконного класса формы Delphi совпадает с именем самого класса формы. Поэтому:
1. Запускаем любой WinSpy и им выясняем класс окна редактора
2. Запускаем поиск этого имени в PAS-файлах и смотрим код.
← →
DimaBr (2006-08-07 11:17) [18]Это при условии, что Pas файлы есть.
← →
DrPass © (2006-08-08 10:13) [19]
> DimaBr (07.08.06 11:17) [18]
> Это при условии, что Pas файлы есть.
Можешь искать не в pas, а в dcu. Результат будет тот же
← →
Яся (2006-08-08 15:30) [20]
> RegisterPropertyEditor(TypeInfo(string), nil, "Hint", TYzStringProperty)
регистрация для ВСЕХ свойств типа string
К сожалению, если не указан тип компонента, PropertyName не оказывает никакого влияния на ограничение применения редактора.
← →
Юрий Зотов © (2006-08-08 17:05) [21]> Яся (08.08.06 15:30) [20]
Гы... да разве ж это проблема? Наоборот, истинному component writer"у всякие заморочки должны быть только в кайф.
:о)RegisterPropertyEditor(TypeInfo(string), TPersistent, "Hint", TYzStringProperty)
← →
Яся (2006-08-09 08:57) [22]:)
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.049 c