Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.042 c
2-1179129401
Leshas0
2007-05-14 11:56
2007.06.03
поиск подстроки POS


11-1160746037
Psychedelic
2006-10-13 17:27
2007.06.03
Мигание формы при установке Alphablend


15-1178619022
Jeer
2007-05-08 14:10
2007.06.03
В память о войне


1-1176109496
Rif
2007-04-09 13:04
2007.06.03
Продвинутая статистика в Дельфи


15-1178828840
РТР
2007-05-11 00:27
2007.06.03
Посоветуйте пожалуйста socs5 - прокси сервер под винду