Конференция "Компоненты" » Вопрос по Design time
 
  • TStas (03.05.12 13:58) [0]
    Написал компонент. Он занимается строковым поиском и заменой и окно выглядить, как у Дельфи. Сам компонент отлично работает и по нему вопросов нет. Вопросы вот какие:
    1) Менюшки (MainMenu, PopupMenu) при создании в DesignTime, у них всегда родитель - это окно? Вроде, в DesignTime всегда родитель окно.
    2) Компонент должен ловить момент, когда у текстового редактора меняется свойство Read only. Он и ловит, но почему-то сообщение EM_SETREADONLY TCustomEdit  совсем не получает, а получает WM_PAINT. Все отлично работает, но непонятно, почему так.
  • DimaBr © (03.05.12 16:33) [1]
    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

  • TStas (03.05.12 22:52) [2]
    Т. е. 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.
  • DimaBr © (04.05.12 08:52) [3]
    1. А где вы в коде TCustomEdit.SetReadOnly видите рассылку сообщения на ApplicationEvents ???
    2. Disigned ???  Это что такое ? Редактор Формы ?
  • TStas (05.05.12 21:17) [4]
    Я плохо объяснил и сделал опечатку.
    Disigned ??? //Это имелось в виду Designed.Modified
    Это что такое ? Редактор Формы ? //Да, это он есть.

    Сам компонент - это окно поиска и замены, как в дельфях.
    А где вы в коде TCustomEdit.SetReadOnly видите рассылку сообщения на ApplicationEvents ??? //Конечно, её там нет. У моего компонента есть свойство Editor: TCustomEdit. Это текстовый редактор, в котором замены и производятся. Но мне надо ловить момент изменения REadOnly, чтобы запрещать замену. Они и ловятся в помощью поля ApplicationEvents компонента. Но почему он (компонент) в обработчике, который написан в этой ветке, в момент изменения ReadOnly получает WM_PAINT, а не EM_SETREADONLY.
    Остальные вопросы сняты, а вопрос про владельца я вообще задал из-за замороченности. Конечно, у всех компонетов владелец окно.
  • DimaBr © (07.05.12 09:21) [5]
    1. У каждой формы в дизайнере существует редактор INTAFormEditor, у которого есть свойство
    property FormDesigner: DesignIntf.IDesigner read GetFormDesigner;



    2. Получить сообщение которое компонент посылает сам себе скорее всего не получится. ApplicationEvents предназначен для другого.
  • TStas (07.05.12 20:19) [6]
    ApplicationEvents предназначен для другого. //Ну и ладно. Всё работает. Просто интересно было. Когда TCustomEditor посылает себе сообщение EM_SETREADONLY потом всегда возникает WM_PAINT. Да оно и понятно, почему. Потому что после изменения свойства ему нужно перерисоваться. Вот его-то я и ловлю, поэтому всё и работает.
  • TStas (07.05.12 23:37) [7]
    Извините за офтоп. Компонент я все-таки дописал. вот он:  http://kupifirmu.com/Replacer/ Посмотрите, кому не сложно. Он проводит поиск и замену в текстовом поле.
  • DimaBr © (08.05.12 10:55) [8]
    НЕ ПОНРАВИЛОСЬ:
    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. Демка работает без установки компонента и компелиться сразу
  • TStas (08.05.12 12:06) [9]
    procedure TLovelyReplacer.ShowDialog; //Забыл выкинуть
    Много Warning //Странно! У меня он один. И то, сообщает или что результат ф-ции возможно не определён, или, если убираю предупреждение, то появляется хинт, что value assigned to ... never used. Мычался долго и плюнул.
    3. Много юнитов и форм для простенького компонента //Он сделан из юнитов и буду дописывать еще один.
    В целом не понятна идея создания такого компонента //Я его писал для личного использования и [b]идея крайне простая[/b]. Если текстовый редактор, в него грузятся большие файлы, которые в нём и правятся. Все работает уже несколько лет, но вот поиск, а, главное, замена, косячила. ВСе попытки это исправить приводили к другим косякам. Мне это надоело, я решил с этим разобраться отдельно. Написал модуль. Отладил, все работает. А потом решил сделать компонент.
    1. Очень плохо реализована Мультиязычность. //А чем плохо? Можно подробнее?
  • DimaBr © (08.05.12 12:31) [10]
    Невозможно добавить новый язык не перековыряв все модули
  • TStas (10.05.12 01:01) [11]
    Вот языки надо в одном модуле собрать, это верно. Дурацкий код где inhrerited - это не мой косяк. Почему-то Дельфи 7 категорически не хотят без него компилить, говорят, что никак не могут найти процедуру. :(
    А много модулей, потому что компонентов вообще-то два. Я сегодня втрой дописал.
  • DimaBr © (10.05.12 16:47) [12]
    Не может найти наверняка из-за недостаточной видимости
  • TStas (11.05.12 16:37) [13]
    Видимость у них Protected у предка и Public у потомка. Вы ж код-то видели.
  • TStas (19.05.12 01:17) [14]
    Не может найти наверняка из-за недостаточной видимости //Нет! Из-за чего-то непонятного. Вот кусок кода одного из стандартных модулей (ExtCtrls):
    procedure TCustomRichEdit.WMNCDestroy(var Message: TWMNCDestroy);
    begin
     inherited;
    end;
    ИМХО это "особенность" 7-х Дельфей.
  • DimaBr © (20.05.12 23:06) [15]
    Нет никакой особенности, в Борланде обычные люди, который тоже делают  ошибки
  • TStas (23.05.12 15:28) [16]
    >DimaBr. ИМХО, не ошибка, а так с какой-то целью сделано. Ну невозможно ее не заметить, особенно учитывая, что Дельфи на себе же и написаны.
    Извините за офтоп. Новый компонент я все-таки дописал. вот он:  http://kupifirmu.com/Replacer/ Посмотрите, кому не сложно. Он текстовый редактор, в котором можно закладки делать, встроенная поискуха и т.д.
    >DimaBr. Предвидя всё теже два замечания: 1) Мультиязычность, раскиданную по модулям, не трогал. Дойдут руки, соберу в одном месте, а компонент для дела писал, он мне крайне нужен и это то самое, чего я хотел. 2) Кривой код, когда процедура из одного inherited состоит, мы только что обсудили. :)
 
Конференция "Компоненты" » Вопрос по Design time
Есть новые Нет новых   [134427   +34][b:0][p:0.002]