-
Написал компонент. Он занимается строковым поиском и заменой и окно выглядить, как у Дельфи. Сам компонент отлично работает и по нему вопросов нет. Вопросы вот какие: 1) Менюшки (MainMenu, PopupMenu) при создании в DesignTime, у них всегда родитель - это окно? Вроде, в DesignTime всегда родитель окно. 2) Компонент должен ловить момент, когда у текстового редактора меняется свойство Read only. Он и ловит, но почему-то сообщение EM_SETREADONLY TCustomEdit совсем не получает, а получает WM_PAINT. Все отлично работает, но непонятно, почему так.
-
1. Ещё раз попонятнее, ничнго не понял 2. procedure TCustomEdit.SetReadOnly(Value: Boolean);
begin
if FReadOnly <> Value then
begin
FReadOnly := Value;
if HandleAllocated then
SendMessage(Handle, EM_SETREADONLY, Ord(Value), 0);
end;
end
-
Т. е. TCustomEdit должен получить сообщение EM_SETREADONLY? Верно? Я, конечно же, и сам эту процедуру видел. :) Но ApplicationEvent, который именно для этого в моём компоненте создаётся, этого сообщения, адресованного TCustomEdit не видит! Зато ему приходит WM_PAINT. Компонент работает вполне корректно, но мне удивительно просто, почему так! procedure TStReplacer.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean); begin If Assigned(FEditor) then If Msg.hwnd = FEditor.Handle then If Msg.message = WM_PAINT then TestReplaceActionEnability; end; А EM_SETREADONLY ему не поступает. :( 2) А Disigned в каком модуле определён? Что-то я никак в книжке не могу найти. Ему просто в одном обработчике надо сообщите, что компонент изменился. Сам он не догадается, т. к. изменилось поле наследник TList.
-
1. А где вы в коде TCustomEdit.SetReadOnly видите рассылку сообщения на ApplicationEvents ??? 2. Disigned ??? Это что такое ? Редактор Формы ?
-
Я плохо объяснил и сделал опечатку. Disigned ??? //Это имелось в виду Designed.Modified Это что такое ? Редактор Формы ? //Да, это он есть.
Сам компонент - это окно поиска и замены, как в дельфях. А где вы в коде TCustomEdit.SetReadOnly видите рассылку сообщения на ApplicationEvents ??? //Конечно, её там нет. У моего компонента есть свойство Editor: TCustomEdit. Это текстовый редактор, в котором замены и производятся. Но мне надо ловить момент изменения REadOnly, чтобы запрещать замену. Они и ловятся в помощью поля ApplicationEvents компонента. Но почему он (компонент) в обработчике, который написан в этой ветке, в момент изменения ReadOnly получает WM_PAINT, а не EM_SETREADONLY. Остальные вопросы сняты, а вопрос про владельца я вообще задал из-за замороченности. Конечно, у всех компонетов владелец окно.
-
1. У каждой формы в дизайнере существует редактор INTAFormEditor, у которого есть свойство property FormDesigner: DesignIntf.IDesigner read GetFormDesigner; 2. Получить сообщение которое компонент посылает сам себе скорее всего не получится. ApplicationEvents предназначен для другого.
-
ApplicationEvents предназначен для другого. //Ну и ладно. Всё работает. Просто интересно было. Когда TCustomEditor посылает себе сообщение EM_SETREADONLY потом всегда возникает WM_PAINT. Да оно и понятно, почему. Потому что после изменения свойства ему нужно перерисоваться. Вот его-то я и ловлю, поэтому всё и работает.
-
Извините за офтоп. Компонент я все-таки дописал. вот он: http://kupifirmu.com/Replacer/ Посмотрите, кому не сложно. Он проводит поиск и замену в текстовом поле.
-
НЕ ПОНРАВИЛОСЬ: 1. Очень плохо реализована Мультиязычность. 2. Такой код заменяется одним свойством KeyPreview := true procedure TLineNumDialogForm.SpinEdit1KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
If Key = 13 then
If btnOk.Enabled then
Begin
btnOKClick(Sender); ModalResult := btnOK.ModalResult; End;
end; 3. Много юнитов и форм для простенького компонента 4. Не понятно назначение такого кода и ему подобного procedure TLovelyReplacer.ShowDialog;
begin
Inherited;
end; 5. Много Warning [DCC Warning] StrSeacher.pas(458): W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit. 6. В целом не понятна идея создания такого компонента, для личного использования применения найти не могу ПОНРАВИЛОСЬ: 1. Более-менее структуированный код 2. Хорошие :) комментарии 3. Хорошее ООП (иногда даже лишнее) 4. Демка работает без установки компонента и компелиться сразу
-
procedure TLovelyReplacer.ShowDialog; //Забыл выкинуть Много Warning //Странно! У меня он один. И то, сообщает или что результат ф-ции возможно не определён, или, если убираю предупреждение, то появляется хинт, что value assigned to ... never used. Мычался долго и плюнул. 3. Много юнитов и форм для простенького компонента //Он сделан из юнитов и буду дописывать еще один. В целом не понятна идея создания такого компонента //Я его писал для личного использования и [b]идея крайне простая[/b]. Если текстовый редактор, в него грузятся большие файлы, которые в нём и правятся. Все работает уже несколько лет, но вот поиск, а, главное, замена, косячила. ВСе попытки это исправить приводили к другим косякам. Мне это надоело, я решил с этим разобраться отдельно. Написал модуль. Отладил, все работает. А потом решил сделать компонент. 1. Очень плохо реализована Мультиязычность. //А чем плохо? Можно подробнее?
-
Невозможно добавить новый язык не перековыряв все модули
-
Вот языки надо в одном модуле собрать, это верно. Дурацкий код где inhrerited - это не мой косяк. Почему-то Дельфи 7 категорически не хотят без него компилить, говорят, что никак не могут найти процедуру. :( А много модулей, потому что компонентов вообще-то два. Я сегодня втрой дописал.
-
Не может найти наверняка из-за недостаточной видимости
-
Видимость у них Protected у предка и Public у потомка. Вы ж код-то видели.
-
Не может найти наверняка из-за недостаточной видимости //Нет! Из-за чего-то непонятного. Вот кусок кода одного из стандартных модулей (ExtCtrls): procedure TCustomRichEdit.WMNCDestroy(var Message: TWMNCDestroy); begin inherited; end; ИМХО это "особенность" 7-х Дельфей.
-
Нет никакой особенности, в Борланде обычные люди, который тоже делают ошибки
-
>DimaBr. ИМХО, не ошибка, а так с какой-то целью сделано. Ну невозможно ее не заметить, особенно учитывая, что Дельфи на себе же и написаны. Извините за офтоп. Новый компонент я все-таки дописал. вот он: http://kupifirmu.com/Replacer/ Посмотрите, кому не сложно. Он текстовый редактор, в котором можно закладки делать, встроенная поискуха и т.д. >DimaBr. Предвидя всё теже два замечания: 1) Мультиязычность, раскиданную по модулям, не трогал. Дойдут руки, соберу в одном месте, а компонент для дела писал, он мне крайне нужен и это то самое, чего я хотел. 2) Кривой код, когда процедура из одного inherited состоит, мы только что обсудили. :)
|