Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Когда отправлять сообщения контролам


Автор: safright 15.8.2008, 23:52
Столкнулся с ситуацией - нужно посылать сообщения оконным элементам, но! В Create это делать нельзя - нету дескриптора; делать это, например, в при обработке WM_PAINT - неудобно, ибо тормозит сильно, да и зачем одно и то же сообщение отправлять много раз, если одного достаточно?..

пока все, до чего я додумался:
Код

procedure TCProgressBar.SetParent(AParent: TWinControl);
begin
    Inherited;
// если поместить в Create, ошибка "Control '' has no parent"
// проверка, т.к. при уничтожении обычно выставляется FParent := nil;
    if AParent <> nil then SetColor($D36F6C);
end;

procedure TCProgressBar.SetColor(AColor: TColor);
begin
    if AColor <> FColor then begin
        FColor := AColor;
        SendMessage(Handle, PBM_SETBARCOLOR, 0, AColor); //сообщение на изменение цвета
    end;
end;

Автор: BaD_SeCt0R 16.8.2008, 15:36
Не пробовал в OnShow?
Например:
Код

procedure TForm1.FormShow(Sender: TObject);
begin
  SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clRed);
end;

Автор: safright 16.8.2008, 18:55
Э, врядли - OnShow вызывается, если форма была Hide, что немного опасно: 1. не факт, что в Create не прописано FShow:=true, т.е. что Show вообще при создании взываться не будет; 2. это событие связано с показом/прятаньем окна, а мне нужна секция инициализации, т.к. это сообщение, если я правильно понял, просто изменяет значение цвета кисти... 
Идеальный вариант - если окно посылает родителю message "я создался и получил дескриптор"... Тады его перехватить и в кусты!  smile 

Автор: BaD_SeCt0R 17.8.2008, 00:30
Цитата(safright @  16.8.2008,  18:55 Найти цитируемый пост)
это событие связано с показом/прятаньем окна

Дык если окно не покажется, прогресбар вроде как и тоже smile Событие вызывается действительно при каждом показе формы. Нет универсального сообщения о создании контрола до перерисовки, иначе тебе придется переписывать метод рисования самого прогрессбара.

Автор: safright 17.8.2008, 10:51
Ладно, наверн я неправильно объясняю...
Я изменил обработку WM_PAINT (т.е. inherited+что-то свое), но думал, что необходимо все это еще и инициализировать. В общем - бага была в том, что все property компонента выставляются автоматом, при его создании(если они, конечно, указаны в редкторе свойств). Иными словами - я слишком перестраховался... Но эт только в данном случае.

З.Ы. все еще вопрос - есть событие типа HANDLECREATED (или как-то так)?

Автор: BaD_SeCt0R 17.8.2008, 11:31
Цитата(safright @  17.8.2008,  10:51 Найти цитируемый пост)
З.Ы. все еще вопрос - есть событие типа HANDLECREATED (или как-то так)?

перепиши конструктор

Автор: safright 17.8.2008, 16:46
 smile 
В конструкторе дескриптор окна получить невозможно, собственно - откуда и ноги у вопроса растут  smile 

Автор: Rennigth 18.8.2008, 10:44
Цитата(safright @  17.8.2008,  16:46 Найти цитируемый пост)
В конструкторе дескриптор окна получить невозможно, собственно - откуда и ноги у вопроса растут    

HandleNeeded?

Код

  procedure Loaded; override;

попробуй smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)