Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.037 c
15-1178706726
Галинка
2007-05-09 14:32
2007.06.03
А как ноныче делаются блок-схемы ??


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


2-1179105701
Ale][andr
2007-05-14 05:21
2007.06.03
Открытие файла


15-1177673583
Kerk
2007-04-27 15:33
2007.06.03
Умер Патриарх Алексий второй


2-1178898796
M1sT
2007-05-11 19:53
2007.06.03
Ошибка при выполении SQL запроса....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский